在实际生产环境中,将计算和存储进行分离,是我们提高集群吞吐量、确保集群规模水平可扩展的主要方法之一,并且通过集群的扩容、性能的优化,确保在数据大幅增长时,存储不能称为系统的瓶颈。
具体到我们实际的项目需求中,有一个典型的场景,通常会将Hive中的部分数据,比如热数据,存入到HBase中,进行冷热分离处理。
我们采用Spark读取Hive表数据存入HBase中,这里主要有两种方式:
-
通过HBase的put API进行数据的批量写入
-
通过生成HFile文件,然后通过BulkLoad方式将数据存入HBase
HBase的原生put方式,通过HBase集群的region server向HBase插入数据,但是当数据量非常大时,region会进行split、compact等处理,并且这些处理非常占用计算资源和IO开销,影响性能和集群的稳定性。
HBase的数据最终是以HFile的形式存储到HDFS上的,如果我们能直接将数据生成为HFile文件,然后将HFile文件保存到HBase对应的表中,可以避免上述的很多问题,效率会相对更高。
本篇文章主要介绍如何使用Spark生成HFile文件,然后通过BulkLoad方式将数据导入到HBase中,并附批量put数据到HBase以及直接存入数据到HBase中的实际应用示例。
1. 生成HFile,BulkLoad导入
1.1 数据样例
{"id":"1","name":"jack","age":"18"}
{"id":"2","name":"mike","age":"19"}
{"id":"3","name":"kilos","age":"20"}
{"id":"4","name":"tom","age":"21"}
...
1.2 示例代码
/**
* @Author 微信公众号:大数据学习与分享
*/
object App {
def main(args: Array[String]): Unit = {
System.setProperty("HADOOP_USER_NAME", "root")
val sparkSession = SparkSession
.builder()
.config("spark.serializer", "org.apach