【问题标题】:Pass file with parameters to mapreduce job将带有参数的文件传递给 mapreduce 作业
【发布时间】:2012-09-30 09:55:22
【问题描述】:

我有一个 mapreduce 映射器。这个 Mapper 应该使用一些只读参数。 假设我想计算输入行中某些子字符串(某物的标题)的出现次数。 我确实有一个配对列表:“一些标题”=>“从输入行中提取此标题的正则表达式”。 这些对存储在通常的文本文件中。

将此文件传递给 Mapper 的最佳方法是什么? 我只有这个想法:

  1. 将文件成对上传到 hdfs。
  2. 使用 -Dpath.to.file.with.properties 将路径传递给文件
  3. 在映射器读取文件的静态{}部分并填充映射对“some title”=>“regular expr for the title”。

是好是坏?请多多指教

【问题讨论】:

    标签: java configuration hadoop mapreduce


    【解决方案1】:

    您已步入正轨,但我建议您使用 distributed cache. 它的目的正是为了这个 - 将只读文件传递给任务节点。

    1. 将文件放入 HDFS
    2. 在应用程序的 main 方法中将该文件添加到分布式缓存中。
    3. 在 Mapper 类中,根据您使用的 API 版本覆盖 configure 或 setup 方法。在这种方法中,它可以从分布式缓存中读取并将所有内容存储在内存中。

    【讨论】:

    • 如果您使用 ToolRunner 实用程序类来启动您的应用程序,您还可以使用 -files 参数来获取作业提交过程,以便为您将本地文件上传到 HDFS(到作业 tmp目录),然后将其配置为在 dist 缓存上。它也将使用相同的名称进行符号链接,因此您可以从当前工作目录(在您的映射器代码中)读回它
    【解决方案2】:

    这是我的代码的一部分。 查看将文件复制到 HDFS 并启动 mr-job 的脚本。我确实在 maven 集成测试阶段使用 ant: scp, ssh 目标将此脚本上传到 hadoop 节点。

    #dummy script for running mr-job
    hadoop fs -rm -r /HttpSample/output
    hadoop fs -rm -r /HttpSample/metadata.csv
    hadoop fs -rm -r /var/log/hadoop-yarn/apps/cloudera/logs
    #hadoop hadoop dfs -put /home/cloudera/uploaded_jars/metadata.csv /HttpSample/metadata.csv
    hadoop fs -copyFromLocal  /home/cloudera/uploaded_jars/metadata.csv /HttpSample/metadata.csv
    hadoop fs -copyFromLocal  /home/cloudera/uploaded_jars/opencsv.jar /HttpSample/opencsv.jar
    hadoop fs -copyFromLocal  /home/cloudera/uploaded_jars/gson.jar /HttpSample/gson.jar
    #Run mr job
    cd /home/cloudera/uploaded_jars
    #hadoop jar scoring-job.jar ru.megalabs.mapreduce.scoringcounter.Main -libjars gson.jar -files hdfs://0.0.0.0:8020/HttpSample/metadata.csv -libjars hdfs://0.0.0.0:8020/HttpSample/opencsv.jar, hdfs://0.0.0.0:8020/HttpSample/gson.jar /HttpSample/raw_traffic.json /HttpSample/output/scoring_result
    hadoop jar scoring-job.jar ru.megalabs.mapreduce.scoringcounter.Main -files hdfs://0.0.0.0:8020/HttpSample/metadata.csv -libjars hdfs://0.0.0.0:8020/HttpSample/opencsv.jar,hdfs://0.0.0.0:8020/HttpSample/gson.jar /HttpSample/raw_traffic.json /HttpSample/output/scoring_result
    

    还有Mapper里面的代码:

    public class ScoringCounterMapper extends Mapper<LongWritable, Text, GetReq, IntWritable> {
    
        private static final Log LOG = LogFactory.getLog(ScoringCounterMapper.class);
    
        private static final String METADATA_CSV = "metadata.csv";
    
        private List<RegexMetadata> regexMetadatas = null;
    
        private final static IntWritable one = new IntWritable(1);
    
        public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    //bal-bla-lba
    }
    
        @Override
        protected void setup(Context context) throws IOException, InterruptedException {
        MetadataCsvReader metadataCsvReader = new MetadataCsvReader(new File(METADATA_CSV));
        regexMetadatas = metadataCsvReader.getMetadata();
        for(RegexMetadata rm : regexMetadatas){
            LOG.info(rm);   
        }
    
    
        }
    }
    

    看到: 1. 我确实将我的元数据文件上传到节点 2. 我确实把它放到了 HDFS 3. 我确实使用 -Files 参数提供了文件路径 4. 我确实指定此文件在 HDFS 内 (hdfs://0.0.0.0:8020/HttpSample/metadata.csv)

    【讨论】:

      猜你喜欢
      • 2015-05-06
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 2016-01-25
      相关资源
      最近更新 更多