使用happybase执行scan()报错RetriesExhaustedException解决
来源:互联网 发布:编程真好玩 dk出版社 编辑:程序博客网 时间:2024/06/08 00:22
python脚本
# encoding: utf-8import os, timeimport sysimport happybaseCURRENT_DIR = os.path.abspath(os.path.dirname(__file__))sys.path.insert(0, CURRENT_DIR + "/../")HBASE_HOST = "172.30.1.200"HBASE_HOST_2 = "172.30.1.201"try: conn = happybase.Connection(HBASE_HOST, autoconnect=False) conn.open()except: conn = happybase.Connection(HBASE_HOST_2, autoconnect=False) conn.open() passtest_table = "test_namespace:test_table"table_name = conn.table(test_table)print connprint "TTTTTTTTTTTT TABLE:", table_nameprint "\n________________conn.tables():\n", conn.tables()end_time = time.time()print "未扫描操作,总耗时:%s sec\n" % (end_time - start_time)start_time2 = time.time()scan_obj = table_name.scan()end_num = 1for k,v in scan_obj: print k, " || \n", v end_num += 1 if end_num > 3: breakend_time2 = time.time()print "\n扫描3行,总耗时:%s sec" % (end_time2 - start_time2)#conn.close() # 无需手动关闭连接,否则报错Exception AttributeError: "'NoneType' object has no attribute 'sendall'" in <generator object scan at 0x7f96e9d7c730> ignored
执行Python脚本happybase_test_HbaseScan.py的输出————
TTTTTTTTTTTT TABLE: < happybase.table.Table name=’test_namespace:table_name’>
从输出结果和python脚本可知,问题出现在 table_name.scan() 这个方法。下面是排查过程————
【检查相关服务是否正常】
登入hbase web UI检查,各个HMaster正常运行,各个Region Server运行正常,各个相关进程都在;hdfs集群各个data node都运行正常。
【检查1】
根据上面爆出的日志(message=”org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=36, exceptions:\nTue Dec 26 09:54:18 CST 2017, null, java.net.SocketTimeoutException: callTimeout=180000
原因可能是zookpeeper上的父节点不存在了,导致客户端连接尝试36次之后仍找不到zk的注册节点,超时断开。然后查看hbase-site.xml配置文件中的zookeeper.znode.parent
发现”/hbase-unsecure”是在的(配成/hbase-unsecure而不是/hbase-secure是因为我们的Enable Authentication未使用kerberos安全策略,只是使用Simple,如果使用了kerberos就需要把zookeeper.znode.parent配成/hbase-secure)。
所以这个原因排除掉。
【检查2】
既然报错信息中提到了java.net.SocketTimeoutException: callTimeout=180000,那么查看一下hbase-site.xml 中的hbase.client.scanner.timeout.period,发现是180000ms,即180秒,
这应该就是直接导致这种错误的原因了。
【检查3】
报错中有Failed after attempts=36,到Ambari查看客户端的Maximum Client Retries(客户端最大重试)次数为35
【解决】
要么增加hbase.client.scanner.timeout.period的值;
要么减少scan获取的记录数,因为扫描过多数量的记录会导致时间过长,一旦超过timeout的值就会出异常、断开连接。
建议:使用rowkey查询,而不要用scan() 。如果非要用scan也要用参数限定扫描范围,例如start_row、end_row、limit,可以减少查询时间。