こんにちは、「Hadoop」黒帯の鯵坂(@ajis_ka)です。本記事では、Apache Hadoopで次にリリースされるマイナーバージョンである3.3.0で追加される新機能について紹介します。本記事では、特にHadoop CommonとHDFS(Hadoop Distributed FileSystem)の新機能を重点的に紹介しつつ、それらの機能に対するヤフーの貢献についても触れていきます。
Hadoop 3.3.0 概要
Hadoop 3.3.0はおそらく2019年の年末までにリリースされる予定で、この記事を執筆している10月23日時点ですでに1500件以上の修正が入っています(Hadoop 3.2.0は1089件)。つまり、非常に多くの新機能が追加されています。また、ヤフーではHadoop 2系から3系へのバージョンアップをこれから予定しており、バージョンアップ後のバージョンは3.3系をベースとする予定です。3.3.0はまだリリースされていない(branch-3.3も切られていない)ため、現時点ではHadoopのtrunkブランチ(いわゆるmaster)を適宜ビルドして検証しています。
Java11で動かすことが可能になった
コミュニティーではまだ正式サポートしていませんが、ヤフーでは既に検証環境でHDFSをJava11で動作させています。Java11ではZGCが導入されただけでなく、G1GCにもさまざまな改善が入っており、NameNodeのヒープ肥大化によるGC長期化問題を解決できるものと期待しています。
参考に、Java11でHDFSを動作させる場合に注意すべき点(ハマった所)を以下に挙げます。
- trunkをJava8でビルドする
- DataNodeの起動にjsvcを利用する場合、jsvcのバージョンを1.1.0以上にする
- Kerberos認証を利用していてKerberos ticketがrenewできる状態にない場合、renewに関する設定全てを
/etc/krb5.conf
から消す必要がある([yarn-dev] RM and NM fails to start on Secure cluster with Java11) - JVMのlogging optionが変わっているのでJava11向けに修正する必要がある
Java11でHadoopを動作させるためにどのような修正をしてきたについてはJava11へのマイグレーションガイド ~Apache Hadoopの事例~に詳細があるので、興味があればぜひご覧ください。
HDFS Router-based FederationがKerberos認証に対応
HDFS Router-based Federation(以下RBF)自体については[Tech Blog] Apache Hadoop Contributors Meetup出張報告(後編)の記事で紹介しているのでそちらをご確認ください。この記事の時点ではKerberos認証に未対応でしたが、3.3.0でついにKerberos認証に対応しました。ヤフーではマルチテナントなHadoopクラスタを提供しており、任意ユーザーへのなりすまし防止のためKerberos認証は必須です。このため、わざわざtrunkをビルドして検証しています。
DynamometerがHadoop本体にマージ
Dynamometerは、LinkedInが開発したOSSのNameNode負荷再現ツールです。YARN container内でNameNodeと複数のDataNodeを起動し、本番環境のfsimageとaudit logを読み込ませることで本番環境と同等の負荷を手軽に再現させることができます。LinkedInではNameNodeのGCチューニングのためにDynamometerを活用していましたが、利用者にとって使いやすいだろうということでHadoop本体にマージされました。
ヤフーでもNameNodeのGCチューニングのためDynamometerを利用している最中です。DynamometerはまだHadoop本体にマージされたばかりで枯れていないため、ファイルパスに=
が入ったaudit logが読み込めなかったり(HDFS-14819)、Hadoop 2系のHDFSが起動しなかったり(HDFS-14755)といったバグを踏みましたが、いずれもパッチを投稿して解決しています。
ちなみに、DynoYARNという、DynamomenterのYARN版を作ろうという取り組みもあります(YARN-8849)。
HDFS 2系からのローリングアップグレードが可能に
HDFS 2系から3系へのローリングアップグレードをするコマンド自体は提供されていましたが、長い間バグにより正常動作しませんでした。最近になってようやくバグが修正されて、Hadoop 3.3.0/3.2.1/3.1.3へローリングアップグレードできるようになりました。
ヤフーではHDFSを3系へローリングアップグレードしようと考えているため、コミュニティーで提供されたパッチの動作検証やレビューを担当しました。
Impersonation(なりすまし)をサポートしたAuthenticationFilterを全てのREST API endpointに適用
任意ユーザーへのなりすましを防ぐためにKerberos認証があるとRBFのところで書きましたが、なりすましをうまく利用できる場合もあります(例えばHiveServer2はhiveユーザーで起動していますが、HiveServer2からのジョブ実行時にデフォルトではジョブを投入したユーザーになりすまして実行され、ジョブを投入したユーザーの権限でYARNおよびHDFSなどにアクセスします)。HadoopのRPCにおいてはすでにUserGroupInformation.doAs
メソッドというなりすましのための仕組みが用意されており、REST APIでもWebHDFSなど一部のサービスではdoas
パラメータをすでに提供していましたが、各サービス間で一貫性がなく、例えばYARN REST APIからは利用できませんでした。そこで、Hadoop内の全てのREST APIで一貫性を持たせるため、impersonationをサポートしたAuthenticationFilterが全てのREST API endpointに適用されるように修正されました。
この修正はREST APIを提供する全てのコンポーネントに影響しており、ヤフーではHttpFSのREST APIが正常動作しないという問題に遭遇しました。こちらの問題はコミュニティーに報告し、すでに修正されています(HDFS-14815)。
Prometheus向けのメトリクスを提供
Prometheusがメトリクスをスクレイピングするためのendpointを提供します。これで、JMX Exporterなどを利用しなくても設定を入れるだけでPrometheusからメトリクスが収集できます(すでにJMX Exporterを利用している場合、メトリクスやラベルの名前に互換性がないことには注意が必要です)。Hadoopのサブプロジェクトとして別リポジトリで開発されている分散オブジェクトストレージであるOzoneで先に実装されていたため、それをHadoop本体に移植するという形で実装しました。現時点では他のMetricsSinkと同様に、NNTop(HDFS-6982)やPercentile値(HDFS-3650)といった構造化されているメトリクスもflattenされてしまっているのですが、これを構造化したままにしてPromQLで処理しやすい形でメトリクスを提供したいと考えています(HDFS-14801)。
また、Kerberos認証を有効にしている場合にPrometheusがKerberosをサポートしていないためHadoopのウェブUIに接続できないという問題がありましたが、servlet指定でKerberos認証をスキップできるようにする仕組みを追加して問題を解決しました(HADOOP-16527)。Hadoop 3.2.0でロードバランサによるヘルスチェックのため/isActive
servletが実装されました(HADOOP-15707)が、利用しているロードバランサがKerberos認証に対応していない場合であってもこの仕組みで解決できます。
Protocol Buffersのアップグレード
HadoopではDataNode-DataNode間のデータ通信以外のRPCおよびfsimageのデータ形式にProtocol Buffersを採用しています。Protocol BuffersのバージョンはHadoop 2.1.0-betaからずっと2.5.0で、Hadoopをコンパイルするときにもバージョン2.5.0をインストールする必要がありましたが、ついに3系にアップグレードされました。また、protobuf-maven-pluginを利用することで、Protocol Buffersをインストールする必要自体がなくなりました(ただし、hdfs-native-clientをビルドする場合はlibprotocおよびlibprotobufが必要です)。Protocol Buffers自体には後方互換モードがあるので利用ユーザーへの影響はありませんが、HadoopがProtocol Buffersのバージョン2.5.0を利用しているという前提でビルドしているミドルウェア(例えばApache HBaseやApache Spark)では対応が必要です。HADOOP-13363は解決までに3年以上かかっていて、個人的には思い入れが深いissueです。
起動中のコンテナに対するインタラクティブシェルの実行
起動中のYARNコンテナに対して、Dockerコンテナに対するdocker exec
コマンドに相当するインタラクティブシェルが実行できるようになりました。これにより、YARNアプリケーションに対して効率よくデバッグできます。この機能についてはまだ試せていないのですが、非常に面白そうなので今後試してみようと考えています。
Apache Submarineプロジェクトの設立
YARN上でTensorFlowやPyTorchなどの深層学習用のミドルウェアを動作させるためのツールとしてSubmarineというプロジェクトがHadoopのサブプロジェクトとして活動していましたが、2019年10月にApache Submarineとしてスピンオフが承認されました。現在Hadoopプロジェクトから分離するための手続きを進めています。Hadoop 3.3.0とは直接関係ないですが、直近の出来事だったのでここで紹介しています。
おわりに
本記事ではHadoop 3.3.0の新機能についていくつか紹介しましたが、全ての機能を漏れなく紹介しているわけではないことにご注意ください。また、日本Hadoopユーザー会主催のHadoopソースコードリーディング 第27回にて、ヤフーでDynamometerをどのように利用しているか詳しく紹介します。興味のある方はぜひご参加ください。
こちらの記事のご感想を聞かせください。
- 学びがある
- わかりやすい
- 新しい視点
ご感想ありがとうございました