ビッグデータ全体のスタックマスタークラッシュ--Spark2.0(フルプロジェクトの戦闘シーン)

スパークについて

     スパーク結合糸を容易にかつ直接データ上にHDFS、HBaseのを呼び出し、Hadoopを結合することができます。設定は簡単です。

     Hadoopのより柔軟かつ実用的な、迅速な開発フレームワークを火花。処理遅延を低減し、性能効率と実用的な柔軟性を改善します。これは、効果的にお互いとのHadoopと組み合わせることができます。 

     RDDのコアに火花。スパークSQL、スパークストリーミング、MLlib、GraphXは、スパークRと他のコアコンポーネントは、その完璧なフレーム日は人気のビッグデータの問題の多くを解決します。などの視覚化zepplin、を含む、それぞれの生態環境、成長しています。大電力会社は、機能モジュールを対応する元のスパークのHadoopを置き換えるためにスクランブル。読書のプロセスとは異なり、ディスクに書き込まれたオーバーフロースパークHadoopを、メモリに基づいて、すべての、非常に高速を書きます。さらに幅DAGジョブスケジューリングシステムではより高速なスパークさせ左右される。

 


 

スパークコア成分

1、EET

     完全弾性弾力性の分散データセット、である、データが失われた場合の部分を再構築することができます。位置認識スケジューリングの自動フォールトトレランスとスケーラビリティ、ジンXiangrongは、チェックポイントと記録データによってエラーチェックデータを更新します。SparkContext.textFileによって()次に、RDDにファイルをロードするために外部システムに格納されたアクションRDDにより、新しいRDD変換を構築します。

     RDDデータがロードされたとき遅延読み込みを使用して、遅延ロードにのみ使用されます。あなたがロードした場合、すべての中間貯蔵プロセスは、スペースの無駄になります。したがって、ローディングを遅らせます。スパークは、変換のチェーン全体を見たら、彼は次の関数がデータを必要とされていない場合にのみ、データがもはやロードされません結果のデータを計算することができます。RDD変換は、唯一のアクションでそれらを使用することができ、不活性です。

     分割ドライバとエグゼキュータをスパーク、ドライバがジョブの送信、エグゼキュータは、ドライバがsparkcontextに対応し、タスクを実行し、早期worknodeプロセス上のアプリケーションです。スパークの操作は、アクションをRDD変換を持っています。RDD対応包装RDD依存の変換は、加算されたバックアップおよびリカバリもworknodeがハングアップした後に記憶され、その依存関係メタデータによって再計算されてもよい、DAGが構築され、記憶される依存します。ジョブがRUNJOBを呼び出して送信されると、火花がDAGSchedulerに提出RDD DAGマップ、に基づいて構成され、このDAGSchedulerはあなたがSparkContextで一緒に作成したときに初期化され、彼はスケジューリングプロセスを働くだろう。アクションから良いスタート後の依存関係グラフの建物がタスクセットにカットし、タスクとしてすべての出会いshuffleを各操作を解析し、ディスクにデータを出力するとシャッフルされていない場合、データはまだメモリに保存されています。アクションが遅延読み込みの火花を形成出会いを、実行し始めるまでそれでは何のオペレータがなくなるまで、その後、何のオペレータアクションがここで実行されることはありませんが存在しない場合、フロントから実行し始め、前進し、タスクセットを提出しますTaskSheduler TaskSetManagerが発生し、エグゼキュータに提出実行するために、タスクセットの完了後に戻っDAGSchedulerに実行し、タスクセットがDAGSchedulerを返すのに失敗し、もう一度再作成したときに、次のいずれかを提出します。ジョブタスクセットを複数持つことができる、それが業務アプリケーションの複数が含まれていてもよいです。

 


 

