我想使用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的新手,我不知道应该如何解决这个问题。日志不会向我提供任何有关该信息的信息。
到目前为止我尝试了什么(没有结果):
谢谢。
答案 0 :(得分:2)
它声明无法写出文件'的父。您案例中的父母是/
。看一下来源:
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
答案 1 :(得分:1)
经过几天的努力,我解决了这个问题。
问题在于该行--output-dir hdfs:///hostname/dir/
。
首先,开始时我没有3个斜杠,因为我不断尝试完成这项工作,只有2个(如任何有效的HDFS URI)。实际上我添加了3个斜杠,因为否则,该工具会抛出无效的模式异常!您可以在this代码中轻松看到模式检查已完成之前 < em> verifyCanWriteParent 检查。
我尝试通过在运行该工具的Cent OS计算机上运行 hostname 命令来获取主机名。 此是主要问题。我分析了/ etc / hosts文件,我发现同一个本地IP有2个主机名。我拿了第二个,它起作用了。 (我还将端口附加到主机名,因此最终格式如下:--output-dir hdfs://correct_hostname:8020/path/to/file/from/hdfs
此错误非常混乱,因为无论您在哪里查找namenode主机名,您都会看到hostname命令返回的相同内容。此外,错误的结构不是您可以诊断问题并采用逻辑路径来解决问题。
有关此工具和调试的其他信息