【问题标题】:When scan remote hbase table using Happybase, 'Tsocket read 0 bytes Error' happens使用 Happybase 扫描远程 hbase 表时,发生“Tsocket read 0 bytes Error”
【发布时间】:2019-02-10 16:41:45
【问题描述】:

我正在尝试扫描具有超过 1,000,000,000 行的远程 HBASE 表。扫描后,使用扫描的行,尝试在 hdfs 中使用 csv 文件。

我尝试了将近 3 周来解决它但我不能。

In this way i scan data and make csv file

Error Message

source of /host/anaconda3/lib/python3.6/site-packages/thriftpy/transport/socket.py

source of /host/anaconda3/lib/python3.6/site-packages/thriftpy/transport/socket.py

==> 我已经尝试过兼容协议,增加网络 tcp 内存缓冲区,增加超时配置,在扫描参数中设置 1 到 10000 批量大小等。

但它几乎可以运行 30 分钟,但突然发生错误。 几乎 1/50 次它完成得很好。(运行良好,没有任何错误) 请帮助我。我试图找到错误的原因。但我无法得到它。

有人知道怎么解决吗?

这是我的代码

import sys
print ("--sys.version--")
print (sys.version)
from pyhive import hive
import csv
import os
import happybase
import time
import subprocess
import datetime
import chardet
import logging
logging.basicConfig(level=logging.DEBUG)


csv_list=[]

col=[]
def conn_base():
    print('conn_base starts')


    #SETTING CONNECTION AND CONFIGURATION
    conn=happybase.Connection('13.xxx.xxx.xxx',port=9090)
    table=conn.table(b'TEMP_TABLE')

    #ITERATE DATA AND MAKE CSV FILE PER 100,000 RECORD. AND TAKE A TIME TO SLEEP PER 500000
    tmp=[]
    print('LET\'S MAKE CSV FILE FROM HBASE')
    index=0
    st=0
    global csv_list
    for row_key, data in table.scan():
        try:
           if (st%1000000==0):
                time.sleep(30)
                print("COUNT: ",st)
            if (st%500000==0):

               print("CHANGE CSV _FILE")
                index+=1
                ta_na='TEMP_TABLE'+str(index)+'_version.csv'
                csv_list.append(ta_na)

            st+=1
            with open('/home/host01/csv_dir/TEMP_TABLE/'+csv_list[index-1] ,'a') as f:
                tmp=[]
                tmp.append(data[b'CF1:XXXXX'].decode())
                tmp.append(data[b'CF1:YYYYY'].decode())
                tmp.append(data[b'CF1:DDDDD'].decode())
                tmp.append(data[b'CF1:SSSSS'].decode())
                tmp.append(data[b'CF1:GGGGG'].decode())
                tmp.append(data[b'CF1:HHHHH'].decode())
                tmp.append(data[b'CF1:QQQQQ'].decode())
                tmp.append(data[b'CF1:WWWWWW'].decode())
                tmp.append(data[b'CF1:EEEEE'].decode())
                tmp.append(data[b'CF1:RRRRR'].decode())


                f.write(",".join(tmp)+'\n')
                tmp=[]

        except:
            pass


        #PUT CSV FILES TO HDFS.
        st=1
        for i in range(len(csv_list)):
            try:
                st+=1
                cmd="hdfs dfs -put /home/host01/csv_dir/TEMP_TABLE"+str(csv_list[i])+" /user/hive/warehouse/TEMP_TABLE/"
                subprocess.call(cmd,shell=True)
                if (st%50==0):
                    time.sleep(5)


            except:
                pass
        cmd="hdfs dfs -put /home/host01/csv_dir/TEMP_TABLE/*.csv  /user/hive/warehouse/TEMP_TABLE/"
        subprocess.call(cmd,shell=True)

        print("PUT ALL CSV FILES TO HDFS")
        conn.close()

【问题讨论】:

  • 请分享代码而不是截图
  • 对不起,我不习惯发帖所以我有一些错误。我分享了我的代码!请给我任何解决方案谢谢你回答我!
  • 您是否在服务器端检查错误? HBase thrift 服务器是否始终启动?如果它开始工作然后停止,也许值得挖掘服务器日志。不确定这些日志是否会自动包含在默认记录器设置中,因此请确保它们是。
  • 感谢您的回答。 u 表示检查服务器端 Hbase thrift 日志。但我找不到任何错误日志。我认为 Tsocket 读取 0 字节有很多错误但是没有任何解决方案或原因

标签: python linux sockets hbase happybase


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    上面的代码让你变得更复杂了,这只是几个简单的步骤

    1. 确保 Hbase Thrift 已启动并正在运行。(使用上面建议的命令)
    2. 在 HDFS 设置文件中启用 webHdfs。
    3. 从 hdfs 包中使用不安全的客户端类(如果没有经过 kerberos 认证)直接将文件写入 HDFS(非常简单)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      • 2019-04-23
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多