批量加载时间戳敏感数据HBase

时间:2018-06-15 12:55:43

标签: python scala apache-spark hbase

我们需要迁移到HBase中的大量历史数据。我们的HBase的设置是(时间戳)版本控制是相关的,并使用我们知道的不同列可用的一些领域知识。数据量是巨大的,所以我想知道这是一个很好的方式来做这个批量加载。 Scala或Python很好,最好使用Spark。

1 个答案:

答案 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的连接,以避免连接/断开每条记录。

希望这一切都是明智的,因为我将其作为仿制药的初学者来实现。