什么是从HBase中提取数据的最快方法

时间:2016-12-03 10:03:31

标签: mapreduce hive hbase impala phoenix

我有大约5TB的数据分布在HBase的30个不同的表中。 我的用例是基于每个表中的两个特定列,即YEAR和Country,我必须创建5K个不同的文本文件。 我为此目的整合了HIVE和HBase,但从HIVE中提取需要很长时间。 我必须在10个小时内完成。 寻求你的想法如何实现这一目标。 我对此有一些疑问。

  1. HIVE HBase整合是一种好方法吗?
  2. 使用mapreduce从HBase中提取数据会不错?
  3. 我不能使用Apache Phoenix,因为它没有与HBase一起发布。
  4. IMPALA也使用高内存,因此我的群集未配置。
  5. public int run(String[] args) throws Exception {
        int result = 0;
        if (hbaseConf == null)
            hbaseConf = getHbaseConfiguration();
        Job job = new Job(hbaseConf);
                job.setJarByClass(HBaseToFileDriver.class);
                job.setJobName("Importing Data from HBase to File:::" + args[0]);
            Scan scan = new Scan();
            scan.setCaching(5000); // 1 is the default in Scan, which will be bad
                           // for
                           // MapReduce jobs
            scan.setCacheBlocks(false); // don't set to true for MR jobs
            scan.addFamily(Bytes.toBytes("cf"));
    
            TableMapReduceUtil.initTableMapperJob(args[0], scan, MyMapper.class, null, null, job);
            // No reducers. Just write straight to output files.
            job.setNumReduceTasks(0);
            job.setOutputFormatClass(SequenceFileOutputFormat.class);
            job.setOutputKeyClass(ImmutableBytesWritable.class);
            job.setOutputValueClass(Result.class);
            FileOutputFormat.setOutputPath(job, new Path(args[1]));
    
            boolean b = job.waitForCompletion(true);
            if (!b) {
                throw new IOException("error with job!");
            }
            return result;
            }
        }
    

    HBase中的我的数据就像

    ���U"9����|Japan|2012   48433172245     1001371402      FundamentalSeries       NULL    NULL    139     238474518       1.65494205533344        Price2SFCFLPsr  NULL   False            3011645 1000190205      False   True    I       Japan   2012
    
    C��t�I�\���7|ThirdPartyPrivate|2009     48934711562     1001371402      FundamentalSeries       NULL    NULL    9       5631268 21.2315827835749        STCA_PoP       NULL     False           3011645 1000193170      False   True    I       ThirdPartyPrivate       2009
    
    
    �����^Z4Ga�|Japan|2013  48433158708     1001371402      FundamentalSeries       NULL    NULL    507     160531379       1.1248E10       STAX_TTM        500186  False  3011646  1000193168      False   False   I       Japan   2013
    
    
            G\�=�HO�S�|Japan|2008   48433173983     1001371402      FundamentalSeries       NULL    NULL    153     1961706488      0.500256556630127       RIBEIT_TTM     NULL     False           3011646 1000193016      False   False   I       Japan   2008
    
    
            �G��G�i0�]|Japan|2012   48433336633     1001371402      FundamentalSeries       NULL    NULL    894     3112047463      14.3904580667924        Ev2SEBIT_Avg5  NULL     False           3011645 1000190030      False   True    I       Japan   2012
    
    
            ���r����/8|Japan|2015   48433251137     1001371402      FundamentalSeries       NULL    NULL    200     2907364871      -46.9431625157866       SNOPA_YoY      NULL     False           3011646 1000423629      False   False   I       Japan   2015
    
    
    
    �)H�<�����t|Japan|2008  48433139729     1001371402      FundamentalSeries       NULL    NULL    1170    2604636883      0.267980759053007       PPE2ANOA        NULL   False            3011646 1001262486      False   False   I       Japan   2008
    
    
    
    'H�&�g���|Japan|2005    48433195827     1001371402      FundamentalSeries       NULL    NULL    147     450289107       0.540110660915134       Ev2SEBIT        NULL   False            3011645 1000190028      False   True    I       Japan   2005
    
    
    
    c�\��17ɟ�|Japan|2013    48433160145     1001371402      FundamentalSeries       NULL    NULL    885     2010667500      -19.6553084635268       SAMI_TTM_YoY    NULL   False            3011646 1000190297      False   False   I       Japan   2013
    
    
    j���}��||Japan|2010     48433159175     1001371402      FundamentalSeries       NULL    NULL    214     420693538       -17.3468681844827       SCOR_YoY        NULL   False            3011646 1000192789      False   False   I       Japan   2010
    

1 个答案:

答案 0 :(得分:2)

选项1:请注意hive hbase集成&amp;查询配置单元也会在场景后面使用mapreduce ...

但你没有对hive执行的mapreduce进行细粒度控制。

选项3:您还排除了选项3,即您提到过的Phoenix。

选项4:Impala速度更快,但您有一定的局限性。如此排除

选项2:根据我对hbase的经验,我提供了使用mapreduce从HBase中提取数据。即你的选项2,它将更精细地控制作业的执行。

但是在这种方法中你也需要调整你的工作。

scan.setCaching(500);
scan.setCacheBlocks(false); 
  • 最重要的是,您必须设计自己的排键以避免hot spotting并使用有效的过滤器(例如FuzzyRowFilter,例如参见here),以确保快速访问。
  • 尽量避免使用列值过滤器,以确保不会发生全表扫描。
  • 请注意,表的区域数等于为该特定作业启动的映射器数。所以将表格预分割到某个范围之间(例如0-9),这样你的所有行都会落在这些明确的区域之下(当然它可以进一步分成多个区域,但如果确保更少的数量,这是一种方法区域,因此所有的映射器都有足够数量的记录来处理...)

如果我理解正确的话。你想生成多个序列文件;

请参阅使用MultipleOutputs的使用模式。

see Usage pattern for job submission:

 Job job = new Job();

 FileInputFormat.setInputPath(job, inDir);
 FileOutputFormat.setOutputPath(job, outDir);

 job.setMapperClass(MOMap.class);
 job.setReducerClass(MOReduce.class);
 ...

 // Defines additional single text based output 'text' for the job
 MultipleOutputs.addNamedOutput(job, "text", TextOutputFormat.class,
 LongWritable.class, Text.class);

 // Defines additional sequence-file based output 'sequence' for the job
 MultipleOutputs.addNamedOutput(job, "seq",
   SequenceFileOutputFormat.class,
   LongWritable.class, Text.class);
 ...

 job.waitForCompletion(true);
 ...

When used in conjuction with org.apache.hadoop.mapreduce.lib.output.LazyOutputFormat, MultipleOutputs can mimic the behaviour of MultipleTextOutputFormat and MultipleSequenceFileOutputFormat from the old Hadoop API - ie, output can be written from the Reducer to more than one location.