gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:33:24 25 4
gpt4 key购买 nike

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

我从我的映射器发出 KeyValue 数据类型,然后使用 HFileOutputFormat 使用其默认缩减器准备我的 HFile。

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

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)

我不知道为什么我的 bulkloader 没有从输出目录中选择文件。

下面是我的 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?

最佳答案

最后,我弄清楚了为什么我的 HFile 没有被转储到 HBase 中。以下是详细信息:

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

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

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

关于java - 无法使用 mapreduce.LoadIncrementalHFiles 将 HFiles 加载到 HBase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18683150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com