MapReduceIndexerTool 输出目录错误 "Cannot write parent of file"

MapReduceIndexerTool output dir error "Cannot write parent of file"

我想使用 Cloudera 的 MapReduceIndexerTool 来了解 morphlines 的工作原理。我创建了一个基本的 morphline,它只从输入文件中读取行,我尝试 运行 使用该命令的工具:

hadoop jar /opt/cloudera/parcels/CDH/lib/solr/contrib/mr/search-mr-*-job.jar org.apache.solr.hadoop.MapReduceIndexerTool \
    --morphline-file morphline.conf                                                                                  \
    --output-dir hdfs:///hostname/dir/                                          \
    --dry-run true

Hadoop 安装在我 运行 这个命令所在的同一台机器上。

我得到的错误如下:

net.sourceforge.argparse4j.inf.ArgumentParserException: Cannot write parent of file: hdfs:/hostname/dir
at org.apache.solr.hadoop.PathArgumentType.verifyCanWriteParent(PathArgumentType.java:200)

/dir目录的权限是777,肯定是允许写入的。我不知道我应该怎么做才能让它写入那个输出目录。

我是 HDFS 的新手,我不知道该如何解决这个问题。日志没有向我提供任何相关信息。

到目前为止我尝试了什么(没有结果):

谢谢。

它表示 'cannot write parent of file'。而你的 parent 是 /。查看源代码:

private void verifyCanWriteParent(ArgumentParser parser, Path file) throws ArgumentParserException, IOException {
  Path parent = file.getParent();
  if (parent == null || !fs.exists(parent) || !fs.getFileStatus(parent).getPermission().getUserAction().implies(FsAction.WRITE)) {
    throw new ArgumentParserException("Cannot write parent of file: " + file, parser);
  }
}    

在打印的消息中是 file,在您的情况下是 hdfs:/hostname/dir,因此 file.getParent() 将是 /

此外,您可以使用 hadoop fs 命令尝试权限,例如,您可以尝试在路径中创建一个零长度文件:

hadoop fs -touchz /test-file

经过几天的努力,我解决了这个问题。

问题出在那一行 --output-dir hdfs:///hostname/dir/

  1. 首先,在我不断尝试完成这项工作时,开头没有 3 个斜杠,只有 2 个(与任何有效的 HDFS URI 一样)。实际上我放了 3 个斜线,因为 否则,该工具会抛出一个无效的架构异常! 您可以在 this 代码中轻松地看到架构检查在 之前完成 verifyCanWriteParent 检查。

  2. 我试图通过简单地 运行 在 Cent OS 机器上使用 hostname 命令来获取主机名 运行打开工具。 是主要问题。我分析了 /etc/hosts 文件,发现同一个本地 IP 有 2 个主机名。我拿了第二个,它起作用了。 (我还将端口附加到主机名,所以最终格式如下:--output-dir hdfs://correct_hostname:8020/path/to/file/from/hdfs

  3. 这个错误非常令人困惑因为无论你在哪里寻找namenode主机名,你都会看到与主机名命令相同的东西returns。此外,错误的结构化方式使您无法诊断问题并采取合乎逻辑的途径来解决问题。

有关此工具及其调试的其他信息

  • 如果您想查看 运行 背后的实际代码,请检查您正在 运行ning 和 select [=13= 上的同一分支的 cloudera 版本].主人不是最新的。
  • 如果你只想 运行 这个工具来玩吗啉(通过使用 --dry-运行 选项)而不连接到 Solr 并玩它,你不能.您必须指定一个 Zookeeper 端点和一个 Solr 集合或一个 solr 配置目录,这涉及到额外的研究工作。这是这个工具可以改进的地方。
  • 您不需要 运行 使用 -u hdfs 的工具,它适用于普通用户。