Memo

Twitterに書くには長すぎることを書きます。Opinions are my own.

Apache Hadoop 3.3.1がリリースされました

2021/6/15にApache Hadoop 3.3.1がリリースされたので、リリースしてからしばらく時間が経つけどまとめておきます。

Hadoop 3.3.1に対する個人的な所感

Hadoop 3.3.1はHadoop 3.3.0からおよそ1年後にリリースされました、1年も経っているので、普段のbug fix releaseでは考えられないほどの修正がされ、もはやHadoop 3.2.0とHadoop 3.3.0との差分よりもHadoop 3.3.0とHadoop 3.3.1との差分のほうが大きいのではないかと思っています。Hadoop CommonとHDFSを中心に、その大きな差分についてこれから紹介していこうと思います。

NameNodeLayoutVersionの更新

Hadoop 3.3.1では、なんとNameNodeLayoutVersionが上がっています。普通のbug fix releaseではもちろんそんなことはないし、Hadoop 3.2.0とHadoop 3.3.0でもNameNodeLayoutVersionは同じなのですが、今回のリリースでは [HDFS-15566] NN restart fails after RollingUpgrade from 3.1.3/3.2.1 to 3.3.0 - ASF JIRA の問題を解決するために、例外的にバージョンが上がることになりました。そのため、NameNodeのバージョンを上げるときには起動時に -upgrade オプションが必要となります。

hadoop-thirdpartyの登場

HadoopはGuavaとProtocolBuffersというライブラリに大きく依存しています、これらのライブラリはあまりに多くのJavaのプロジェクトで使われており、しかも(特にGuavaは)互換性が崩れやすいという特徴を持っているため、気軽にバージョンを変更できないという問題をずっと抱えていました。Hadoop 3.3.0でこれらのライブラリのバージョンをようやく上げたのですが、やはりHadoopに依存しているプロダクトで不具合が多発し、Hadoopで利用するGuavaとProtocolBuffersのバージョンは変更せずに、別途hadoop-thirdpartyという別のリポジトリでshadeしたものを利用することにしました。これにより、Hadoopでは好きなバージョンのGuavaやProtocolBuffersを、互換性の問題を意識せずに利用できるようになりました。

また、Java 6やJava 7時代においてはGuavaは非常に便利なライブラリだったのですが、Java 8になってからはJava自体のAPIが拡充され、Guavaをわざわざ利用する必要がなくなってきました。そのため、Guava自体を徐々にHadoop本体から外していく取り組みが以下のissueによって進められています。

[HADOOP-17098] Reduce Guava dependency in Hadoop source code - ASF JIRA

IOStatistics APIの登場

[HADOOP-16830] Add Public IOStatistics API - ASF JIRA

AWSやAzureのSDKではHTTPリクエストにかかった時間などいくつかのメトリクスを提供していますが、Hadoop IOStatistics APIによって、Hadoopから s3a://abfs:// にアクセスするときにもこれらのメトリクスを取得するできるようになりました。

また、S3AFileSystemについては100件以上の修正が入っています。利用者は要チェックです。

[HADOOP-16829] Über-jira: S3A Hadoop 3.3.1 features - ASF JIRA

SSL証明書の自動リロード

[HADOOP-16524] Automatic keystore reloading for HttpServer2 - ASF JIRA

DataNodeを除く(正確には、HttpServer2経由でJettyを利用している) Hadoopのデーモンで、SSL証明書を自動でリロードできるようになりました。巨大なHDFSクラスタだとNameNodeを再起動するのは運用面のコストが高いのですが、SSL証明書の更新のために再起動しなくてもよくなりました。

lz4-java, snappy-javaの利用

LZ4とsnappyを利用するときにはHadoopから直接JNI経由で呼び出していたのですが、専用のjavaライブラリを使うようになって、ビルドやメンテナンスが簡単になりました。

HDFS Erasure Codingのバグ修正

HDFS Erasure Codingが登場してから結構な時間が経っているのですが、本気で使い倒す企業が出てきてバグがあぶり出されるには時間がかかるんだなぁという印象を持っています

Python3系への移行完了

[HADOOP-16748] Migrate to Python 3 and upgrade Yetus to 0.13.0 - ASF JIRA

Hadoop本体でPythonを利用している部分はほとんどないのですが、リリース作業用のスクリプトで少しだけ利用されています。ようやく移行を終えることが出来ました。

おまけ: HDFS deleteの速度改善が間に合いませんでした

[HDFS-13671] Namenode deletes large dir slowly caused by FoldedTreeSet#removeAndGet - ASF JIRA

Hadoop 3.0でNameNodeのGC処理の改善のためにblockを保持するデータ構造が変わったのですが、なんとそのせいでdelete処理の計算量が O(1) から O(logN) (N: block数) になってしまい、巨大なHDFSクラスタだと性能が大きく劣化していました。入念なレビューを経てようやくrevertされましたが、3.3.1には間に合いませんでした。次のリリースに期待しましょう。