问题描述:
本人由于HbaseBulkloader方式写数据至hbase存储路径错误,导致Region in transition
//1
val Array(dataType, tableName, family, inputDir, outputDir)
= Array("1", "A", "FC", "/warehouse/A", "/apps/hbase/data/data/default/A")
......
//2
keyValuesRDD.saveAsNewAPIHadoopFile(
outputDir,
classOf[ImmutableBytesWritable],
classOf[KeyValue],
classOf[HFileOutputFormat2],
conf
)
......
//3
val load = new LoadIncrementalHFiles(conf)
load.doBulkLoad(outputPath, conn.getAdmin, table,
conn.getRegionLocator(htableName))
- 原来代码中读取hive表存储路径下文件生成RDD /warehouse/A
- 然后再写入outputDir地址下/apps/hbase/data/data/default/A 生成hfile文件
- 最后再将hfile文件加载至hbase表中
“/apps/hbase/data/data/default/A” 次路径为hbase存储路径,生成hfile文件时覆盖掉创建hbase表时目录下生成的
导致虽然当时数据可以查询,但是过一段时间 region信息丢失 导致regionserver挂掉,表中数据丢失
解决办法:
只要将saveAsNewAPIHadoopFile API中outputDir 改为其它路径,不影响hbase表存储的信息即可,
例如:
val Array(dataType, tableName, family, inputDir, outputDir)
= Array("1", "A", "FC", "/warehouse/A", "/tmp/hbase/A")