无法使用mapreduce将HFiles加载到HBase中.LoadIncrementalHFiles.


我想使用 HBase

批量加载 API LoadIncrementalHFiles.doBulkLoad(new Path(), hTable)将我的 map-reduce 作业的输出插入到 HBase 表中。

我从映射器发出键值数据类型,然后使用 HFileOutputFormat 使用其默认化简器准备我的 HFile。

当我运行我的map-reduce作业时,它完成没有任何错误并创建输出文件,但是,最后一步 - 将HFiles插入HBase没有发生。我的地图缩减完成后,我收到以下错误:

13/09/08 03:39:51 WARN mapreduce.LoadIncrementalHFiles: Skipping non-directory hdfs://localhost:54310/user/xx.xx/output/_SUCCESS
13/09/08 03:39:51 WARN mapreduce.LoadIncrementalHFiles: Bulk load operation did not find any files to load in directory output/.  Does it contain files in subdirectories that correspond to column family names?

但我可以看到输出目录包含:

1. _SUCCESS
2. _logs
3. _0/2aa96255f7f5446a8ea7f82aa2bd299e file (which contains my data)

我不知道为什么我的散装机不从输出目录中选择文件。

下面是我的Map-Reduce驱动程序类的代码:

public static void main(String[] args) throws Exception{
    String inputFile = args[0];
    String tableName = args[1];
    String outFile = args[2];
    Path inputPath = new Path(inputFile);
    Path outPath = new Path(outFile);
    Configuration conf = new Configuration();
    FileSystem fs = FileSystem.get(conf);
    //set the configurations
    conf.set("mapred.job.tracker", "localhost:54311");
    //Input data to HTable using Map Reduce
    Job job = new Job(conf, "MapReduce - Word Frequency Count");
    job.setJarByClass(MapReduce.class);
    job.setInputFormatClass(TextInputFormat.class);
    FileInputFormat.addInputPath(job, inputPath);
    fs.delete(outPath);
    FileOutputFormat.setOutputPath(job, outPath);
    job.setMapperClass(MapReduce.MyMap.class);
    job.setMapOutputKeyClass(ImmutableBytesWritable.class);
    job.setMapOutputValueClass(KeyValue.class);
    HTable hTable = new HTable(conf, tableName.toUpperCase());
    // Auto configure partitioner and reducer
    HFileOutputFormat.configureIncrementalLoad(job, hTable);
    job.waitForCompletion(true);
    // Load generated HFiles into table
    LoadIncrementalHFiles loader = new LoadIncrementalHFiles(conf);
    loader.doBulkLoad(new Path(outFile), hTable);
}

怎样才能找出这里发生的错误的事情,我避免将数据插入到HBase?

最后,我想明白了为什么我的HFiles没有被倾倒到HBase中。以下是详细信息:

我的创建语句 ddl 没有任何默认列名,所以我的猜测是 Phoenix 将默认列系列创建为"_0"。我能够在我的HDFS/hbase目录中看到这个列系列。

但是,当我使用 HBase 的 LoadIncrementalHFiles API 从我的输出目录中获取文件时,它并没有选择以 col-family ("0") 命名的目录。我调试了 LoadIncrementalHFiles API 代码,发现它跳过了以 " 开头的输出路径中的所有目录(例如"_logs")。

我再次尝试了相同的方法,但现在通过指定一些列系列,一切都运行良好。我能够使用Phoenix SQL查询数据。

相关内容

  • 没有找到相关文章