1

mapreduceマッパーを持っています。このマッパーは、読み取り専用パラメーターのセットを使用する必要があります。入力行でのいくつかのサブストリング(何かのタイトル)の出現をカウントしたいとします。ペアのリストがあります: "some title"=>"入力行からこのタイトルを抽出するための正規表現"。これらのペアは通常のテキストファイルに保存されます。

このファイルをマッパーに渡す最良の方法は何ですか?私はこの考えしか持っていません:

  1. ペアのファイルをhdfsにアップロードします。
  2. -Dpath.to.file.with.propertiesを使用してファイルへのパスを渡します
  3. マッパーのstatic{}セクションでファイルを読み取り、マップペア「sometitle」=>「regularexprforthetitle」を入力します。

良いですか悪いですか?adivceしてください

4

2 に答える 2

4

順調に進んでいますが、分散キャッシュを使用することをお勧めします。その目的はまさにこれのためです-読み取り専用ファイルをタスクノードに渡します。

  1. ファイルをHDFSに入れる
  2. そのファイルを、アプリケーションのメインメソッドの分散キャッシュに追加します。
  3. Mapperクラスで、使用しているAPIのバージョンに応じて、configureまたはメソッドのいずれかをオーバーライドします。setupその方法では、分散キャッシュから読み取り、すべてをメモリに保存できます。
于 2012-10-01T17:12:48.883 に答える
1

これが私のコードの一部です。ファイルをHDFSにコピーし、mr-jobを起動するスクリプトを参照してください。ant:scp、sshターゲットを使用して、Mavenの統合テストフェーズ中にこのスクリプトを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

そしてマッパー内のコード:

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)

于 2012-10-07T12:13:10.690 に答える