引言:
Hbase 存储数据时,如果数据量不大可以通过 Get 批量载入,当数据量够大时可以采用 Bulkload 方式,提高载入效率。Bulkload 就像 Hive 的 load 一样,提供好规定格式的文件即可。
主程序:
这里生成的 HFile 是 keyValue 形式的,Get 形式也可以,实现起来需要用到 mr。需要注意的是 HFile 要存储在 HBase 相对应集群下。
1.配置 Spark 与 Hbase 连接
val argsMap = ArgsUtil.parseArgs(args)
val input = argsMap.getOrElse("input", "input")
val output = argsMap.getOrElse("output", "output")
// 配置Spark
val conf = new SparkConf().setAppName("doBulkLoad")
// spark 初始化
val sc = new SparkContext(conf)
// 获取 HTable
val tableName = "hTable"
val hbaseConf = HbaseUtil.getHbaseConf
val connection = HbaseUtil.getHConnection
val hTable = new HTable(new JobConf(hbaseConf), Bytes.toBytes(tableName))
2. doBulkLoad
// Do BulkLoad
try {
val regionLocator = connection.getRegionLocator(TableName.valueOf(tableName))
val job = Job.getInstance(hbaseConf)
job.setMapOutputKeyClass(classOf[ImmutableBytesWritable])
job.setMapOutputValueClass(classOf[KeyValue])
job.setOutputFormatClass(classOf[HFileOutputFormat])
job.getConfiguration.set("mapred.output.dir", output)
HFileOutputFormat2.configureIncrementalLoad(job, hTable, regionLocator)
val bulkLoader = new LoadIncrementalHFiles(hbaseConf)
bulkLoader.doBulkLoad(new Path(output), hTable)
} catch {
case t:Throwable => {
t.printStackTrace()
logError("Bulkload Failed..." + t.getStackTrace.mkString("\n"))
}
} finally {
hTable.close()
connection.close()
logInfo("Bulkload Finished...")
}
sc.stop()
Tip:
scala 实现其实就是照搬 java 实现的,如果程序无法完成,也可以通过 completebulkload 方式高效导入 HBase 表。