HadoopのCould not find any valid local directoryにハマる
これ,これで3回目くらい同じハマり方をしてる気がする...
私はPentium Mobileの古いノートPCがメインサーバなので,ディスク容量も少ないです.
だから,シングルノードセットアップをして,
http://hadoop.apache.org/common/docs/current/single_node_setup.html
サンプルを叩いただけで...
$ ./bin/hadoop jar hadoop-mapred-examples-0.21.0.jar grep input output 'dfs[a-z.]+'
(バージョンも悪かった...0.21.0はひどい...)
途中でこんなエラーが出ます.
Could not find any valid local directory for output/hogehogehoge...
Java系はデフォルトで/tmpを使いまくるので,一杯になってました...rootになって
# rm -fR /tmp/*
ってやるとサンプルが動きました.
$ cat output/* 1 dfsadmin
どれ,次は擬似分散モード...と思ったら,おっと.
$ hadoop namenode -format DEPRECATED: Use of this script to execute hdfs command is deprecated. Instead use the hdfs command for it. (中略) Storage directory /tmp/hadoop-hadoop/dfs/name has been successfully formatted. ls -l /usr/local/lib/hadoop-0.21.0/bin/hdfs -rwxr-xr-x 1 hadoop hadoop 4130 Aug 17 13:56 /usr/local/lib/hadoop-0.21.0/bin/hdfs ls -l /usr/local/lib/hadoop-0.20.2/bin/hdfs ls: cannot access /usr/local/lib/hadoop-0.20.2/bin/hdfs: No such file or directory /usr/local/lib/hadoop-0.21.0/bin/hdfs Hadoop common not found.
これ...バグっぽい...hdfsコマンドからはhdfs-config.shがすぐに呼ばれて,hdfs-config.shでは$HADOOP_COMMON_HOMEというディレクトリの存在を確認しているのですが,$HADOOP_COMMON_HOMEって,まだどこでも定義されていないのでHadoop common not foundになっています.
適当にhdfs-config.shの中で
export HADOOP_HDFS_HOME="${HADOOP_HDFS_HOME:-$bin/..}" export HADOOP_COMMON_HOME=$HADOOP_HDFS_HOME
とかやってクリア.
$ /usr/local/lib/hadoop/bin/hdfs Usage: hdfs [--config confdir] COMMAND where COMMAND is one of: namenode -format format the DFS filesystem secondarynamenode run the DFS secondary namenode namenode run the DFS namenode datanode run a DFS datanode dfsadmin run a DFS admin client fsck run a DFS filesystem checking utility balancer run a cluster balancing utility jmxget get JMX exported values from NameNode or DataNode. oiv apply the offline fsimage viewer to an fsimage fetchdt fetch a delegation token from the NameNode Use -help to see options
では改めまして...
$ /usr/local/lib/hadoop/bin/hdfs namenode -format
(中略)
Storage directory /tmp/hadoop-hadoop/dfs/name has been successfully formatted.
(後略)
2度目以降だと
Re-format filesystem in /tmp/hadoop-hadoop/dfs/name ? (Y or N)
と聞いてきますが,ここは大文字小文字が区別されるので注意.
デーモンスタート.
$ /usr/local/lib/hadoop/bin/start-all.sh
This script is Deprecated. Instead use start-dfs.sh and start-mapred.sh
あれ,こっちも変わったのね...やりなおしましょう.
$ /usr/local/lib/hadoop/bin/stop-all.sh
This script is Deprecated. Instead use stop-dfs.sh and stop-mapred.sh
(後略)
$ /usr/local/lib/hadoop/bin/start-dfs.sh
starting namenode, logging to /usr/local/lib/hadoop/bin/../logs/hadoop-hadoop-namenode-regge.out
/usr/local/lib/hadoop/bin/start-mapred.sh
Hadoop common not found.
こいつもかっ.こっちはmapred-config.shに一行追加して...
export HADOOP_MAPRED_HOME="${HADOOP_MAPRED_HOME:-$bin/..}" export HADOOP_COMMON_HOME=$HADOOP_MAPRED_HOME
$ /usr/local/lib/hadoop/bin/start-mapred.sh
starting jobtracker, logging to /usr/local/lib/hadoop/bin/../logs/hadoop-hadoop-jobtracker-regge.out
(後略)
$ hadoop fs -ls
10/12/27 19:58:44 INFO security.Groups: Group mapping impl=org.apache.hadoop.security.ShellBasedUnixGroupsMapping; cacheTimeout=300000
10/12/27 19:58:45 WARN conf.Configuration: mapred.task.id is deprecated. Instead, use mapreduce.task.attempt.id
ls: Cannot access .: No such file or directory.
またdeprecated...
まぁ,
$ hadoop fs -put conf input
10/12/29 15:10:43 INFO security.Groups: Group mapping impl=org.apache.hadoop.security.ShellBasedUnixGroupsMapping; cacheTimeout=300000
10/12/29 15:10:43 WARN conf.Configuration: mapred.task.id is deprecated. Instead, use mapreduce.task.attempt.id
hadoop@regge:/usr/local/lib/hadoop$ hadoop fs -ls .
10/12/29 15:10:59 INFO security.Groups: Group mapping impl=org.apache.hadoop.security.ShellBasedUnixGroupsMapping; cacheTimeout=300000
10/12/29 15:11:00 WARN conf.Configuration: mapred.task.id is deprecated. Instead, use mapreduce.task.attempt.id
Found 1 items
drwxr-xr-x - hadoop supergroup 0 2010-12-29 15:10 /user/hadoop/input
putも出来て結果もoutputに入ってるのでよしとしましょう.