2016-12-03 2 views
1

У меня около 5 Тбайт данных, распределенных по 30 различным таблицам в HBase. Моим вариантом использования является то, что на основе двух конкретных столбцов в каждой таблице, которые являются YEAR, и Country i, я должен создать 5K различных текстовых файлов. Для этой цели я интегрировал HIVE и HBase, но извлечение из HIVE занимает очень много времени. Я должен закончить это в течение 10 часов. Ищем вашу идею, как этого достичь. У меня есть некоторые вопросы относительно этого.что является самым быстрым способом извлечения данных из HBase

  1. Интеграция с HIVE HBase - хороший подход?
  2. Извлечение данных из HBase с использованием mapreduce будет хорошей идеей?
  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 i.e Phoenix, о котором вы упомянули.

Вариант 4: Импала быстрее, но у вас есть определенные ограничения. поэтому исключено

Вариант 2: Из моего опыта работы с hbase я предлагаю извлекать данные из HBase с использованием mapreduce. т. е. ваш вариант 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

Я также обновил свой вопрос с импликацией. – SUDARSHAN

+0

понял, что вы пытаетесь сделать файл последовательности на основе результатов сканирования. Что вы пытаетесь сделать? можете ли вы привести некоторые данные примера? –