たごもりすメモ

コードとかその他の話とか。

CDH3u2とCDH3b2がHDFSプロトコルにおいて非互換らしい

いま使っている環境(scribe + CDH3b2クラスタ)からHadoopクラスタを別のノード群で構成しなおすことになったのでCDH3u2で組んでみたんだけど、いざ相互接続をやるべー、と思ったらなんかscribedからHDFSに書き込みができない。
最初はよくあるネットワークや設定の問題かと思ったんだけど、あれこれ試してみたらタイトルのような状況らしいことがわかってきた。

以下、CDH3b2のノードを nodeX.cluster CDH3b2クラスタのNameNodeを nodeY.cluster CDH3u2クラスタのNameNodeを nodeZ.cluster と書くことにする。
また大前提として nodeX はCDH3b2で構成されたクラスタに普通に hadoop fs -ls できるし nodeZ はCDH3u2で構成されたクラスタに普通に hadoop fs -ls できる。

CDH3b2のノードからCDH3u2のクラスタへのアクセス

失敗する。

$ hadoop fs -fs hdfs://nodeZ.cluster:50071/ -ls /
Bad connection to FS. command aborted.
CDH3u2のノードからCDH3b2のクラスタへのアクセス

失敗する。

$ hadoop fs -fs hdfs://nodeY.cluster:50071/ -ls /
Bad connection to FS. command aborted. exception: Call to nodeY.cluster/10.0.xxx.xxx:50071 failed on local exception: java.io.EOFException
nodeXに仮のCDH3u2環境をつくってCDH3u2クラスタへアクセス

成功しちゃった。手順はざっと。~/configs/hadoop にCDH3u2クラスタ用の設定一式があると思いねえ。

$ cd /usr/local; tar xzf hadoop-0.20.2-cdh3u2.tar.gz
$ export HADOOP_HOME=/usr/local/hadoop-0.20.2-cdh3u2
$ export HADOOP_CONF_DIR=$HOME/configs/hadoop
$ export PATH=$PATH:/usr/local/hadoop-0.20.2-cdh3u2
$ hadoop fs -fs hdfs://nodeZ.cluster:50071/ -ls /
log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: /var/log/hadoop/SecurityAuth.audit (No such file or directory)
	at java.io.FileOutputStream.openAppend(Native Method)
	at java.io.FileOutputStream.<init>(FileOutputStream.java:177)
	at java.io.FileOutputStream.<init>(FileOutputStream.java:102)
	at org.apache.log4j.FileAppender.setFile(FileAppender.java:290)
	at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:164)
	at org.apache.log4j.DailyRollingFileAppender.activateOptions(DailyRollingFileAppender.java:216)
	at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:257)
	at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:133)
	at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:97)
	at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:689)
	at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:647)
	at org.apache.log4j.PropertyConfigurator.parseCatsAndRenderers(PropertyConfigurator.java:568)
	at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:442)
	at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:476)
	at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:471)
	at org.apache.log4j.LogManager.<clinit>(LogManager.java:125)
	at org.apache.log4j.Logger.getLogger(Logger.java:105)
	at org.apache.commons.logging.impl.Log4JLogger.getLogger(Log4JLogger.java:229)
	at org.apache.commons.logging.impl.Log4JLogger.<init>(Log4JLogger.java:65)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:529)
	at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:235)
	at org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:209)
	at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:351)
	at org.apache.hadoop.fs.FsShell.<clinit>(FsShell.java:53)
log4j:ERROR Either File or DatePattern options are not set for appender [DRFAS].
Found 2 items
drwxr-xr-x   - dareka supergroup          0 2011-10-25 17:17 /scribe
drwxr-xr-x   - dareka supergroup          0 2011-10-24 18:58 /var

なんかlog4jのエラーが出てるがどっかに /usr/local/hadoop (こっちはCDH3b2)を使う設定が残ってたんだろう。それはまあいいとして、HDFSの中身が見えてる。ぐええ。

結論

CDH3u2とCDH3b2の間ではHDFSプロトコルに互換性がない。beta3, update0, update1, update2 のどこで失われたかは知らんし調べる気力もない。
しかしへこむなー。scribedがlibhdfs使ってるので、CDH3u2と組合せて再コンパイルしないと。めんどくさい。