phoenix报错:PhoenixIOException:Failedafterattempts=36
(2018-08-08 23:31:00)
标签:
phoenixsockettimeoutexceptiphoenixioexceptioncalltimeout |
分类: 大数据处理 |
详细报错信息:
at
org.apache.phoenix.util.ServerUtil.parseServerException(ServerUtil.
at
org.apache.phoenix.iterate.TableResultIterator.next(TableResultIterator.
at
org.apache.phoenix.iterate.LookAheadResultIterator$1.advance(LookAheadResultIterator.
at
org.apache.phoenix.iterate.LookAheadResultIterator.init(LookAheadResultIterator.
at
org.apache.phoenix.iterate.LookAheadResultIterator.next(LookAheadResultIterator.
at
org.apache.phoenix.jdbc.PhoenixResultSet.next(PhoenixResultSet.
at
org.apache.phoenix.mapreduce.PhoenixRecordReader.nextKeyValue(PhoenixRecordReader.
... 42 more
val hdfsPath = new
Path(hdfsAddr)
if (hdfs.exists
(hdfsPath)) hdfs.delete(hdfsPath, true)
val timeInfo =
getTimeStrForHDFS()
val path = hdfsPath +
"/" + timeInfo + "/"
rdd.saveAsTextFile(hadoopUrlbase + path)
val cnm =
rdd.count()
if(cnm >
minCnt){...}
Caused by: org.apache.phoenix.exception.PhoenixIOException:
Failed after attempts=36, exceptions:
Wed Aug 08 16:51:32 CST 2018, null,
java.net.SocketTimeoutException: callTimeout=60000,
callDuration=60108: row
'^C4d09cc2d-81d1-e388-e72a-a13d090cd267-1533578464.618' on table
'ACTIONTABLE_17749' at
region=ACTIONTABLE_17749,\x03,1533529993759.0653c213307118cbd6dbfbb08b4c59db.,
hostname=sp28,16020,1532991915572, seqNum=118078
查看spark日志,发现有一个任务执行失败,失败的代码上下文如下,其中标红部分为失败的那一行:
错误分析:
1、从错误日志来看,错误是因为phoenix读取数据超时,导致数据读取不成功,从而进一步导致整个程序失败。
但是,其他程序也通过同一个函数读取相关数据,并且没有报错。
那么,是不是该程序在读取的时候,其他程序刚好也在读取同一个表的数据,导致IO繁忙程序挂掉。
但是,该程序无论何时执行都会报一连串的phoenix超时错误,所以应该不是程序间的影响导致的。
那么,是不是程序内部的bug导致的呢?
2、细看上面标红的代码,这一行代码是一个action操作,同时下一行代码又来了count这样一个action操作。因为spark惰性求值的原因,这两个action操作可能是并行的而不是串行的,这样会导致rdd值会计算两遍,这样会导致hbase表的数据会重复读两遍。因为读的过程中是有锁机制的,所以会导致其中一个线程读取失败从而导致phoenix读取超时。
解决方案:将rdd的值写入内存,保证只计算一次。
rdd.cache()
rdd.saveAsTextFile(hadoopUrlbase + path)
val cnm = rdd.count()
前一篇:初识python-opencv
后一篇:线性代数精华浓缩