请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

spark mapPartitions里面打开与关闭数据库连接的问题

我想做的是获取log数据,然后解析每一条log之后进行相关统计。在解析过程中我需要打开hbase,读取其中的数据(比如装有特定ip地址的表,但是这个表不唯一,很难将全部表放入广播变量中传入各个节点)。

所以解析的过程我用mapPartitions(log -> 解析后数据),以此来减少从hbase连接池获取的连接的次数,因为hbase 连接池采用了单例模式,所以初始化很多次都没有问题。但是!!!问题来了,hbase连接池不主动关闭的话,spark程序结束之后,服务器可能不会马上知道,可能会引发问题。所以我就想知道手动关闭hbase连接池的相关代码应该写在哪里。

ps:mapPartitions里面进行解析的时候,很容易OOM,我猜想是因为我把解析后的数据放入一个list,这个list对象是一直在内存中处理的,不会写入磁盘,所以我们想要舍弃mapPartitions方法,只用map方法。虽然我们允许hbase连接池初始化很多次(因为单例模式),但是如果在map里面关闭连接池,那就真的关掉了。很难办。

综合起来就是,对比MR的clean up部分代码,spark里面的clean up在哪里写比较好呢?

对于这个问题,请问大佬们什么见解?

正在回答

1回答

1)“但是!!!问题来了,hbase连接池不主动关闭的话,spark程序结束之后,服务器可能不会马上知道,可能会引发问题”! 你说的是可能会引发问题,那么能确定引发什么问题不?如果有遇到问题,可以把异常信息贴出来。

2)spark里面的clean up在哪里写比较好呢, 你只要spark应用程序中使用钩子函数捕获到SparkContext的关闭事件就可以了

0 回复 有任何疑惑可以回复我~
  • 提问者 aaaaabbbc #1
    1)问题不严重,只是log中会记录一条错误信息
    
    2)钩子只能在driver程序端捕获关闭事件,但是到不了打开hbase连接的进程内部,所以无法在进程内关闭连接池
    
    3) 感谢老师的点拨,要不我换一种方式描述我面临的问题好了
    回复 有任何疑惑可以回复我~ 2018-10-31 17:37:52
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信