Spark 1.2.0 は 1.X ラインの 3 回目のリリースです。このリリースでは、Spark のコアエンジンのパフォーマンスとユーザビリティの向上、MLlib のための主要な新 API、Python での ML サポートの拡張、Spark Streaming での完全な H/A モード、その他多くの機能が追加されています。GraphX では、パフォーマンスと API の大幅な改善が見られ、アルファコンポーネントから正式リリースとなりました。Spark 1.2 は、60 を超える機関の 172 人の貢献者による 1000 以上の個別のパッチによる作業を表しています。
Spark 1.2 をダウンロードするには、ダウンロードページをご覧ください。
1.2 では、Spark core は、非常に大規模なシャッフルのパフォーマンスと安定性を向上させるために 2 つの主要なサブシステムをアップグレードしました。1 つ目は、バルク転送中に使用される Spark の通信マネージャーで、Netty ベースの実装にアップグレードされています。2 つ目は、Spark のシャッフルメカニズムで、Spark 1.1 で最初にリリースされた「ソートベース」シャッフルにアップグレードされています。これらはどちらも、非常に大規模なシャッフルのパフォーマンスと安定性を向上させます。Spark はまた、長時間実行される ETL スタイルのジョブでのクラスター利用率を向上させるように設計された弾力的なスケーリングメカニズムを追加しました。これは現在 YARN でサポートされており、将来のバージョンでは他のクラスターマネージャーにも対応する予定です。最後に、Spark 1.2 は Scala 2.11 をサポートしました。Scala 2.11 でのビルド手順については、ビルドドキュメントを参照してください。
このリリースには、Spark のストリーミングライブラリへの 2 つの主要な機能追加が含まれています。Python API と、ドライバの完全な H/A を実現するライトアヘッドログです。Python API は、ほぼすべての DStream の変換と出力操作をカバーしています。現在、テキストファイルとソケット経由のテキストに基づく入力ソースがサポートされています。Python での Kafka および Flume 入力ストリームのサポートは、次のリリースで追加される予定です。次に、Spark Streaming は、ライトアヘッドログ (WAL) を通じて、H/A ドライバサポートを特徴とするようになりました。Spark 1.1 以前では、一部のバッファリングされたデータ(受信済みだが未処理)は、ドライバリスタート中に失われる可能性がありました。これを防ぐため、Spark 1.2 はオプションの WAL を追加しました。これは、受信したデータを耐障害性のあるファイルシステム(例: HDFS)にバッファリングします。詳細については、ストリーミングプログラミングガイドを参照してください。
Spark 1.2 では、spark.ml というパッケージに新しい機械学習 API がプレビューとして公開されました。これは、複数のアルゴリズムが異なるパラメーターでシーケンシャルに実行される学習パイプラインをサポートします。この種のパイプラインは、実際の機械学習デプロイメントでは一般的です。新しい ML パッケージは Spark の SchemaRDD を使用してML データセットを表現し、Spark SQL との直接的な相互運用性を提供します。新しい API に加えて、Spark 1.2 は決定木を 2 つのツリーアンサンブルメソッドで拡張します。分類と回帰で最も成功しているツリーベースモデルの 1 つであるランダムフォレストと勾配ブースティングツリーです。最後に、MLlib の Python 実装は、Python API の追加プロセスを簡素化し、Python API カバレッジを向上させるために 1.2 で大幅に更新されました。
このリリースでは、Spark SQL は外部データソース用の新しい API を追加しました。この API は、述語プッシュダウンなどの最適化をサポートし、外部データソースを一時テーブルとしてマウントすることをサポートします。Spark のParquet および JSON バインディングは、この API を使用するように再実装されており、1.2 ライフサイクル中にさまざまなコミュニティプロジェクトが他のシステムやフォーマットと統合されることが期待されます。
Hive 統合は、固定精度 10 進数型とHive 0.13 のサポートにより改善されました。Spark SQL は、人気のある Hive 機能である動的にパーティション分割された挿入も追加しました。キャッシングに関する内部的な再構築により、SchemaRDD のキャッシングインスタンスのパフォーマンスとセマンティクスが向上し、キャッシュされたデータに対する統計ベースのパーティションプルーニングのサポートが追加されました。
1.2 では、GraphX はアルファコンポーネントから正式リリースとなり、安定した API が追加されました。これは、GraphX に対して記述されたアプリケーションは、コードの変更なしに将来の Spark バージョンでも動作することが保証されることを意味します。新しいコア API である aggregateMessages が、廃止された mapReduceTriplet API に代わって導入されました。新しい aggregateMessages API は、より命令的なプログラミングモデルを特徴とし、パフォーマンスを向上させます。初期のテストユーザーは、新しい API に切り替えることで 20% ~ 1X のパフォーマンス向上を確認しています。
さらに、Spark はグラフのチェックポイントとラインエイジの切り詰めをサポートするようになりました。これらは、本番ジョブでの多数のイテレーションをサポートするために必要です。最後に、PageRank およびグラフのロードのパフォーマンスがいくつか改善されました。
Spark 1.2 は Spark 1.0 および 1.1 とバイナリ互換性があるため、コードの変更は必要ありません。ただし、明示的に不安定とマークされた API は除きます。Spark は、パフォーマンス向上のために、いくつかのケースでデフォルト設定を変更しています。Spark 1.1 とまったく同じ設定を維持したいユーザーは、これらの変更を元に戻すことができます。
spark.shuffle.blockTransferService が nio から netty に変更されました。spark.shuffle.manager が hash から sort に変更されました。SparkContext([... args... ], batchSize=1024) を使用できます。spark.sql.parquet.cacheMetadata: false -> truespark.sql.parquet.compression.codec: snappy -> gzipspark.sql.hive.convertMetastoreParquet: false -> truespark.sql.inMemoryColumnarStorage.compressed: false -> truespark.sql.inMemoryColumnarStorage.batchSize: 1000 -> 10000spark.sql.autoBroadcastJoinThreshold: 10000 -> 10485760 (10 MB)いくつかの小さなバグはリリースウィンドウに間に合いませんでした。これらは Spark 1.2.1 で修正される予定です。
貢献してくださった皆様、ありがとうございました!