我想使用cloudera的mapreduceindexer工具来理解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的新手,不知道该如何处理这个问题。日志没有给我任何信息。
我迄今为止所做的尝试(没有结果):
创建了一个由2个目录(/dir/dir2)组成的层次结构,并对这两个目录都设置了777个权限
已更改hdfs的输出目录架构://。。。至hdfs://... 因为--help菜单中的所有示例都是这样构建的,但这会导致无效的模式错误
谢谢您。
2条答案
按热度按时间svujldwt1#
它声明“无法写入文件的父级”。你的父母是
/
. 查看来源:在打印的信息中
file
,对你来说hdfs:/hostname/dir
,所以file.getParent()
将/
.此外,您还可以尝试使用
hadoop fs
命令,例如,您可以尝试在以下路径中创建长度为零的文件:92vpleto2#
经过几天的努力,我解决了那个问题。
问题在于那条线
--output-dir hdfs:///hostname/dir/
.首先,在开始的时候没有3个斜杠,因为我一直在努力使它工作,只有2个斜杠(就像在任何有效的hdfsuri中一样)。实际上我放了3个斜杠,因为否则,该工具会抛出一个无效的模式异常!在这段代码中,您可以很容易地看到模式检查是在verifycanwriteparent检查之前完成的。
我试图通过在运行工具的cent os机器上运行hostname命令来获取主机名。这是主要问题。我分析了/etc/hosts文件,发现同一个本地ip有两个主机名。我拿了第二个,成功了(我还将端口附加到主机名,因此最终格式如下:
--output-dir hdfs://correct_hostname:8020/path/to/file/from/hdfs
这个错误非常混乱,因为无论在哪里查找namenode主机名,都会看到hostname命令返回的内容。此外,这些错误的结构并不是您可以诊断问题并采用逻辑路径解决问题的方式。有关此工具及其调试的其他信息
如果您想查看其背后运行的实际代码,请检查您正在运行的cloudera版本,并在官方存储库中选择相同的分支。主人不是最新的。
如果您只想运行这个工具来使用morphline(通过使用--dry run选项),而不连接到solr并使用它,那么您不能。您必须指定zookeeper端点和solr集合或solr config目录,这需要进行额外的研究。这是一个可以改进的工具。
您不需要使用-u hdfs运行该工具,它可以与普通用户一起使用。