Как запустить 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>
Мои вопросы:
- Как возможно, что функция карты получает входные данные Результат, а не ResultScanner? Я знаю, что результат сканирования можно повторить с помощью ResultScanner, который может быть итерирован по результату. В ResultScanner есть список \ массив результата, не так ли?
- Как я могу повторить результат сканера в функции карты?
- Как я могу контролировать количество раскола, которое будет выполнять эта функция. Если он откроет только 10 карт, и я хочу 20, можно ли что-то изменить?
- Есть ли простой способ достичь моей цели?
Звучит здорово, но мой стол уже создан с 1 областью, и теперь я не могу редактировать или воссоздавать его. – MosheCh
Вам не нужно его воссоздать. Вы можете просто вызвать «split» повторно из оболочки hbase («help» split ») или веб-интерфейс веб-сервера области. –
Я не уверен, правильно ли я понял. Я разделил таблицу с каким-то идентификатором, а затем, когда я сканирую таблицу - в фоновом режиме она будет выполнять mapreduce с количеством карт, равным количеству областей (split)? – MosheCh