Hadoop 使用或不使用Hive在Amazon EMR中处理日志
我的EMR集群中有很多日志文件,路径为'hdfs:///logs'. 每个日志条目都有多行,但有一个开始和结束标记来区分两个条目。 现在,Hadoop 使用或不使用Hive在Amazon EMR中处理日志,hadoop,hive,hadoop-streaming,emr,Hadoop,Hive,Hadoop Streaming,Emr,我的EMR集群中有很多日志文件,路径为'hdfs:///logs'. 每个日志条目都有多行,但有一个开始和结束标记来区分两个条目。 现在, 并非日志文件中的所有条目都有用 有用的条目需要转换,输出需要存储在输出文件中,以便我以后可以高效地查询(使用配置单元)输出日志 我有一个python脚本,它可以简单地获取一个日志文件并执行a部分。和b。上面提到过,但我没有写过任何映射器或还原器 Hive负责其查询的映射器和还原器。请告诉我是否可以以及如何使用python脚本在所有日志上运行它并将输出保存在'
我是MapReduce新手,见过一些单词计数的示例,但它们都有一个输入文件。在哪里可以找到包含多个输入文件的示例?在这里,我发现您有两个问题:
- 有多个文件作为输入
如果您传入多个单词,则相同的单词计数示例也会起作用
文件作为输入。事实上,您可以非常轻松地将
文件夹名称作为 在您的案例中,输入而不是文件名
例如,您甚至可以传递一个以逗号分隔的路径列表作为输入 这将代替使用以下内容:hdfs:///logs
FileInputFormat.setInputPath(conf,新路径(args[0])代码> 您可以使用以下选项:
FileInputFormat.setInputPath(作业,参数[0])代码> 请注意,只传递逗号列表,分隔为
够了args[0]
- 如何将逻辑转换为mapreduce
这确实有一个陡峭的学习曲线,你需要仔细思考
关键字和值的术语。但我觉得你可以拥有所有的
映射器本身中的逻辑,并具有一个
,如下所示:IdentityReducer
conf.setReducerClass(IdentityReducer.class)代码> 如果您花时间阅读以下位置的示例, 您应该能够更好地做出以下决定:
- ()
- 有多个文件作为输入
如果您传入多个单词,则相同的单词计数示例也会起作用
文件作为输入。事实上,您可以非常轻松地将
文件夹名称作为 在您的案例中,输入而不是文件名
例如,您甚至可以传递一个以逗号分隔的路径列表作为输入 这将代替使用以下内容:hdfs:///logs
FileInputFormat.setInputPath(conf,新路径(args[0])代码> 您可以使用以下选项:
FileInputFormat.setInputPath(作业,参数[0])代码> 请注意,只传递逗号列表,分隔为
够了args[0]
- 如何将逻辑转换为mapreduce
这确实有一个陡峭的学习曲线,你需要仔细思考
关键字和值的术语。但我觉得你可以拥有所有的
映射器本身中的逻辑,并具有一个
,如下所示:IdentityReducer
conf.setReducerClass(IdentityReducer.class)代码> 如果您花时间阅读以下位置的示例, 您应该能够更好地做出以下决定:
- ()
- 在这里,我看到您有两个问题:
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的答案。长期正确的方法是,正如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的答案。如果您已经编写了逻辑,并且希望使用EMR和/或香草Hadoop进行并行处理—您可以使用Hadoop流:。简言之,您的脚本将数据导入stdin并输出到stdout,这可以成为一个映射器
因此,您将使用集群在HDFS中运行数据处理,而无需重新打包代码
如果您已经编写了逻辑,并且希望使用EMR和/或香草Hadoop进行并行处理,则可以使用Hadoop流:。简言之,您的脚本将数据导入stdin并输出到stdout,这可以成为一个映射器
因此,您将使用集群在HDFS中运行数据处理,而无需重新打包代码