Python连接Hadoop数据中遇到的各种坑(汇总)

作者:wx0628 时间:2023-09-13 20:16:34 

最近准备使用Python+Hadoop+Pandas进行一些深度的分析与机器学习相关工作。(当然随着学习过程的进展,现在准备使用Python+Spark+Hadoop这样一套体系来搭建后续的工作环境),当然这是后话。
但是这项工作首要条件就是将Python与Hadoop进行打通,本来认为很容易的一项工作,没有想到竟然遇到各种坑,花费了整整半天时间。后来也在网上看到大家在咨询相同的问题,但是真正解决这个问题的帖子又几乎没有,所以现在将Python连接Hadoop数据库过程中遇到的各种坑进行一个汇总,然后与大家进行分享,以尽量避免大家花费宝贵的时间。

(说明一下:这篇文章中的各种坑的解决,翻阅了网上无数的帖子,最好一GIT上面一个帖子的角落里面带了这么一句,否则很容易翻船。但是由于帖子太多,所以我就不一一帖出来了)

首先是选组件,我选择的是使用:impala+Python3.7来连接Hadoop数据库,如果你不是的话,就不要浪费宝贵时间继续阅读了。

执行的代码如下:


import impala.dbapi as ipdb
conn = ipdb.connect(host="192.168.XX.XXX",port=10000,user="xxx",password="xxxxxx",database="xxx",auth_mechanism='PLAIN')
cursor = conn.cursor()
#其中xxxx是表名,为了不涉及到公司的信息,我把表名隐藏掉了,大家自己换成自己数据库表名
cursor.execute('select * From xxxx')
print(cursor.description) # prints the result set's schema
for rowData in cursor.fetchall():
 print(rowData)
conn.close()

坑一:提示语法错误

现象:

/Users/wangxxin/miniconda3/bin/python3.7 /Users/wangxxin/Documents/Python/PythonDataAnalyze/project/knDt/pyHiveTest.py
Traceback (most recent call last):
  File "/Users/wangxxin/Documents/Python/PythonDataAnalyze/project/knDt/pyHiveTest.py", line 1, in <module>
    import impala.dbapi as ipdb
  File "/Users/wangxxin/miniconda3/lib/python3.7/site-packages/impala/dbapi.py", line 28, in <module>
    import impala.hiveserver2 as hs2
  File "/Users/wangxxin/miniconda3/lib/python3.7/site-packages/impala/hiveserver2.py", line 340
    async=True)

解决办法:将参数async全部修改为“async_”(当然这个可以随便,只要上下文一致,并且不是关键字即可),原因:在Python3.0中,已经将async标为关键词,如果再使用async做为参数,会提示语法错误;应该包括以下几个地方:


#hiveserver2.py文件338行左右
op = self.session.execute(self._last_operation_string,
                configuration,
                async_=True)
#hiveserver2.py文件1022行左右
def execute(self, statement, configuration=None, async_=False):
 req = TExecuteStatementReq(sessionHandle=self.handle,
               statement=statement,
               confOverlay=configuration,
               runAsync=async_)

坑二:提供的Parser.py文件有问题,加载的时候会报错

解决办法:


#根据网上的意见对原代码进行调整
elif url_scheme in ('c', 'd', 'e', 'f'):
 with open(path) as fh:
   data = fh.read()
elif url_scheme in ('http', 'https'):
 data = urlopen(path).read()
else:
 raise ThriftParserError('ThriftPy does not support generating module '
             'with path in protocol \'{}\''.format(
               url_scheme))

以上的坑一、坑二建议你直接修改。这两点是肯定要调整的;

坑三:上面的两个问题处理好之后,继续运行,会报如下错误:

TProtocolException: TProtocolException(type=4)

解决办法:

原因是由于connect方法里面没有增加参数:auth_mechanism='PLAIN,修改如下所示:


