大数据IMF传奇行动绝密课程第120课:Spark Streaming性能优化:如何在End-to-End生产环境下安全高效地把结果数据存入HBase中

Spark Streaming性能优化:如何在End-to-End生产环境下安全高效地把结果数据存入HBase中

1、生产环境下End-to-End的流处理程序
2、Spark Streaming安全高效写入HBase

Spark Streaming插入HBase之所以高效的原因?
在End to End的流处理程序中为何选择把流处理的结果存放在HBase?
向HBase中存储数据的过程如下:对于每一次的数据插入操作都会放在内存缓存MemStore,MemStore达到上限的时候,HBase会将其中的数据输出到本地的名称为StoreFile的文件中。此时是不是已经存储在HBase集群中了呢?在HBase中是通过Column Family来组织数据的(其数据结构为Store),也就是说每个Column Family来组织数据的(其数据结构为Store),也就是说每个Column中有一个Store而一个Store中有很多来自于StoreFile的文件,HBase的工作机制是当StoreFile达到一定上限的时候会使用线程对这些小的StoreFile合并成为大的File,这就导致HBase插入数据非常高效;所以HBase在生产环境下是Streaming外部存储介质的一种非常理想的选择,尤其是在数据量特别大的时候且J2EE或者移动端要实时查询海量Spark Streaming处理结果就特别适合!

Spark Streaming往HBase中写入数据的初步的模拟代码
dstream.foreachRDD( rdd=> {
if(!rdd.isEmpty) {
rdd.foreachPartition( partition => {
val conn = pool.getTable(tableName)
partition.foreach( record => {
streaming2hbase(zk,table,row,family,key,value)
//创建put进行批量提交
})
conn.return2pool
}

    )
}

})

操作HBase的时候每次都是基于table进行操作,HTable是HBase的客户端,HTable的弊端在于适合单表操作,但是在多线程的读写环境下不是线程安全的,执行Put操作,如果是多个线程共享一个HTable的实例的话,由于不是线程安全,这会导致写到缓冲区数据冲突,其实我们在这里已经使用了线程池来维护HTable连接,这个问题已经基本不存在了,但其实还是有一个非常重要的性能消耗点可以优化?在内部创建HTable的时候需要HConnection,这个实例对象的创建是非常耗时的(其实HTable是轻量级的消耗),此时我们可以有以下的考虑:
1、只有一个HConnection实例对象,所有的HTable都基于这个HConnection实例对象来构建;
2、基于HConnection对象实例让所有的线程来共享,这就会极大的节省不必要的资源浪费;

把HConnection对象作为线程池的全局共享对象,也就是说使用HConnection.getTable来获取具体的实例;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值