2016-12-03 71 views
1

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

  1. HIVE HBase整合是好方法吗?
  2. 使用mapreduce从HBase提取数据将是个好主意吗?
  3. 我不能使用Apache Phoenix,因为它没有与HBase一起发布。
  4. IMPALA也使用高内存,所以我的集群未配置。

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 

回答

2

选项1:请注意,蜂巢HBase的整合&查询蜂巢也将使用MapReduce的幕后...

但是你对配置单元执行的mapreduce没有很好的纹理控制。

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

选项4:Impala速度更快但您有一定的限制。所以排除

选项2:出于我对hbase的经验,我提供使用mapreduce从HBase中提取数据。即您的选项2将对工作的执行给予更细粒度的控制。

但是在这种方法中,你也必须微调你的工作。

scan.setCaching(500); 
scan.setCacheBlocks(false); 
  • 更重要的是你要设计你的rowkey避免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.

+0

是居然有人乐于助人。我正在实施它。我有一个疑问,我必须根据密钥中的扫描过滤器创建不同的文本文件。我该怎么做? – SUDARSHAN

+0

我已经用implmentation更新了我的问题。 – SUDARSHAN

+0

了解到您正在尝试根据扫描结果制作序列文件。您试图执行的操作是什么?你能举一些例子数据吗? –

相关问题