2、スパークストリーミング 

     この小さなデータのバッチモード処理部と同様のバッチで小さな時間セグメントへストリームデータ(数秒)によるデータのカフカ読み出し、各タイムスライスはRDDを生成するために、高い耐障害性を有し、小バルクデータは、分類アルゴリズムのようないくつかの履歴データとリアルタイムデータジョイント分析を用いて、論理アルゴリズムバルクリアルタイムデータ処理と互換性があります。また、MapReduceのことストリームの少量の他の操作に参加し、リアルタイム性を確保するためにすることができます。データのための時間要件は、エンジニアリング上の問題があることができ、ミリ秒未満の流れ。

     スパークストリーミングもStreamingContextを有し、コアは、キー、RDDなどの時間構造の値を含むことによって、DSTREAMであり、各RDDストリームからなる時系列のセットに連続RDD​​に特定の時間間隔データを含みます、持続する持続することができます。すべてのデータの到着がRDD(このデータ間隔)に合わせた処理間隔の後blockGeneratorに維持キューにおけるデータの連続ストリーム、キューにストリームデータ等を受信した後。そのジョブの送信と同様のスパークが、農産物を提出する際にRDD内部DSTREAMを持って、JobQueueでjobManagerにジョブを送信するために、トリガーアクションの後仕事、RDDを提出し、jobschedulerのスケジューリング、jobschedulerのはのジョブスパークにジョブを送信しますスケジューラは、クラスタの実行を刺激するために、分散ジョブ・タスクの多数に変換されます。ジョブのOutputStreamから世代、その後は、トリガの実行DStreamDAGをバック逆。データ処理の処理フローでは、処理ノードの障害は、典型的には、オフラインのデータよりも複雑です。保存されたオフセット、ZKを避けるために書かれている間にスパークstreaminは定期的に、1.3の後にHDFS DSTREAMに書き込むことができます。プライマリノードに障害が発生したら、データは前のチェックポイントのようにして読み込まれます。worknodeノードが失敗した、またはカフカ、水路スパーク他のネットワークは、一度、データソース、データソース・クラスタ・バックアップを電話であろう、それが別のノードに基づいている場合HDFS場合、入力データとしてそのスパークソースファイルは、依存関係に応じて再計算されたとき作業ノードに障害が発生し、システムが別のデータに基づいて再計算することができますが、スレッドを受け入れることは、他のノード上のデータを再起動し、受け入れる一方で、データのノード部分は、失われる受け入れるように失敗した場合。

 


 

3、Graphx

     これは主に、図を対象としています。コアアルゴリズムのPageRank、SVD特異行列、TriangleConutなど。

 


 

4、スパークSQL

    是Spark新推出的交互式大数据SQL技术。把sql语句翻译成Spark上的RDD操作可以支持Hive、Json等类型的数据。

 


 

5、Spark R

     通过R语言调用spark,目前不会拥有像Scala或者java那样广泛的API,Spark通过RDD类提供Spark API,并且允许用户使用R交互式方式在集群中运行任务。同时集成了MLlib机器学习类库。

 


 

6、MLBase

     从上到下包括了MLOptimizer(给使用者)、MLI(给算法使用者)、MLlib(给算法开发者)、Spark。也可以直接使用MLlib。ML Optimizer,一个优化机器学习选择更合适的算法和相关参数的模块,还有MLI进行特征抽取和高级ML编程 抽象算法实现API平台,MLlib分布式机器学习库,可以不断扩充算法。MLRuntime基于spark计算框架,将Spark的分布式计算应用到机器学习领域。MLBase提供了一个简单的声明方法指定机器学习任务,并且动态地选择最优的学习算法。

 


 

7、Tachyon

      高容错的分布式文件系统。宣称其性能是HDFS的3000多倍。有类似java的接口,也实现了HDFS接口,所以Spark和MR程序不需要任何的修改就可以运行。目前支持HDFS、S3等。


 

8、Spark算子

1、Map。对原数据进行处理,类似于遍历操作,转换成MappedRDD,原分区不变。

2、flatMap。将原来的RDD中的每一个元素通过函数转换成新的元素,将RDD的每个集合中的元素合并成一个集合。比如一个元素里面多个list,通过这个函数都合并成一个大的list,最经典的就是wordcount中将每一行元素进行分词以后成为,通过flapMap变成一个个的单词,line.flapMap(_.split(“ ”)).map((_,1))如果通过map就会将一行的单词变成一个list。

3、mapPartitions。对每个分区进行迭代,生成MapPartitionsRDD。

4、Union。是将两个RDD合并成一个。使用这个函数要保证两个RDD元素的数据类型相同,返回的RDD的数据类型和被合并的RDD数据类型相同。

5、Filter。其功能是对元素进行过滤,对每个元素调用f函数,返回值为true的元素就保留在RDD中。

6、Distinct。对RDD中元素进行去重操作。

7、Subtract。对RDD1中取出RDD1与RDD2交集中的所有元素。