import impala.dbapi as ipdb
conn = ipdb.connect(host="192.168.XX.XXX",port=10000,user="xxx",password="xxxxxx",database="xxx",auth_mechanism='PLAIN')`

坑四:问题三修改好之后,继续运行程序,你会发现继续报错:

AttributeError: 'TSocket' object has no attribute 'isOpen'

解决办法:

由于是thrift-sasl的版本太高了(0.3.0),故将thrift-sasl的版本降级到0.2.1


pip uninstall thrift-sasl
pip install thrift-sasl==0.2.1

坑五:处理完这个问题后,继续运行,继续报错(这个时间解决有点快崩溃的节奏了,但是请坚持住,其实你已经很快接近最后结果了):

thriftpy.transport.TTransportException: TTransportException(type=1, message="Could not start SASL: b'Error in sasl_client_start (-4) SASL(-4): no mechanism available: Unable to find a callback: 2'")

解决办法:这个是最麻烦的,也是目前最难找到解决办法的。

I solved the issue, had to uninstall the package SASL and install PURE-SASL, when impyla can&acute;t find the sasl package it works with pure-sasl and then everything goes well.

主要原因其实还是因为sasl和pure-sasl有冲突,这种情况下,直接卸载sasl包就可能了。


pip uninstall SASL

坑六:但是执行完成,继续完成,可能还是会报错:

TypeError: can't concat str to bytes

定位到错误的最后一条,在init.py第94行(标黄的部分)


header = struct.pack(">BI", status, len(body))
#按照网上的提供的办法增加对BODY的处理
if (type(body) is str):
body = body.encode()
self._trans.write(header + body)
self._trans.flush()

经过以上步骤,大家应该可以连接Hive库查询数据,应该是不存在什么问题了。

最后总结一下,连接Hadoop数据库中各种依赖包,请大家仔细核对一下依赖包(最好是依赖包相同,也就是不多不少[我说的是相关的包],这样真的可以避免很多问题的出现)

序号包名版本号安装命令行
1pure_sasl0.5.1pip install pure_sasl==0.5.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
2thrift0.9.3pip install thrift==0.9.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
3bitarray0.8.3pip install bitarray==0.8.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
4thrift_sasl0.2.1pip install thrift_sasl==0.2.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
5thriftpy0.3.9pip install thriftpy==0.3.9 -i https://pypi.tuna.tsinghua.edu.cn/simple
6impyla0.14.1pip install impyla==0.14.1 -i https://pypi.tuna.tsinghua.edu.cn/simple

建议按顺序安装,我这边之前有依赖包的问题,但是最终我是通过conda进行安装的。
其中在安装thriftpy、thrift_sasl、impyla报的时候报错,想到自己有conda,直接使用conda install,会自动下载依赖的包,如下所示(供没有conda环境的同学参考)

packagebuildsize
ply-3.11py37_080 KB
conda-4.6.1py37_01.7 MB
thriftpy-0.3.9py37h1de35cc_2171 KB

祝您好运!如果在实际过程中还是遇到各种各样的问题,请你留言。

最后有一点提示:

SQL里面不要带分号,否则会报错。但是这个就不是环境问题了。报错如下:

impala.error.HiveServer2Error: Error while compiling statement: FAILED: ParseException line 2:83 cannot recogniz

来源:https://blog.csdn.net/wx0628/article/details/86550582

标签:Python,连接,Hadoop
0
投稿

猜你喜欢

  • 数据库查询哪个对像里面包含什么字段方法语句

    2024-01-24 10:32:56
  • CGO编程基础快速入门

    2024-02-05 05:20:58
  • 详解MySQL 数据库优化方法

    2010-08-12 14:50:00
  • pytho多张图片的无损拼接的实现示例

    2021-10-09 08:25:18
  • python中main函数(主函数)相关应用例子

    2023-08-23 08:54:59
  • Python标准库os库的常用功能解析

    2021-03-06 12:32:51
  • 一些不错的js函数ajax

    2023-08-25 14:01:38
  • sql表连接查询使用方法(sql多表连接查询)

    2024-01-22 12:25:39
  • python 获取sqlite3数据库的表名和表字段名的实例

    2024-01-24 13:34:22
  • php中-> 、=>、::、$this->四种常见符号使用方法技巧

    2023-05-30 07:46:24
  • python利用lxml读写xml格式的文件

    2023-08-02 04:22:44
  • C/C++ 连接MySql数据库的方法

    2024-01-27 08:40:36
  • 基于python的mysql复制工具详解

    2023-06-24 01:08:28
  • Python如何使用带有 for 循环的 Lambda 函数

    2021-05-28 05:06:05
  • Tensorflow 卷积的梯度反向传播过程

    2021-02-05 09:15:29
  • python调用windows api锁定计算机示例

    2021-09-08 03:28:38
  • python必学知识之文件操作(建议收藏)

    2021-10-01 16:28:25
  • OpenCV 绘制同心圆的示例代码

    2021-05-19 16:49:40
  • python变量的存储原理详解

    2023-03-26 14:46:48
  • python字典的常用方法总结

    2023-07-11 01:45:17
  • asp之家 网络编程 m.aspxhome.com