Sparkに興味があり、その開発スキルを短時間で身につけたいと考え、Cloudera社の3日間の研修に行かせて頂きました。
この研修は座学半分、ハンズオン半分の研修で、Cloudera社に直接質問できるメリットがあります。1日目が終わる頃にはMapReduceの欠点とそれをSparkで解決する方法を自分の言葉で説明できるようになり、2日目が終わる頃にはSparkアプリケーションがscalaで書けるようになりました。そして3日目にはSpark Streamingアプリケーションを組めるようになりました。
1日目
Sparkの必要性を理解する
1日目の内容は、
Sparkプログラミング=RDDの操作=関数型プログラミング
であることを理解することでした。
背景としては、hadoopがjarをデータノードに送り、データがある場所で実行するアーキテクチャであることがあります。これをローカリティといいます。
しかし、jarの中身は任意ではなく、mapper,reducerしか送れないという事情があります。
これを任意のjar(すなわち関数)を送信できるようにすれば便利じゃね?というのがSparkの根本的なアイディアだと思います。
そのため、関数を第一級オブジェクトとしてデータノードに転送し、遅延評価をデータノードで行うという関数プログラミングのアーキテクチャがぴったりあてはまることになります。
このアイディアを実装に移すのは意外にハードルが高く、リネージュとステージ分解を厳密に考える必要があります。
また、Sparkを有名にしているのは、オンメモリ処理が可能である点です。
背景としては、hadoopにオンメモリ処理ができないという弱点があることです。これは、シャッフル処理でネットワーク転送が発生するため、オンメモリ処理の恩恵が薄いためです。
これについてもリネージュとステージ分解を考えた上でcache/persistを使い分けることで、オンメモリをフル活用することが出来ます。
「Hadoopの100倍の性能をたたき出すSpark」
を実現するためには、Hadoopアーキテクチャとその弱点を知り尽くしている必要があります。
2日目
Sparkプログラミングをできるようになる
実践性を深めるため、手を動かしながら以下の点にまず習熟します。
- HDFS
- クラスタ実行/UIツール
- mapPartitions/パーティション
- checkpoint/リネージュ削除
また、Sparkでオンメモリ処理をできるようになるために、
- cache/persist
の仕組みを学習します。
この日の最終課題は、数か月分のApacheアクセスログから、集計指標を計算するアプリケーションを作成し、HDFS+擬似分散クラスタで実行させることです。
3日目
SparkStreamingをできるようになる
Spark Streamingは、SparkをsocketやKinesisに接続し、リアルタイム処理を行うための機能です。
この日前半の課題は、socketを監視し、リアルタイム分析するアプリケーションを作成し、Standaloneで実行させることです。
反復型Sparkプログラミングをできるようになる
反復型Sparkプログラミング(ページランク計算や機械学習など)をできるようになるための訓練です。(現実的にはこれが一番大事で、HadoopからSparkへの移項はここからになるのです。)
- K-means
この日後半の課題は、K-means法をSparkで実装することです。これは非常に簡単で、Sparkの威力を思い知りました。
Sparkアプリケーションのチューニングをできるようになる
- ブロードキャスト
- アキュミュレーター
- リパーティショニング
です。
アキュミュレーターはブロードキャストに手間取り、終わりませんでした。いつか自分で実装したいと思います。
その他、公式のカリキュラムにあるものは全部教えて頂きました。
3日でここまで出来るようになったので、いい講習だったのではないかと思います。
授業というものを受けるのも学生時代以来初めてです。講師の方は知識豊富で、話がわかりやすく、時間配分が上手く、責任感のある方でした。また、物事のいい面だけを強調することはなく、常にトレードオフがあることを前提にした説明をされており、誠実な方だと思いました。質問にも全て答えてくださいました。
早速YARNクラスタを立てようと思います。
ピンバック: 並列計算についてのスーパー老害トーク(2005年〜2018年) | The Big Computing