nutch on hadoop 遇到 ls: 无法访问data/segments: 没有那个文件或目录

将nutch部署在hadoop上运行


bin/crawl hdfs://localhost:9000/user/hadoop/urls data http://localhost:8983/solr/ 1


在generator完成之后,提示:


ls: 无法访问data/segments/: 没有那个文件或目录
Operating on segment : 
Fetching : 

打开HDFS查看,发现明明有这个目录存在。

百思不得其解

在各种百度,google无解之后,想到了查看nutch的源码。

查看了一下crawl脚本的文件内容:

# determines whether mode based on presence of job file

mode=local
if [ -f ../*nutch-*.job ]; then
    mode=distributed
fi

......

  if [ $mode = "local" ]; then
   SEGMENT=`ls $CRAWL_PATH/segments/ | sort -n | tail -n 1`
  else
   SEGMENT=`hadoop fs -ls $CRAWL_PATH/segments/ | grep segments |  sed -e "s/\//\\n/g" | egrep 20[0-9]+ | sort -n | tail -n 1`
  fi
  
  echo "Operating on segment : $SEGMENT"

试了一下

hadoop fs -ls $CRAWL_PATH/segments/ | grep segments |  sed -e "s/\//\\n/g" | egrep 20[0-9]+ | sort -n | tail -n 1
在终端上运行结果正确。然后我就怀疑是模式就选错了mode,即mode的值是local而非distributed。

于是我在脚本中加了

echo $mode

于是发现...输出了local

再认真研读脚本选择mode的代码

# determines whether mode based on presence of job file

mode=local
if [ -f ../*nutch-*.job ]; then
    mode=distributed
fi
发现,mode选择distributed的条件是,父目录中有 nutch .job 这个文件。

仔细一看自己的命令...

bin/crawl ....

应该是用 ./crawl 才能让脚本正常检测到 nutch .job那个文件。


进入bin,并将命令改成

./crawl hdfs://localhost:9000/user/hadoop/urls data http://localhost:8983/solr/ 1

即可正常运行。



Linux不会,不熟,真可怕...(脚本写得差,真可怕...脚本都不输出一些关键信息来帮助程序员判断。哎...)




阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页