(八)spark常见问题解决

sparkstreaming常见问题解决

1:Initial job has not accepted any resources; check your cluster UI to ensure that workers are registe

原因:资源不足
解决:关闭不用的application ,减少executor和memory的内存

2: last exception:org.apache.hadoop.hbase.RegionTooBusyException

INFO   - #1,waiting for 1976  actions to finish on table: da_http_msisdn_rt_202032w_online
2020-08-07 09:31:09,802 - org.apache.hadoop.hbase.client.AsyncProcess -63616953 [HBaserService-pool1-t438]
INFO   - #1, table=index, attempt=10/35 failed=1976ops, last exception: org.apache.hadoop.hbase.RegionTooBusyException: 
org.apache.hadoop.hbase.RegionTooBusyException: Above memstore limit, regionName=index,1e40000000000000000:
20200805224119:\x00>\x00;wd3d3\x00\x05W0\x0A,1596763798210.206ca2fdff683174bc1fb64314f2140d., server=hostname,21302,1596699455474, 
memstoreSize=723066928, blockingMemStoreSize=536870912
at org.apache.hadoop.hbase.regionserver.HRegion.checkResources(HRegion.java:3906)

region数量或者region大小或者数据rowkey不合理导致的数据热点,请求集中问题。
可在hbase的原生界面查看具体的region请求数,是否存在请求集中再进一步分析

1:异常原因分析:

一般来说memstore超过hbase.hregion.memstore.flush.size(默认128M),会flush形成HFile。当写入数据过快时,导致产生大量HFile,当HFile数量超过配置hbase.hstore.blockingStoreFiles(默认10),hbase会进行compaction(合并)hfile,compaction合并时会阻塞memstore flush操作,阻塞最长时长hbase.hstore.blockingWaitTime(默认值90000,即90s),当超过该时间后,如果compaction还未完成,memstore flush也会停止阻塞。

但是正是在flush阻塞这段时间内,一直写入导致memstore的大小超过了上限blockingMemStoreSize:

blockingMemStoreSize=hbase.hregion.memstore.flush.size*hbase.hregion.memstore.block.multiplier(默认为4=512M,

此时,region将拒绝所有写请求,所以客户端抛出RegionTooBusyException,并在一定时间后重试。

2:具体原因及解决
原因1:预建region太少

原因:hbase数据热点问题,或者没有对hbase的表进行预分区,导致region数量太少,一批次大量数据写入导致的region繁忙。
解决:2.1:对hbase的表建表时进行预分区,预建region数量,避免分裂:

原因2:region过大

查看region大小:hbase-site.xml的hbase.hregion.max.filesize的配置一般10G即可,我见过60G大小的导致的数据热点。不建议过大

查看region大小:hdfs dfs -count /hbase/data/namespace/tableName/regionName
namespace可看hbase原生界面获取
原因3:rowkey设计不合理,或者数据不合理导致的热点问题

排查数据问题以及rowkey

3:问题解决

寻找适合自己的解决办法

2.1:rowkey不合理则重新设计排查数据原因和生成的rowkey
2.2:hbase客户端修改表配置提高限制,执行三条命令:
   disable 'tableName'
   alter 'tableName', CONFIGURATION => {'hbase.region.store.parallel.put.limit.min.column.count' => 200, 'hbase.region.store.parallel.put.limit' => 100}
   enable 'tableName'
2.3:进行参数配置调优
 (1).在hbase内存允许的前提下,提高hbase.hregion.memstore.block.multiplier参数(默认一般4),在flush阻塞的这段时间,允许更多的数据写到memstore。
        风险:增加了regionserver oom概率,修改该参数,需要进行大数据量写入测试。
        	hbase.hregion.memstore.block.multiplier=8
    		hbase.hregion.memstore.flush.size=268435456
(2).减少阻塞时间hbase.hstore.blockingwaittime(比如到30s),加快memstore flush到hdfs上的速度,从而减少memstore数据大小触碰到上限的时间,也就能减少拒绝写请求的时间。
        风险:1、增加了compaction的压力,
	         2、占用磁盘IO,可能会影响到其他服务。
	         hbase.hstore.blockingWaitTime=60000
(3).调大compaction的合并压缩线程数,提高hfile的合并速度,可以翻倍
	hbase.regionserver.thread.compcation.large=10(默认5)
	hbase.regionserver.thread.compcation.small=20(默认10)
2.4:手动执行compaction合并
	hbase shell 进入hbase客户端执行:major_compact 'region名','列簇名'
	会进行异步合并。完成可在hbase原生界面的表里面的Table Attributes的compaction状态,完成是NONE
2.5:查看写入方式是否为bulkload,适合大数据量的导出导入

3:java.lang.IllegalStateException: No current assignment for partition topic

原因:同一groupid在消费同一topic导致额偏移量问题。
解决:停止程序修改groupid

4:java.io.IOException:No space left on device

程序运行日志存储目录的磁盘爆满导致数据没法写入,程序异常。同时可能会有lost task等问题

1:查看appliction_ID
2:找到日志目录在hadoop/data/nm/containnerlogs/appliction_ID
3:删除日志:rm -rf  hadoop/data*/nm/containnerlogs/appliction_ID
4:清理日志重启程序
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值