1、WAL:write-ahead log 预写日志
灾难恢复,一旦服务器崩溃,通过重放log,即可恢复之前的数据(内存中还没有刷写到磁盘的数据);如果写入wal操作失败,整个操作就认为是失败。
因此,如果开启wal机制,写操作性能会降低;
如果关闭wal机制,数据在内存中未刷写到磁盘时,server突然宕机,产生数据丢失。
解决办法:不开启wal机制,手工刷新memstore的数据落地
//禁用WAL机制
put.setDurability(Durability.SKIP_WAL)
在数据写操作之后,调用flushTable操作,代替wal机制:
def flushTable(table:String,conf:Configuration):Unit={
var connection: Connection = null
var admin:Admin=null
connection=ConnectionFactory.createConnection(conf)
try{
admin=connection.getAdmin
//将数据从MemStore刷写到磁盘中
admin.flush(TableName.valueOf(table))
}catch{
case e:Exception=>e.printStackTrace()
}finally {
if(null!=admin){
admin.close()
}
}
}
2、利用HFile
直接使用Spark将DF/RDD的数据生成HFile文件,数据load到HBase里面。
注意:
<1> HFile在所有的加载方案里面是最快的,不过有一个前提——数据是第一次导入,表是空的,如果表中已经有了数据,HFile再导入到hbase的表中会触发split操作;
<2>输出部分key和value的类型必须是: < ImmutableBytesWritable, KeyValue>或者< ImmutableBytesWritable, Put>
//1.元数据DataFrame
//这里使用mapPartitions方法
val hbaseInfoRDD = logDF.rdd.mapPartitions(partition => {
partition.f