2016-08-21 2 views
0


Как запустить MapReduce на результат HBase сканера с TableMapReduceUtil

Моя HBase таблица выглядит следующим образом:

key---------value 
    id1/bla  value1 
    id1/blabla value2 
    id2/bla  value3 
    id2/blabla value4 
    .... 

Есть миллион ключей, которые начинаются с id1 и миллионами ключа, которые начинаются с id2.

Я хочу прочитать данные из hbase с mapReduce, потому что есть много ключей, которые начинаются с того же идентификатора и 1 карты на один идентификатор, недостаточно хороши. Я предпочитаю 100 карт на Id

Я хочу, чтобы более одного картографа работало на том же сканере, который был отфильтрован по id. я прочитал о TableMapReduceUtil и попытался следующее:

Configuration config = HBaseConfiguration.create(); 
Job job = new Job(config,"ExampleSummary"); 
job.setJarByClass(MySummaryJob.class);  // class that contains mapper and reducer 

Scan scan = new Scan(); 
scan.setCaching(500);  // 1 is the default in Scan, which will be bad for MapReduce jobs 
scan.setCacheBlocks(false); // don't set to true for MR jobs 
// set other scan attrs 

TableMapReduceUtil.initTableMapperJob(
    sourceTable,  // input table 
    scan,    // Scan instance to control CF and attribute selection 
    MyMapper.class,  // mapper class 
    Text.class,   // mapper output key 
    IntWritable.class, // mapper output value 
    job); 


С функцией карты, которая будет выглядеть следующим образом (он должен перебирать результат сканера):

public static class MyMapper extends TableMapper<Text, IntWritable> { 

    private final IntWritable ONE = new IntWritable(1); 
    private Text text = new Text(); 

    public void map(ImmutableBytesWritable row, Result value, Context context) throws IOException, InterruptedException { 
      text.set("123");  // we can only emit Writables...  
      context.write(text, ONE); 
    } 
} 
<br> 



Мои вопросы:

  1. Как возможно, что функция карты получает входные данные Результат, а не ResultScanner? Я знаю, что результат сканирования можно повторить с помощью ResultScanner, который может быть итерирован по результату. В ResultScanner есть список \ массив результата, не так ли?
  2. Как я могу повторить результат сканера в функции карты?
  3. Как я могу контролировать количество раскола, которое будет выполнять эта функция. Если он откроет только 10 карт, и я хочу 20, можно ли что-то изменить?
  4. Есть ли простой способ достичь моей цели?

ответ

1

Начну с № 4 в списке:

поведение

по умолчанию для создания одного картографа каждого региона. Поэтому вместо того, чтобы пытаться взломать TableInputFormat в создание пользовательских разделов ввода на основе ваших спецификаций, вы должны сначала рассмотреть возможность разделения ваших данных на 100 регионов (и тогда у вас будет достаточно 100 карт).

Этот подход улучшает производительность чтения и записи, так как вы будете менее уязвимы для hotspotting (предполагая, что в вашем кластере более одного или двух серверов области).

Предпочтительным способом является предварительная разбивка таблицы (т. Е. Определение разделителей при создании таблицы).

+0

Звучит здорово, но мой стол уже создан с 1 областью, и теперь я не могу редактировать или воссоздавать его. – MosheCh

+0

Вам не нужно его воссоздать. Вы можете просто вызвать «split» повторно из оболочки hbase («help» split ») или веб-интерфейс веб-сервера области. –

+0

Я не уверен, правильно ли я понял. Я разделил таблицу с каким-то идентификатором, а затем, когда я сканирую таблицу - в фоновом режиме она будет выполнять mapreduce с количеством карт, равным количеству областей (split)? – MosheCh