ヤフー株式会社は、2023年10月1日にLINEヤフー株式会社になりました。LINEヤフー株式会社の新しいブログはこちらです。LINEヤフー Tech Blog

テクノロジー

Java11対応ほか、Apache Hadoop 3.3.0の新機能を紹介

Java11対応ほか、Apache Hadoop 3.3.0の新機能を紹介

こんにちは、「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で動かすことが可能になった

HADOOP-15338

コミュニティーではまだ正式サポートしていませんが、ヤフーでは既に検証環境で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-13532

HDFS Router-based Federation(以下RBF)自体については[Tech Blog] Apache Hadoop Contributors Meetup出張報告(後編)の記事で紹介しているのでそちらをご確認ください。この記事の時点ではKerberos認証に未対応でしたが、3.3.0でついにKerberos認証に対応しました。ヤフーではマルチテナントなHadoopクラスタを提供しており、任意ユーザーへのなりすまし防止のためKerberos認証は必須です。このため、わざわざtrunkをビルドして検証しています。

DynamometerがHadoop本体にマージ

HDFS-12345

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-13596HDFS-14396

HDFS 2系から3系へのローリングアップグレードをするコマンド自体は提供されていましたが、長い間バグにより正常動作しませんでした。最近になってようやくバグが修正されて、Hadoop 3.3.0/3.2.1/3.1.3へローリングアップグレードできるようになりました。

ヤフーではHDFSを3系へローリングアップグレードしようと考えているため、コミュニティーで提供されたパッチの動作検証やレビューを担当しました。

Impersonation(なりすまし)をサポートしたAuthenticationFilterを全てのREST API endpointに適用

HADOOP-16314

任意ユーザーへのなりすましを防ぐために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向けのメトリクスを提供

HADOOP-16398

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-13363

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-8762

起動中の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をどのように利用しているか詳しく紹介します。興味のある方はぜひご参加ください。

こちらの記事のご感想を聞かせください。

  • 学びがある
  • わかりやすい
  • 新しい視点

ご感想ありがとうございました


鯵坂 明

Hadoop黒帯

ヤフーのHadoopクラスタのアップグレードに向けて検証するかたわら、Hadoop本体の開発もしています。

このページの先頭へ