nutch solrdedup

mapreduce已经开始工作,但是利用

bin/nutch solrdedup <solr url>

还是会报出这样的错误:

2015-03-18 20:45:21,844 INFO  solr.SolrDeleteDuplicates – SolrDeleteDuplicates: starting…
2015-03-18 20:45:21,845 INFO  solr.SolrDeleteDuplicates – SolrDeleteDuplicates: Solr url: http://b2:8983/solr
2015-03-18 20:45:22,521 WARN  util.NativeCodeLoader – Unable to load native-hadoop library for your platform… using builtin-java classes where applicable
2015-03-18 20:45:22,538 WARN  mapred.JobClient – No job jar file set.  User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
2015-03-18 20:45:26,238 WARN  mapred.FileOutputCommitter – Output path is null in cleanup
2015-03-18 20:45:26,919 INFO  solr.SolrDeleteDuplicates – SolrDeleteDuplicates: done.

我设置了JAVA_LIBRARY_PATH 依然有这个错误。需要去看util的代码,看看到底是库没找到还是库不对。

 

通过修改脚本runtime/local/bin/nutch , 打印出更多的信息,可以看到其中的java.library.path 指向了*/runtime/local/lib/native/Linux-amd64-64 , 而不是hadoop目录下的那个native,于是把hadoop目录下的native lib 考过来,在运行,可以看到native-hadoop已经被正确装载。剩下第二个问题还在。需要看mapred的job是怎样被设置的。

 

关于状态监控:

HDFS: b2:50070

hbase: b2:60010

jobtrack: b2:50030

为了搞清楚mapreduce的过程,试了试mapreduce的tutorial ,  按照提示编译并打包WordCount.java, 用下面的命令行来运行:

bin/hadoop jar /usr/joe/wordcount.jar org.myorg.WordCount /usr/joe/wordcount/input /usr/joe/wordcount/output

这个在我的hadoop中运行正常,并可以在页面http://b2:50030/看到job被正确的执行,而且job是在b3上执行的。

接下来,需要看Job Configuration , JobConf的设置和工作过程。当然还是那个tutorial 页面。

现在使用下面的命令来运行solrdedup , 但是依然有问题: (我修改了hadoop的脚本,将nutch中solr的jar路径加到了classpath中,所以,已经可以看到job被提交了,但是执行是出错了)

../hadoop-1.1.2/bin/hadoop jar ./runtime/local/lib/apache-nutch-2.3.jar org.apache.nutch.indexer.solr.SolrDeleteDuplicates http://b2.bagualu.net:8983/solr

这个问题可以通过修改SolrDeleteDuplicates.java 文件来修复,方法是在添加一行代码:


Job job = new Job(getConf(), “solrdedup”);

job.setJarByClass(SolrDeleteDuplicates.class);  //这一行是新加的

重新编译nutch就可以了。

接下来,还有问题:

Error: java.lang.ClassNotFoundException: org.apache.solr.client.solrj.SolrServerException
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:274)
at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:802)
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:847)
at org.apache.hadoop.mapreduce.JobContext.getInputFormatClass(JobContext.java:187)

根据最下面的那一层堆栈推知应该是InputFormatClass 找不到,这是个奇怪的问题,整个SolrDeleteDuplicate都找到了,居然找不到其中的一个类?后来想,大概是mapreduce在跑的时候找不到这个类,找到mapreduce的启动脚本,然后把apache-nutch-2.3.jar的路径加到了classpath中,重启mapreduce,这样在运行上面的命令,可以看到mapreduce的过程成功完成。

但是,我的solr检索的页面却一个也没有减少。看来每走一步都有坑呀…
目前状态是,将b2上的hadoop-1.1.2/conf/slaves 改为b2, 同时将mapreduce-site.xml 中的mapred.hosts 中只留下了b2.
然后在启动mapreduce,这样所有的mapreduce都会在b2机器上运行。

通过修改SolrDeleteDuplicates.java 中的reduce函数,打印出更多的信息,可以看到,updateRequest.deleteById(solrRecord.id) 已经执行,但是这个函数并没有真正的把solr中的index删除,应该需要进到solr的代码中或者设置中去检查下。



本文地址: http://www.bagualu.net/wordpress/archives/4242 转载请注明




发表评论

电子邮件地址不会被公开。 必填项已用*标注