8t's BBR

よくつまったあれこれをメモ

Hadoopがjava8対応しそうな件

 
 
ついにHadoopがjava8の対応をしてくれそうってだけのエントリー。

 参照: Hadoop – Apache Hadoop 3.0.0-alpha1

8月末頃にHadoop3.0.0-alpha1が公開されたようです。
Hadoop-2.x系を使っていた身からするとついに来たかって感じで、3系の本リリースを待っていたんですが、ここ3ヶ月あまり大きな更新がなくα版のままです。


まだα版なので、
There are no guarantees regarding API stability or quality.
とドキュメントに書いてあるように「APIの安定性や品質に関する保証はありません」ので、気がはやいかもしれませんが、3系になって何が変わったか「日本語」で改めてまとめようかと思います。

java8の対応

何と言ってもメインはこれです。HadoopのJARがすべてJava8でコンパイルされました。
java8のアプリケーションを並行して使っていると、うまく動作しなかったのでありがたいです。
まぁまだしばらくはjava7対応のHadoop-2.x系を使うためにjavaのバージョンを切り替えながら使うことになりそうですが。

HDFSにおける消去エンコーディングのサポート

今までHDFSではレプリケーションを使ってデータの損失を防いできましたが、レプリケーション数の分だけストレージを消費していました。(例えば、レプリケーション数を3に設定した状態で、6ブロック分のデータをHDFSに保存しようとするとその3倍の18ブロック分消費していた。)
それに対して今回サポートする消去コーディング(EC)では1.4倍程度の消費で済むそうです。(つまり、先ほどの例では6*1.4=8.4よりせいぜい9ブロックの消費で済むようになるとのこと)

ストレージを節約できるというのは嬉しいニュースですね。

YARNタイムラインサービスver2(α版)登場

ver2ではスケーラビリティと信頼性を向上し、フローと集約を導入することで使いやすさを向上させたそうです。
ユーザーと開発者が、ver1系をすぐに置き換えてテストできるようにしてあるそうですが、セキュリティが有効になっていないとのことなので、テストする際には注意が必要です。

セキュリティが大事なものに対して扱いたい場合は、セキュリティが実装されるまで待ちましょう。
 

シェルスクリプトの書き換え

ほとんどの変更は互換性を保っているそうですが、一部の変更は既存のインストールを壊す可能性があるそうなので、詳しくはリリースノート[HADOOP-9902] Shell script rewrite - ASF JIRA

MapReduceタスクレベルネイティブ最適化

MapReduceがMap出力コレクタのネイティブ実装をサポート。シャッフルを多用するジョブでは、パフォーマンスが30%以上向上するらしい。
これも詳細についてはリリースノート[MAPREDUCE-2841] Task level native optimization - ASF JIRAを参照。

2つ以上のNameNodeのサポート

アクティブNameNodeとスタンバイNameNodeによるHDFSのNameNode高可用性の初期実装が提供されました。
つまり、ユーザーは複数のスタンバイNamenodeを実行できるようになりました。
また、3つのJournalNodeのクォーラムに編集内容を複製することで、システム内のいずれかのノードの障害に耐えることができます。

より高いフォールトトレランスが必要になった場合は、この新機能で対応可能になりました。例えば、3つのNameNodesと5つのJournalNodeを構成することで、クラスタは1つだけではなく2つのノードの障害に耐えることができるようになったそうです。

2つ以上のNameNodeを設定する方法については以下のドキュメントを参照とのこと。
Apache Hadoop 3.0.0-alpha1 – HDFS High Availability Using the Quorum Journal Manager


複数のサービスのデフォルトポートが変更

以前までは複数のHadoopサービスのデフォルトポートはLinuxの一時ポート範囲(32768-61000)にあり、別のアプリケーションと競合する場合、サービスを起動する際にポートにバインドできないことがありました。これらの競合するポートを変更し、先ほどの範囲外に移動したそうです。

NameNode、Secondary NameNode、DataNode、KMSが影響しており、ポート変更のリストが見たい方は、これもリリースノートを参照。
[HDFS-9427] HDFS should not default to ephemeral ports - ASF JIRA
[HADOOP-12811] Change kms server port number which conflicts with HMaster port number - ASF JIRA
 

Microsoft Azure Data Lakeファイルシステムコネクタのサポート

Hadoopは、代替のHadoop互換ファイルシステムとしてMicrosoft Azure Data Lakeとの統合をサポートするようになりました。

intra-DataNodeバランサの実装

1つのDataNodeが複数のディスクを管理できるようになります。

通常の書き込み操作では、ディスクは均等に塗りつぶされます。ただし、ディスクを追加または交換すると、DataNode内で大きなスキューが発生する可能性があります。
既存のHDFSバランサではこれを処理できなかったが、新しいintra-DataNodeバランシング機能によって処理されるようになったとのこと。

これも詳細は
Apache Hadoop 3.0.0-alpha1 – HDFS Commands Guide
のディスクバランサのセクションを参照。

Reworkedデーモンとタスクヒープ管理

HadoopデーモンやMapReduceタスクのヒープ管理に一連の変更。

HADOOP-10950:[HADOOP-10950] rework heap management vars - ASF JIRA
デーモンのヒープサイズを設定するための新しい方法が導入。 特に、ホストのメモリサイズに基づいてオートチューニングが可能になり、HADOOP_HEAPSIZE変数は推奨されなくなりました。

MAPREDUCE-5785:[MAPREDUCE-5785] Derive heap size or mapreduce.*.memory.mb automatically - ASF JIRA
マップの構成を簡素化し、タスク・ヒープ・サイズを縮小するため、タスク構成およびJavaオプションの両方で目的のヒープ・サイズを指定する必要がなくなりました。 すでに両方を指定している既存の設定はこの変更の影響を受けません。



後半はあまり意識してない部分なので、すごさがよくわかりませんでしたが、早くα、β版を終えて本リリースされることを切実に願っております。