自定义分区程序中的一个reducer使mapreduce作业变慢

时间:2017-03-30 08:27:58

标签: hadoop mapreduce hbase hadoop2

您好我有一个从HBase读取记录并写入文本文件的应用程序。 应用程序正在按预期工作,但在对大数据进行测试时,需要1.20小时才能完成工作。 以下是我的申请详情

  1. HBase中的数据大小为400 GB,约为2亿条记录。
  2. 我在HBase tabl中创建了400个区域,因此有400个映射器。
  3. 我使用自定义分区程序将记录放入194个文本文件中。
  4. 我有用于地图输出的lzo压缩和用于final的gzip 输出。
  5. 我在行键
  6. 中使用了md5哈希

    我使用自定义分区程序进行数据隔离。 我有194分区和减速器,所有减速器都很快完成,除了最后两个由于条件而具有非常大的记录数。

    我不知道如何处理这种情况。

    我的条件是这样两个分区将获得大量的记录,我也无法改变它。

    所有减速器在3分钟内完成,但由于整体工作需要30分钟的时间。

    这是我的实施

    hbaseConf.set("mapreduce.map.output.compress", "true");
    hbaseConf.set("mapreduce.map.output.compress.codec", "org.apache.hadoop.io.compress.SnappyCodec");
    
    FileOutputFormat.setOutputCompressorClass(job, GzipCodec.class);
    

    我的分区逻辑在这里

    if (str.contains("Japan|^|2017|^|" + strFileName + "")) {
    
        return 0;
    
    } else if (str.contains("Japan|^|2016|^|" + strFileName + "")) {
    
        return 1;
    
    } else if (str.contains("Japan|^|2015|^|" + strFileName + "")) {
    
        return 2;
    
    } else if (str.contains("Japan|^|2014|^|" + strFileName + "")) {
    
        return 3;
    
    } else if (str.contains("Japan|^|2013|^|" + strFileName + "")) {
    
        return 4;
    }
    

0 个答案:

没有答案