2016-12-03 30 views
1

HBaseの30の異なるテーブルに約5TBのデータが分散されています。 私の使用例は、各テーブルのYEARである2つの特定の列に基づいており、国ごとに5Kの異なるテキストファイルを作成する必要があります。 私はこの目的でHIVEとHBaseを統合しましたが、HIVEからの抽出には非常に時間がかかります。 私は10時間以内にこれを終わらせなければなりません。 これを達成するためのアイデアを探してください。 私はこれに関するいくつかの質問があります。HBaseからデータを抽出する最も速い方法は何ですか

  1. HIVE HBaseの統合は良いアプローチですか?
  2. mapreduceを使用してHBaseからデータを抽出するとよいでしょうか?
  3. Apache PhoenixはHBa​​seでリリースされていないため使用できません。
  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を使用しますのでご注意ください...

しかし、ハイブで実行されたマップリダクションよりも細粒度のコントロールはありません。

オプション3:オプション3、つまりあなたが言及したフェニックスも除外しました。

オプション4:Impalaは高速ですが、特定の制限があります。したがって除外されました

オプション2:hbaseでの私の経験から、私はmapreduceを使用してHBaseからデータを抽出しています。つまり、ジョブの実行をより細かく制御するオプション2です。

ただし、この方法でもジョブを微調整する必要があります。

scan.setCaching(500); 
scan.setCacheBlocks(false); 
  • は、最も重要なのは、あなたはhot spottingを避け、(のようなFuzzyRowFilter例えばhereを参照)、高速アクセスを確保するための効率的なフィルタを使用するようにのrowKeyを設計する必要があります。
  • 列の値のフィルタをできるだけ避けて、完全な表のスキャンが行われないようにしてください。
  • テーブルの領域の数は、その特定のジョブに対して起動されたマッパーの数に等しいことに注意してください。そのため、すべての行がこれらの明確な領域に収まるように、テーブルをある範囲(たとえば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

は、スキャン結果に基づいてシーケンスファイルを作成しようとしていることを理解しています。何をしようとしていたのですか?あなたはいくつかの例のデータを与えることができますか? –

関連する問題