问题1:

org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 5

datart 连接hbase connectionloss for /hbase/master_RPC

    从堆栈日志中可以看出,是BlockStoreShuffleReader在读取Shuffle到磁盘上的数据的时候发生的错误。从源码中可以看出,MapStauts==null才会跑出这个异常,而MapStatus为什么是null是因为Executor挂了:

datart 连接hbase connectionloss for /hbase/master_datart 连接hbase_02

    Executor挂了的原因可能是因为某些个Partition的太大,导致Task处理需要很长时间,从而引起长时间的GC或者JVM崩溃了。Executor lost会爆出Failed to connect host错误。

解决方法有如下几个:

  1. 增加Partition数量,本人就是通过这种方式解决了
  2. 判断下是否是数据倾斜,有条件的话,增加Executor的内存
  3. 使用一些减少Shuffle的算子

 

 

问题2:

Spark 拉取HBase数据时,Executor端报错java.net.socketTimeoutExection:

datart 连接hbase connectionloss for /hbase/master_客户端_03

同时HBase的RegionServer端也报错:lease *** does not exist

datart 连接hbase connectionloss for /hbase/master_服务端_04

 

这两个问题都是超时问题,解决方法如下:

    连接HBase的Configuration设置下面两个参数:

        conf.setInt("hbase.rpc.timeout",7200000)

        conf.setInt("hbase.client.scanner.timeout.period",7200000)//HBase1.1之前为“hbase.regionserver.lease.period”

 

下面来解释下这两个参数的含义:

hbase.rpc.timeout:

    表示一次RPC请求的超时时间,如果超过这个时间,客户端就会关闭socke,服务端就会抛出一个异常:java.io.IOException:Connection reset by peer。由于个人程序中给Spark配置了很多Core,高并发的读给HBase服务端造成了很大的压力,导致请求无法处理发生超时,默认是60000ms

 

hbase.client.scanner.timeout.period:

lease机制(租约机制)。

在整个Scan的过程中,客户端其实都在占用着服务端的资源。如果客户端崩溃了,那么服务端检测到超过了设置的配置时间之后,就会销毁lease并释放Scan所持有的全部资源,客户端再发送RPC请求来之后,相应的lease已经不存在了,就会抛出leaseExecption。

 

还有一个hbase.client.operation.timeout:

    表示除了Scan以外,其他一次数据操作的总的超时时间,数据操作可以是Get、Put、Delete等等,一次操作也可以包含多个RPC请求。