あけましておめでとうございます。
例年、Apache HadoopやApache Sparkを中心に並列分散処理ミドルウェアの動向や展望についてご紹介しています。
今年は NTTデータに所属する 岩崎正剛(Hadoopコミッタ)、猿田浩輔(Sparkコミッタ)、鯵坂明(Hadoopコミッタ/PMC)の3名でディスカッションした内容を元にお伝えします。
Hadoop 3.0リリース
昨年の新春特別企画では、「2017年はHadoop 3.0がリリースされる年になるはずです。」と書きましたが、Hadoop 3.0.0が2017年12月13日にリリースされました。2017年の間に3.0.0-alpha2、3.0.0-alpha3、3.0.0-alpha4、3.0.0-beta1とリリースを重ね、なんとか2017年内に間に合った格好です。
2016年にリリースされた3.0.0-alpha1では、HDFSのErasure Coding対応、YARNのTimeline Service v.2、マルチスタンバイNameNode、シェルスクリプト(CUI)の改善といった新機能がmergeされていました。
3.0.0(GA)においてはさらに、依存ライブラリのバージョン競合を避けるためのshaded client jar、FileSystem API経由でのS3の操作で一貫性を保つためのS3Guard、ユーザ定義可能なYARNリソースタイプなどが追加されています。
動作環境の変化に着目すると、Hadoop 3.0でJava 7のサポートが廃止され、Java 8が必須になりました。Javaについては2017年9月にJava 9がリリースされましたが、Hadoop側のJava 9対応は現在も作業中の状態です。多くのライブラリを利用し、多くのミドルウェアから利用されるHadoopにとって、動作環境の変更は簡単ではありません。
Java自体もそのリリースサイクルを変更し、6ヵ月ごとに新しいリリースを出すと発表しています。言語処理系の変更にどのように追随し、新機能を活用していくべきかは、コードベースの大きいソフトウェアには悩ましい問題です。
Hadoopに見る大規模OSSプロジェクトの運営
バージョン3のリリースに時間を要したのは、HiveやHBaseに代表される、Hadoopに依存する関連プロダクト側で、移行性の問題等を確認できるようにするために、アルファ版、ベータ版のリリースを複数回行ったためです。エコシステムと呼ばれるほどの多様な関連プロジェクトが存在するため、Hadoopは変更に対してどうしても慎重になります。
開発者側の視点でみると、メジャーバージョンアップは互換性を壊すような変更を行える唯一のチャンスであるため、あれを入れたい、これを入れたいとなって、リリースがずるずる引き伸ばされがちな傾向があります。
規模が大きなソフトウェアにとって、スピード感の低下は避けられない問題ではあるものの、開発コミュニティ内ではオープンに議論が行われ、リリースを行うことができたという点では、健全な状態にあるといえます。
Hadoop 3.0.0と同じタイミングでHadoop 2.9.0もリリースされたため、現在では2.7、2.8、2.9、3.0という4つのブランチが、メンテナンスされている状態になります。パッチのバックポートなどの維持コストが上がるため、あまり多くのブランチをメンテナンスし続けるのは避けるべきですが、開発コミュニティとしていつ止めるかの明確な方針があるわけではありません。あるバージョンの維持が必要なニーズがあって、リリースマネージャ役を務めるコミッターがいれば、メンテナンスが継続されるようになっています。
Sparkの動向
Sparkについては、バージョン2.2が2017年7月にリリースされました。このバージョンの大きなトピックのひとつはStructured Streamingがアルファ版を卒業したことです。これを皮切りに、今後プロダクションでStructured Streamingを活用した事例も次々と登場すると予想されます。またSpark SQLにはコストベースの最適化エンジンが試験的に導入されました。
これまでのルールベースの最適化エンジンでは、複数のテーブルを結合して中間データが膨れ上がるケースの最適化が苦手だったり、I/O量が最小になるように複数のテーブルの結合順序を入れ替えるような最適化ができませんでした。新たに導入されたコストベースの最適化エンジンではそのような"より賢い"最適化が可能になります。現時点ではまだまだ荒削りな実装ですが、2018年中にはプロダクションレディーな完成度に到達するでしょう。
Structured Streamingは先述のとおりアルファ版を卒業してAPIが安定してきましたが、機能追加や実装のブラッシュアップは依然として活発に行われています。Structured Streamingでは現在マイクロバッチベースのストリーム処理エンジンが内包されていますが、一桁ミリ秒オーダーのレイテンシを達成するために新しいストリーム処理エンジンの開発が進められています。
この処理エンジンは、2018年にリリースされるバージョン2.3、もしくは2.4でSpark本体に導入されることが予想されます。Sparkがカバーできるユースケースが更に広がりを見せるでしょう。
Kubernetesの成功とHadoop/Spark
実行基盤としてのDockerが急速に普及し、その管理フレームワークであるKubernetesが大きな注目を集めました。KubernetesはGoogleがオープンソースソフトウェアとして公開した、サードーバーティのツールでしたが、事実上の標準といえるほどユーザに利用されるようになり、2017年10月にはDocker公式のオーケストレーション機能としてサポートされることが発表されました。
昨年の記事でも、Googleがオープンソースソフトウェアに積極的な関与するようになったことに言及しましたが、Kubernetesの成功はそれを象徴する出来事であると感じられます。
アプリケーションを実行する基盤という観点では、HadoopにはYARNと呼ばれるリソース管理フレームワークがあり、タスクをDockerコンテナとして実行する機能も提供しています。Kubernetesに慣れたユーザが増えることで、機能性や使用感で影響を受ける場面があるかもしれません。
Sparkにおいても、従来サポートしていたYARNやMesos、Standaloneなどのクラスタマネージャに加えてKubernetesのサポートが検討され、開発が行われています。
「AIブーム」とユーザの関心の移り変わり
HadoopはもともとYahoo!やFacebookの技術者が開発し、TwitterやLinkedInで大規模に利用されていたこともあり、WebとSNSが中心的なユースケースとなっていました。
その後、大量のデータ処理を必要とするテレコム、バイオ、エネルギー、金融と利用される分野が広がったり、IoTという切り口でのユースケースが注目されたりと、年とともにホットな話題の移り変わりが見られます。その意味で2017年は、AIと機械学習がホットな話題だったという印象を受けます。
データを処理する仕組みとしてのHadoopではなく、大規模データ処理で何ができるか、どのような価値を生み出せるかに関心の焦点が移ってきています。これを象徴するのが、Hadoop関連カンファレンスの名称変更です。
一番初めにClouderaが単独で主催していたHadoop Worldは、O'Reilly Media主催のデータサイエンスについてのカンファレンスであるStrataと合併され、"Strata + Hadoop World"となりました。2017年5月にSan Joseで開催された際にはStrata + Hadoop Worldだったものが、2017年9月のNew York開催以降は"Strata Data Conference"となり、イベント名にHadoopの文字が含まれなくなりました。
また、Hortonworks主催のHadoop Summitも、2017年からDataWorks Summitに名前が変わり、Hadoopのコミュニティイベントから、データビジネスのカンファレンスへと、位置づけを変えつつあります。
2017年に開催されたStrataやDataWorks Summitでは、セッションの多くが機械学習に関連する内容を扱っていました。
Sparkやその周辺についてもAI、特にディープラーニングにちなんだ状況の変化が起こり始めています。Sparkはもともと機械学習を主要なユースケースのひとつと捉え、ビルトインのライブラリを提供していました。それに加えて2017年はIntelが「BigDL」を、Databricksが「Deep Learning Pipelines」をいずれもオープンソースとして公開するなど、ディープラーニング向けの処理エンジンとしてSparkを活用するためのエコシステムが広がりを見せています。ディープラーニングではテキストデータだけではなく画像データを用いる場合も多いですが、2018年にリリース予定のバージョン2.3では画像データが処理対象のデータとして標準でサポートされます。このようにSpark本体でもAIやディープラーニングを指向した進化が始まっています。
またDatabricksは、同社が主催するSparkに関する最大級のイベント「Spark Summit」の名称を、2018年から"Spark + AI Summit"に変えると発表しています。こちらも昨今のAIブームの波に乗った形と言えるでしょう。
デファクトスタンダードとなったApache Kafka
HadoopやSparkの利用シーンに近いところで、ここ1~2年で地味によく使われるようになったプロダクトとして、Apache Kafkaが挙げられます。Strata Data ConferenceやDataWorks SummitなどのHadoop関連カンファレンスでも、事例紹介のセッションをみると、データをまず受け止めるツールとして、Apache Kafkaの登場頻度が非常に高いと感じます。2016 年に初開催となったKafka SummitというKafkaを中心としたカンファレンスは、2017年も開催され、NTTデータも講演を行いました。
Apache Kafkaも2017年10月にバージョン1.0.0がリリースされ、節目を迎えました。2017年に追加された機能で目立つところとしては、複数のメッセージのKafkaへの読み書きをアトミックに処理する、transactional APIが挙げられます。
初期のKafkaは、データを永続化する前提の、高スループットなメッセージキュー的なプロダクトという印象でした。Spark Streaming、Storm、Flinkといったストリーミングデータ処理エンジンと組み合わせて使われていましたが、Kafka自身もKafka Streamsと呼ばれる処理機能を提供するようになり、ストリーミングデータ処理基盤としての位置づけを強調するようになっています。実際、入出力をKafka前提とすることで、ある程度シンプルで使いやすい機能セットを提供することができているという印象です。
まとめにかえて
2017年はHadoop 3.0がリリースされ、ひとつの節目を迎えました。Sparkは2.2がリリースされ、Kafkaも1.0.0が出て節目の年となりました。いずれも AI、機械学習を代表として大規模データ処理基盤へのニーズは依然として高く、現在も活発に開発は続いています。さらに、不揮発性メモリなどの新しいハードウェアとの組み合わせについても2018年にはさらなる進展が見られることが期待されます。
プロジェクトごとに課題がありつつも、並列分散処理エンジンは進化を続けています。ぜひ、皆さんには2018年もHadoopやSparkに代表されるオープンソースソフトウェアを活用して、役立つ、面白い取り組みを進めてもらえばと考えています。
よい1年になりますように!