Hadoop 使用或不使用Hive在Amazon EMR中处理日志

Hadoop 使用或不使用Hive在Amazon EMR中处理日志,hadoop,hive,hadoop-streaming,emr,Hadoop,Hive,Hadoop Streaming,Emr,我的EMR集群中有很多日志文件,路径为'hdfs:///logs'. 每个日志条目都有多行,但有一个开始和结束标记来区分两个条目。 现在, 并非日志文件中的所有条目都有用 有用的条目需要转换,输出需要存储在输出文件中,以便我以后可以高效地查询(使用配置单元)输出日志 我有一个python脚本,它可以简单地获取一个日志文件并执行a部分。和b。上面提到过,但我没有写过任何映射器或还原器 Hive负责其查询的映射器和还原器。请告诉我是否可以以及如何使用python脚本在所有日志上运行它并将输出保存在'

我的EMR集群中有很多日志文件,路径为'hdfs:///logs'. 每个日志条目都有多行,但有一个开始和结束标记来区分两个条目。 现在,

  • 并非日志文件中的所有条目都有用
  • 有用的条目需要转换,输出需要存储在输出文件中,以便我以后可以高效地查询(使用配置单元)输出日志
  • 我有一个python脚本,它可以简单地获取一个日志文件并执行a部分。和b。上面提到过,但我没有写过任何映射器或还原器

    Hive负责其查询的映射器和还原器。请告诉我是否可以以及如何使用python脚本在所有日志上运行它并将输出保存在'hdfs:///outputlogs”“是吗


    我是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)

          如果您花时间阅读以下位置的示例, 您应该能够更好地做出以下决定:

          • ()

        长期正确的方法是,如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的答案。

        长期正确的方法是,正如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中运行数据处理,而无需重新打包代码