8、Sample。对RDD中的集合内元素进行采样,第一个参数withReplacement是true表示有放回取样,false表示无放回。第二个参数表示比例,第三个参数是随机种子。如data.sample(true, 0.3,new Random().nextInt())。

9、takeSample。和sample用法相同,只不第二个参数换成了个数。返回也不是RDD,而是collect

10、Cache。将RDD缓存到内存中。相当于persist(MEMORY_ONLY)。可以通过参数设置缓存和运行内存之间的比例,如果数据量大于cache内存则会丢失。

11、Persist。里面参数可以选择DISK_ONLY/MEMORY_ONLY/MEMORY_AND_DISK等,其中的MEMORY_AND_DISK当缓存空间满了后自动溢出到磁盘。

12、MapValues。针对KV数据,对数据中的value进行map操作,而不对key进行处理。

13、reduceByKey。针对KV数据将相同key的value聚合到一起。与groupByKey不同,会进行一个类似mapreduce中的combine操作,减少相应的数据IO操作,加快效率。如果想进行一些非叠加操作,我们可以将value组合成字符串或其他格式将相同key的value组合在一起,再通过迭代,组合的数据拆开操作。

14、partitionBy。可以将RDD进行分区,重新生成一个ShuffleRDD,进行一个shuffle操作,对后面进行频繁的shuffle操作可以加快效率。

15、randomSplit。对RDD进行随机切分。如data.randomSplit(new double[]{0.7, 0.3})返回一个RDD的数组。

16、Cogroup。对两个RDD中的KV元素,每个RDD中相同key中的元素分别聚合成一个集合。与reduceByKey不同的是针对两个RDD中相同的key的元素进行合并。

17、Join。相当于inner join。对两个需要连接的RDD进行cogroup,然后对每个key下面的list进行笛卡尔积的操作,输出两两相交的两个集合作为value。 相当于sql中where a.key=b.key。

18、leftOutJoin,rightOutJoin。在数据库中左连接以左表为坐标将表中所有的数据列出来,右面不存在的用null填充。在这里面对join的基础上判断左侧的RDD元素是否是空,如果是空则填充。右连接则相反。

19、saveAsTestFile。将数据输出到HDFS的指定目录。

20、saveAsObjectFile。写入HDFS为SequenceFile格式。

21、Collect、collectAsMap。将RDD转换成list或者Map。结果以List或者HashMap的方式输出。

22、Count。对RDD的元素进行统计,返回个数。

23、Top(k)。返回最大的k个元素,返回List的形式。

24、Take返回数据的前k个元素。

25、takeOrdered。返回数据的最小的k个元素,并在返回中保持元素的顺序。


 

9、Tips

1、RDD.repartition(n)可以在最初对RDD进行分区操作,这个操作实际上是一个shuffle,可能比较耗时,但是如果之后的action比较多的话,可以减少下面操作的时间。其中的n值看cpu的个数,一般大于2倍cpu,小于1000。

2、Action不能够太多,每一次的action都会将以上的taskset划分一个job,这样当job增多,而其中task并不释放,会占用更多的内存,使得gc拉低效率。

3、在shuffle前面进行一个过滤,减少shuffle数据,并且过滤掉null值,以及空值。

4、groupBy尽量通过reduceBy替代。reduceBy会在work节点做一次reduce,在整体进行reduce,相当于做了一次hadoop中的combine操作,而combine操作和reduceBy逻辑一致,这个groupBy不能保证。

5、做join的时候,尽量用小RDD去join大RDD,用大RDD去join超大的RDD。

6、避免collect的使用。因为collect如果数据集超大的时候,会通过各个work进行收集,io增多,拉低性能,因此当数据集很大时要save到HDFS。

7、RDD如果后面使用迭代,建议cache,但是一定要估计好数据的大小,避免比cache设定的内存还要大,如果大过内存就会删除之前存储的cache,可能导致计算错误,如果想要完全的存储可以使用persist(MEMORY_AND_DISK),因为cache就是persist(MEMORY_ONLY)。

8、设置spark.cleaner.ttl,定时清除task,因为job的原因可能会缓存很多执行过去的task,所以定时回收可能避免集中gc操作拉低性能。

9、适当pre-partition,通过partitionBy()设定,每次partiti


おすすめ

転載: blog.51cto.com/14384035/2406338