8

我正在尝试在 Windows 机器上使用带有 Nutch 的 Solr,但出现以下错误:

Exception in thread "main" java.io.IOException: Failed to set permissions of path: c:\temp\mapred\staging\admin-1654213299\.staging to 0700

从我了解到的很多线程中,nutch 似乎使用的 hadoop 具有一些chmod可以在 Unix 机器上工作的魔法,但在 Windows 上却不行。

这个问题已经存在一年多了。我找到了一个线程,其中显示了代码行并提出了修复建议。我真的只有他们一个有这个问题吗?所有其他人是否都在创建自定义构建以便在 Windows 上运行 nutch?或者是否有一些选项可以禁用 hadoop 的东西或其他解决方案?也许另一个爬虫而不是 nutch?

这是我正在做的事情的堆栈跟踪:

    admin@WIN-G1BPD00JH42 /cygdrive/c/solr/apache-nutch-1.6
    $ bin/nutch crawl urls -dir crawl -depth 3 -topN 5 -solr http://localhost:8080/solr-4.1.0
    cygpath: can't convert empty path
    crawl started in: crawl
    rootUrlDir = urls
    threads = 10
    depth = 3
    solrUrl=http://localhost:8080/solr-4.1.0
    topN = 5
    Injector: starting at 2013-03-03 17:43:15
    Injector: crawlDb: crawl/crawldb
    Injector: urlDir: urls
    Injector: Converting injected urls to crawl db entries.
    Exception in thread "main" java.io.IOException: Failed to set permissions of path:         c:\temp\mapred\staging\admin-1654213299\.staging to 0700
        at org.apache.hadoop.fs.FileUtil.checkReturnValue(FileUtil.java:689)
        at org.apache.hadoop.fs.FileUtil.setPermission(FileUtil.java:662)
        at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:509)
        at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:344)
        at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:189)
        at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:116)
        at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:856)
        at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:850)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Unknown Source)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
        at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:850)
        at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:824)
        at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1261)
        at org.apache.nutch.crawl.Injector.inject(Injector.java:281)
        at org.apache.nutch.crawl.Crawl.run(Crawl.java:127)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
        at org.apache.nutch.crawl.Crawl.main(Crawl.java:55)
4

5 回答 5

4

我花了一段时间才让它工作,但这是适用于 nutch 1.7 的解决方案。

  1. 从 maven 存储库下载Hadoop Core 0.20.2
  2. 替换$NUTCH_HOME/lib/hadoop-core-1.2.0.jar为下载的文件,将其重命名为相同的名称。

应该是这样的。

解释

此问题是由 hadoop 引起的,因为它假定您在 unix 上运行并遵守文件权限规则。这个问题实际上在 2011 年得到了解决,但 nutch 没有更新他们使用的 hadoop 版本。相关修复在这里这里

于 2014-02-07T20:49:41.130 回答
2

我们也在使用 Nutch,但它不支持在 Windows 上运行,在 Cygwin 上,我们的 1.4 版本也有类似的问题,比如 mapreduce。

我们通过在 Ubuntu 上使用 vm(虚拟机)以及 Windows 和 Linux 之间的共享目录来解决它,因此我们可以在 Windows 上开发和构建,并在 Linux 上运行 Nutch(爬行)。

于 2013-03-05T20:50:47.927 回答
1

我在 Windows 上运行 Nutch,没有自定义构建。虽然我已经很久没有使用它了。但是我花了一段时间才明白的一件事是,您需要以 Windows 管理员身份运行 cygwin 才能获得必要的权限。

于 2013-03-04T08:59:38.403 回答
1

我建议采用不同的方法。检查此链接。它解释了如何在 Windows 上吞下错误,并且不需要您降级 Hadoop 或重建 Nutch。我在 Nutch 2.1 上进行了测试,但它也适用于其他版本。我还制作了一个简单的 .bat 来启动爬虫和索引器,但它适用于 Nutch 2.x,可能不适用于 Nutch 1.x。

为了后代,该方法需要:

  1. 进行自定义LocalFileSystem实现:

    public class WinLocalFileSystem extends LocalFileSystem {
    
        public WinLocalFileSystem() {
            super();
            System.err.println("Patch for HADOOP-7682: "+
                "Instantiating workaround file system");
        }
    
        /**
         * Delegates to <code>super.mkdirs(Path)</code> and separately calls
         * <code>this.setPermssion(Path,FsPermission)</code>
         */
        @Override
        public boolean mkdirs(Path path, FsPermission permission)
                throws IOException {
            boolean result=super.mkdirs(path);
            this.setPermission(path,permission);
            return result;
        }
    
    
        /**
         * Ignores IOException when attempting to set the permission     
         */
        @Override
        public void setPermission(Path path, FsPermission permission)
                throws IOException {
            try {
                super.setPermission(path,permission);
            }
            catch (IOException e) {
                System.err.println("Patch for HADOOP-7682: "+
                    "Ignoring IOException setting persmission for path \""+path+
                    "\": "+e.getMessage());
            }
        }
    }
    
  2. 编译它并将 JAR 放在${HADOOP_HOME}/lib

  3. 然后通过修改注册它${HADOOP_HOME}/conf/core-site.xml

    fs.file.impl com.conga.services.hadoop.patch.HADOOP_7682.WinLocalFileSystem 为 Windows 上的 HADOOP-7682 问题启用补丁

于 2014-02-18T15:19:50.703 回答
0

您必须更改项目依赖项 hadoop-core 和 hadoop-tools。我正在使用 0.20.2 版本并且工作正常。

于 2014-03-03T13:49:58.573 回答