在执行BulkLoad的时候报了如下的错误:
Exceptionin thread "main" java.lang.IllegalArgumentException: Cannot create a Pathfrom a null string atorg.apache.hadoop.fs.Path.checkPathArg(Path.java:122) atorg.apache.hadoop.fs.Path.<init>(Path.java:134) atorg.apache.hadoop.fs.Path.<init>(Path.java:88) atorg.apache.hadoop.hbase.mapreduce.HFileOutputFormat2.configurePartitioner(HFileOutputFormat2.java:591) atorg.apache.hadoop.hbase.mapreduce.HFileOutputFormat2.configureIncrementalLoad(HFileOutputFormat2.java:440) atorg.apache.hadoop.hbase.mapreduce.HFileOutputFormat2.configureIncrementalLoad(HFileOutputFormat2.java:405) atorg.apache.hadoop.hbase.mapreduce.HFileOutputFormat2.configureIncrementalLoad(HFileOutputFormat2.java:386) atcom.talkingdata.campaign.dev.hbase.BulkDriver.run(BulkDriver.java:42) atcom.talkingdata.campaign.dev.hbase.BulkDriver.main(BulkDriver.java:60) atsun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) atjava.lang.reflect.Method.invoke(Method.java:606) atorg.apache.hadoop.util.RunJar.run(RunJar.java:221) atorg.apache.hadoop.util.RunJar.main(RunJar.java:136)
使用的HBase版本是1.1.2.
从错误日志中可以看到导致这个问题的是HFileOutputFormat2类中的这一行:
PathpartitionsPath = new Path(conf.get("hbase.fs.tmp.dir"), "partitions_" + UUID.randomUUID());
关键是“hbase.fs.tmp.dir”这个配置信息。注意这个配置不是“hbase.tmp.dir”。“hbase.tmp.dir”是本地文件系统上的一个目录,“hbase.fs.tmp.dir”是HDFS上的一个目录。
在hbase-default.xml中找到的对应配置信息如下:
<property > <name>hbase.fs.tmp.dir</name> <value>/user/${user.name}/hbase-staging</value> <description>A stagingdirectoryin default filesystem (HDFS) for keepingtemporarydata. </description> </property>
问题在于这个配置对应的目录并不存在,根据一些建议手动设置了下这个配置:
conf.set("hbase.fs.tmp.dir", "/tmp/hbase-staging");
就这样,问题修复了。
下面是一些关于这个问题的讨论:
Set default value for hbase.fs.tmp.dir rather than fully depend on hbase-default.xml
Use HDFS for HFileOutputFormat2 partitioner’s path
############