Перенос данных из HBase в файловую систему. (Запись выходного редуктора в локальную или файловую систему Hadoop) - PullRequest
1 голос
/ 08 декабря 2011

Моя цель - перенести данные из таблиц Hbase в плоские (скажем, в формате CSV) файлы. Я привык TableMapReduceUtil.initTableMapperJob (tableName, scan, GetCustomerAccountsMapper.class, Text.class, Result.class, работа); для сканирования через таблицу HBase и TableMapper for Mapper. Моя задача заключается в том, что я заставляю Reducer выводить значения строк (которые нормализованы в плоском формате) в локальную (или Hdfs) файловую систему. Моя проблема не в том, что я не вижу журналы Reducer и не вижу никаких файлов по пути, который я упомянул в Reducer.

Это моя вторая или третья работа по MR, и первая серьезная. После двухдневных попыток я все еще не знаю, как достичь своей цели.

Было бы здорово, если бы кто-то мог показать верное направление.

Вот мой код редуктора -

public void reduce(Text key, Iterable<Result> rows, Context context)
            throws IOException, InterruptedException {
FileSystem fs = LocalFileSystem.getLocal(new Configuration());
   Path dir = new Path("/data/HBaseDataMigration/" + tableName+"_Reducer" + "/" +        key.toString());

FSDataOutputStream fsOut = fs.create(dir,true);

for (Result row : rows) {
 try {
 String normRow = NormalizeHBaserow(
 Bytes.toString(key.getBytes()), row, tableName);
 fsOut.writeBytes(normRow);

//context.write(new Text(key.toString()), new Text(normRow));
  } catch (BadHTableResultException ex) {
    throw new IOException(ex);
}
}
fsOut.flush();          
fsOut.close();

Моя конфигурация для выхода редуктора

Path out = new Path(args[0] + "/" + tableName+"Global");
FileOutputFormat.setOutputPath(job, out);

Заранее спасибо - Панкс

1 Ответ

0 голосов
/ 08 декабря 2011

Почему бы не перейти к HDFS и после завершения использовать hdfs fs для экспорта файла

hadoop fs -get /user/hadoop/file localfile

Если вы хотите разобраться с этим в фазе сокращения, посмотрите эту статью в OutputFormat в InfoQ

...