我的EMR集群中的路径'hdfs:/// logs'中有很多日志文件。每个日志条目都是多行,但有一个起始和结束标记,用于在两个条目之间划分。 现在,
我有一个python脚本,可以简单地获取一个日志文件并做一个部分。和b。如上所述,但我没有写过任何地图制作者或缩减者。
Hive负责查询Mappers和Reducers。请告诉我是否以及如何使用python脚本在所有日志上运行它并将输出保存在'hdfs:/// outputlogs'中?
我是Map Reduce的新手,已经看过一些Word计数的例子,但他们都有一个输入文件。我在哪里可以找到包含多个输入文件的示例?
答案 0 :(得分:1)
在这里,我看到你有两个问题:
有多个文件作为输入
如果您传入多个单词计数示例,则相同的单词计数示例将起作用
文件作为输入。事实上,您可以非常轻松地传递folder name
输入而不是文件名,在您的情况下为hdfs:///logs
。
您甚至可以将逗号分隔的路径列表作为输入传递给 这不是使用以下内容:
FileInputFormat.setInputPaths(conf, new Path(args[0]));
您可以使用以下内容:
FileInputFormat.setInputPaths(job, args[0]);
请注意,只传递分隔为args[0]
的逗号列表
足够的。
如何将您的逻辑转换为mapreduce
这确实有一个陡峭的学习曲线,因为你需要思考
关键和价值观。但我觉得你可以拥有所有的
映射器本身的逻辑并且有一个IdentityReducer
,如下所示:
conf.setReducerClass(IdentityReducer.class);
如果您花一些时间阅读以下位置的示例, 你应该更好地做出这些决定:
答案 1 :(得分:1)
正如Amar所说,长期正确的做法是写一个MapReduce工作来做这件事。
但是,如果这是一次性的事情,并且数据不是太大,那么使用简单的bash脚本执行此操作可能是最简单/最简单的,因为您已经拥有了python脚本:
hadoop fs -text /logs/* > input.log
python myscript.py input.log output.log
hadoop fs -copyFromLocal output.log /outputlogs
rm -f input.log output.log
如果这是一个重复的过程 - 你想要可靠和有效的东西 - 或者你只是想学习更好地使用MapReduce,那么坚持使用Amar的答案。
答案 2 :(得分:1)
如果您已经编写了逻辑,并且想要使用EMR和/或vanilla Hadoop进行并行处理 - 您可以使用Hadoop流:http://hadoop.apache.org/docs/r0.15.2/streaming.html。简而言之 - 将数据输入stdin并将输出输出到stdout的脚本可以成为映射器。
因此,您将使用群集在HDFS中运行数据处理,而无需重新打包代码。