加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

phoenix报错:PhoenixIOException:Failedafterattempts=36

(2018-08-08 23:31:00)
标签:

phoenix

sockettimeoutexcepti

phoenixioexception

calltimeout

分类: 大数据处理
详细报错信息:
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

        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

查看spark日志,发现有一个任务执行失败,失败的代码上下文如下,其中标红部分为失败的那一行:
    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){...}

错误分析:
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()

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有