0.初めに
分散処理システムは、利用者はあまり分散処理のアルゴリズムをわかっていないくても、また意識しなくても
うまい具合にデータを処理してくれるので、利用する分には詳しくわかっていないくてもいいかもしれません
が、データの動きというのは分散処理には欠かせない技術なので
これがわかっておくだけでも、コードの記述なども理解しやすいと思います。
今回は、2つの資料を参考にしています。
1つめは、couseraでIBMが公開している講義になります。Sparkを中心として説明しています。
あまりこれにフォーカスした資料が意外とないもので、日本語訳もある程度機能しているので
是非!
2つ目は、NTTデータの土橋さんという方が公開しているSparkの資料になります。
これはとてもわかりやすく、実際の講義ではHands-onでSpark UIで説明していたりしているのでしょうか。参加してみたかった。。
1.RDDとは
Spark内のクラスターのノード間で分割された耐障害性のある要素の集まりのこと
そもそもクラスターとは、
同時に連携して、タスクを実行するコンピューターの集まりを指します。
分散処理には欠かせません。
2.RDDはSparkでどのように耐障害性を実現するのか?
不変性とキャッシュによってSparkのレジリエンス(回復性)を実現する
データが不変であるため、RDDは常に回復可能。
Sparkのもう一つの重要な機能は、操作を重ねてもデータセットをメモリに永続化またはキャッシュすること
キャッシュ自体は耐障害性があり、いつでも回復可能
2.1 例 PythonでのRDD作成
data = [1,2,3,4,5]
distData = sc.parallekize(data)
RDDは、部分故障への耐性を考慮した分散コレクションに対し、
典型的なデータ処理を繰り返して目的の結果を得ます。
入力⇨RDD⇨グルーピング⇨RDD⇨フィルター⇨RDD⇨集計
rdd.filter(...).resuceByKey(...)
このようにコレクション操作のように記述します。
これらの部分的な処理は、中間処理を都度出力する必要がないため、HDFSなどの外部分散ストレージへのI/Oが抑えられます
3.キャッシュの重要性
例えば、HDFSからジョブAがあって、データAを読み込むとします。
読み込んだ中間データはメモリにキャッシュされます。
別の処理ジョブBでデータAを使いたい場合、すでにキャッシュがあるので
それを利用すればよい。
同じデータを活用するシーンにおいて、ディスクI/Oが生じないので、処理が効率的というわけですね。