如何最好地决定巨大字符串的映射器输出/缩减器输入

时间:2013-09-21 06:30:18

标签: java optimization hadoop hbase hadoop-partitioning

我需要改进我的MR工作,使用HBase作为源以及接收器。

基本上,我正在读取映射器中3个HBase表的数据,将它们写成一个巨大的字符串,以便reducer进行一些计算并转储到HBase表中。

Table1 ~ 19 million rows.
Table2 ~ 2 million rows.
Table3 ~ 900,000 rows.

mapper的输出是这样的:

HouseHoldId contentID name duration genre type channelId personId televisionID timestamp

这是Table1的1行。类似地,有1900万个映射器输出。

我有兴趣根据HouseHoldID值对它进行排序,所以我正在使用这种技术。我对对的V部分不感兴趣,所以我有点无视它。 我的mapper类定义如下:

public static class AnalyzeMapper extends TableMapper<Text, IntWritable> { }

为了完成我的MR工作,需要22个小时才能完成,这根本不可取。我应该以某种方式优化它以便以某种方式运行得更快..

scan.setCaching(750);        
scan.setCacheBlocks(false); 
TableMapReduceUtil.initTableMapperJob (
                                       Table1,           // input HBase table name
                                       scan,                   
                                       AnalyzeMapper.class,    // mapper
                                       Text.class,             // mapper output key
                                       IntWritable.class,      // mapper output value
                                       job);

TableMapReduceUtil.initTableReducerJob(
                                        OutputTable,                // output table
                                        AnalyzeReducerTable.class,  // reducer class
                                        job);
job.setNumReduceTasks(RegionCount);  

我的HBase Table1有21个区域,因此产生了21个映射器。我们正在运行一个8节点的cloudera集群。

我在这里做错了吗?

我应该使用自定义SortComparator或Group Comparator或类似的东西来提高效率吗?

0 个答案:

没有答案