将带有参数的文件传递给mapreduce作业

k3fezbri  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(370)

我有一个Map缩小器。这个Map器应该使用一些只读参数集。假设我想计算输入行中某些子字符串(某事物的标题)的出现次数。我有一个成对的列表:“sometitle”=>“一个正则表达式从输入行提取这个标题”。这些对存储在通常的文本文件中。
将此文件传递给mapper的最佳方法是什么?我只有一个想法:
将成对的文件上载到hdfs。
使用-dpath.to.file.with.properties将路径传递到文件
在Map器的静态{}部分中,读取文件并填充Map对“some title”=>“regular expr for the title”。
是好是坏?请再见

a8jjtwal

a8jjtwal1#

你已经走上正轨了,但我建议你使用分布式缓存。它的目的正是为了实现这一点—将只读文件传递给任务节点。
将文件放入hdfs
将该文件添加到应用程序主方法中的分布式缓存中。
在mapper类中,重写 configure 或者 setup 方法,具体取决于您使用的api版本。在这种方法中,它可以从分布式缓存中读取数据并将所有内容存储在内存中。

ddarikpa

ddarikpa2#

这是我代码的一部分。请参阅将文件复制到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。我把它放到hdfs3上了。我使用-files参数4提供文件路径。我确实指定这个文件在hdfs中(hdfs://0.0.0.0:8020/httpsample/metadata.csv)

相关问题