我们需要迁移到HBase中的大量历史数据。我们的HBase的设置是(时间戳)版本控制是相关的,并使用我们知道的不同列可用的一些领域知识。数据量是巨大的,所以我想知道这是一个很好的方式来做这个批量加载。 Scala或Python很好,最好使用Spark。
答案 0 :(得分:1)
我发布了一个gist,可以帮助你完成大部分工作。我将在这里重现最相关的方法:
def write[TK, TF, TQ, TV](
tableName: String,
ds: Dataset[(TK, Map[TF, Map[TQ, TV]])],
batch: Int = 1000
)(implicit
fk: TK => HBaseData,
ff: TF => HBaseData,
fq: TQ => HBaseData,
fv: TV => HBaseData
): Unit = {
ds.foreachPartition(p => {
val hbase = HBase.getHBase
val table = hbase.getTable(TableName.valueOf(tableName))
val puts = ArrayBuffer[Put]()
p.foreach(r => {
val put = new Put(r._1)
r._2.foreach( f => {
f._2.foreach( q => {
put.addColumn(f._1, q._1, q._2)
})
})
puts += put
if (puts.length >= batch) {
table.put(puts.asJava)
puts.clear()
}
})
if (puts.nonEmpty) {
table.put(puts.asJava)
puts.clear()
}
table.close()
})
}
需要注意的是,此方法仅在其默认行为中使用HBase时间戳,因此必须将其扩展为包括提供自己的时间戳。基本上,只需将TV
类型转换为Map[Long, TV]
,然后添加适当的其他嵌套循环。
HBaseData
类型是case class
,其中包含几种隐式方法,可以将最常见的类型转换为Array[Byte]
,以实现高效的HBase存储。
getHbase
方法确保每个分区只有一个与HBase的连接,以避免连接/断开每条记录。
希望这一切都是明智的,因为我将其作为仿制药的初学者来实现。