使用happybase扫描远程hbase表时,会发生“tsocket read 0 bytes error”

eqzww0vc  于 2021-06-09  发布在  Hbase
关注(0)|答案(2)|浏览(593)

我正在尝试扫描具有超过100000000行的远程hbase表。扫描后,使用扫描行,尝试在hdfs中使用csv文件。
我试了将近三个星期来解决它,但我做不到。
用这种方法我扫描数据并制作csv文件
错误消息
/host/anaconda3/lib/python3.6/site-packages/thriftpy/transport/socket.py的源代码
/host/anaconda3/lib/python3.6/site-packages/thriftpy/transport/socket.py的源代码
==>我尝试了compat协议,增加了网络tcp内存缓冲区,增加了超时配置,在扫描参数中设置了1到10000个批量大小等等。。
但它几乎在30分钟内运行良好,但突然出现了错误。差不多1/50的时间它完成得很好。(工作很好没有任何错误)请帮助我。我试图找出错误的原因。但我拿不到。
有人知道怎么解决吗?
这是我的密码

  1. import sys
  2. print ("--sys.version--")
  3. print (sys.version)
  4. from pyhive import hive
  5. import csv
  6. import os
  7. import happybase
  8. import time
  9. import subprocess
  10. import datetime
  11. import chardet
  12. import logging
  13. logging.basicConfig(level=logging.DEBUG)
  14. csv_list=[]
  15. col=[]
  16. def conn_base():
  17. print('conn_base starts')
  18. #SETTING CONNECTION AND CONFIGURATION
  19. conn=happybase.Connection('13.xxx.xxx.xxx',port=9090)
  20. table=conn.table(b'TEMP_TABLE')
  21. #ITERATE DATA AND MAKE CSV FILE PER 100,000 RECORD. AND TAKE A TIME TO SLEEP PER 500000
  22. tmp=[]
  23. print('LET\'S MAKE CSV FILE FROM HBASE')
  24. index=0
  25. st=0
  26. global csv_list
  27. for row_key, data in table.scan():
  28. try:
  29. if (st%1000000==0):
  30. time.sleep(30)
  31. print("COUNT: ",st)
  32. if (st%500000==0):
  33. print("CHANGE CSV _FILE")
  34. index+=1
  35. ta_na='TEMP_TABLE'+str(index)+'_version.csv'
  36. csv_list.append(ta_na)
  37. st+=1
  38. with open('/home/host01/csv_dir/TEMP_TABLE/'+csv_list[index-1] ,'a') as f:
  39. tmp=[]
  40. tmp.append(data[b'CF1:XXXXX'].decode())
  41. tmp.append(data[b'CF1:YYYYY'].decode())
  42. tmp.append(data[b'CF1:DDDDD'].decode())
  43. tmp.append(data[b'CF1:SSSSS'].decode())
  44. tmp.append(data[b'CF1:GGGGG'].decode())
  45. tmp.append(data[b'CF1:HHHHH'].decode())
  46. tmp.append(data[b'CF1:QQQQQ'].decode())
  47. tmp.append(data[b'CF1:WWWWWW'].decode())
  48. tmp.append(data[b'CF1:EEEEE'].decode())
  49. tmp.append(data[b'CF1:RRRRR'].decode())
  50. f.write(",".join(tmp)+'\n')
  51. tmp=[]
  52. except:
  53. pass
  54. #PUT CSV FILES TO HDFS.
  55. st=1
  56. for i in range(len(csv_list)):
  57. try:
  58. st+=1
  59. cmd="hdfs dfs -put /home/host01/csv_dir/TEMP_TABLE"+str(csv_list[i])+" /user/hive/warehouse/TEMP_TABLE/"
  60. subprocess.call(cmd,shell=True)
  61. if (st%50==0):
  62. time.sleep(5)
  63. except:
  64. pass
  65. cmd="hdfs dfs -put /home/host01/csv_dir/TEMP_TABLE/*.csv /user/hive/warehouse/TEMP_TABLE/"
  66. subprocess.call(cmd,shell=True)
  67. print("PUT ALL CSV FILES TO HDFS")
  68. conn.close()
dw1jzc5e

dw1jzc5e1#

首先确保hbase thrift服务器已启动并正在运行。您可以使用以下命令运行thrift server:

  1. hbase-daemon.sh start thrift [ -p 9090 ]

如果要指定端口号,请使用-p。默认端口为 9090

qc6wkl3g

qc6wkl3g2#

看上面的代码会让事情变得更复杂,这只是几个简单的步骤
确保hbase thrift已启动并正在运行。(使用上面的命令)
在hdfs设置文件中启用get-webhdfs。
从hdfs包使用不安全的客户机类(如果不是kerberos认证的)直接将文件写入hdfs(非常简单)

相关问题