Edited at

Apache Hadoop 3でまずハマりそうなポイント

More than 1 year has passed since last update.

今年の9月にApache Hadoop 3.0.0-alpha1がリリースされました。2.0.0-alphaのリリースから実に4年以上が経過しており、かなり大規模なアップデートになっています。

ただ、Hadoop 1から2になってJobTrackerとTaskTrackerが消えてYARNが追加されたというような超大規模な変更はなく、Hadoop 3でも今まで通りResourceManagerやNodeManagerが動作するということになります。

本記事では、「Apache Hadoop 3を使ってみたい!」という人がハマりそうな点、つまり非互換な点について述べていきます。新機能については他の方々が説明してくれるでしょう。


Java7サポートの打ち切り

Hadoop 2.7でJava6が使えなくなったことはもうご存知かもしれませんが、Hadoop 3ではJava7が使えなくなりました。ちなみに、Java9対応にはまだまだ時間がかかりそうです。Java9対応のつらい話については、別途記事を書こうかなと思っています。


デフォルトポート番号の変更

いくつかのサービスのデフォルトポート番号がLinux ephemeral port range(32768-61000)に入っており、競合の可能性があったので変更されました。以下、対応表です。

Service
old
new

KMS(HTTP)
16000
9600

KMS(Admin)
16001
9601

NameNode(RPC)
8020
9820

DataNode(HTTP)
50075
9864

DataNode(HTTPS)
50475
9865

DataNode(RPC)
50010
9866

DataNode(IPC)
50020
9867

SecondaryNameNode(HTTP)
50090
9868

SecondaryNameNode(HTTPS)
50091
9869

NameNode(HTTP)
50070
9870

NameNode(HTTPS)
50470
9871

KMSのポート番号が変わったのは、HBaseのHMasterと被ったため。


シェルスクリプトの書き直し

CDHやHDPなど、BigTopを利用してビルドされたものにはinitスクリプトが用意されているため、サービスの起動停止にはinitスクリプトを利用しますが、素のApache Hadoopを利用する場合には、sbin/hadoop-daemon.sh, sbin/yarn-daemon.shなどを叩く必要がありました。

Hadoop 3ではこれらのスクリプトを直接叩くのは非推奨となり、代わりに--daemonオプションを利用します。--daemonオプションを利用したサービス起動・停止コマンドは以下のようになります。

$ hdfs --daemon start namenode

$ hdfs --daemon start datanode
$ yarn --daemon start resourcemanager
$ yarn --daemon start nodemanager

$ yarn --daemon stop nodemanager
$ yarn --daemon stop resourcemanager
$ hdfs --daemon stop namenode
$ hdfs --daemon stop datanode

また、環境変数周りが大きく変わりました。全体的にわかりやすいコードに書き換わっているのですが、それはつまり、過去のノウハウがリセットされているということになります。既にhadoop-env.shなどで環境変数をいじっている場合は注意が必要です。こちらについてはもう少し詳しく解説記事を書きたい気持ちです。


(追記) MapReduceのApplicationMasterが停止する問題

MapReduceジョブを動かしてみると、ApplicationMasterが落ちます。

$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.0-alpha2-SNAPSHOT.jar pi 5 10000

(snip)
2016-12-02 04:54:52,413 INFO mapreduce.Job: Job job_1480654443168_0001 failed with state FAILED due to: Application application_1480654443168_0001 failed 2 times due to AM Container for appattempt_1480654443168_0001_000002 exited with exitCode: 1
Failing this attempt.Diagnostics: Exception from container-launch.
Container id: container_1480654443168_0001_02_000001
Exit code: 1
Stack trace: ExitCodeException exitCode=1:
at org.apache.hadoop.util.Shell.runCommand(Shell.java:974)
at org.apache.hadoop.util.Shell.run(Shell.java:878)
at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:1172)
at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:293)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.launchContainer(ContainerLaunch.java:419)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:284)
at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:88)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

Container exited with a non-zero exit code 1. Last 4096 bytes of stderr :
Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster

これは、MAPREDUCE-6704などで報告されており、以下の設定を追加することで解決します。(デフォルト値にHADOOP_MAPRED_HOMEを追加)


yarn-site.xml

<property name="yarn.nodemanager.env-whitelist" value="JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME"/>


これがデフォルトで設定されていない理由は、YARNの設定にMapReduce specificな設定をデフォルトで入れてしまうのは良くないからです。

ちなみに、Hadoop 3ではこのようなコンパクトな形式のXMLファイルもサポートしています。(HADOOP-6964)


MapReduceで利用するメモリの設定が簡単になった

これまで、MapタスクやReduceタスクのヒープサイズを設定するときには


  • mapreduce.map/reduce.memory.mb (containerのメモリ設定)

  • mapreduce.map/reduce.java.opts (Javaヒープサイズの設定)

の両方を設定する必要がありました。Hadoop 3系ではどちらか1つ設定すれば、もう片方は自動的に設定されるようになりました。計算式は以下の通りです。

mapreduce.map/reduce.java.opts = mapreduce.map/reduce.memory.mb * mapreduce.job.heap.memory-mb.ratio


CLIの非互換性

Hadoop 2の間はCLIの出力は互換性をなるべく維持するようになっていましたが、Hadoop 3系になって互換性のない変更が入っています。例えば、


  • duコマンドで、レプリケーションを考慮したディスク使用量を表示するようになった (HADOOP-6857)

  • duコマンドの結果が整形された (HADOOP-11657)

  • fsckコマンドでドットが表示されなくなった (HDFS-2538)

何かのコマンドを実行した結果をパースしている人は要注意。


HFTP/HSFTPはなくなりました

WebHDFSを使ってください。


s3:// はなくなりました

s3a:// を使ってください。


Hadoopエコシステムとの連携

現時点では、ほぼ未対応です。詳細は以下のwikiをご確認ください。


参考資料へのリンク

公式ドキュメント

Hadoop Summit Tokyoでの、Hadoop 3に関する発表資料