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


Posted in Python onApril 14, 2020

最近准备使用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´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数据库中各种依赖包,请大家仔细核对一下依赖包(最好是依赖包相同,也就是不多不少[我说的是相关的包],这样真的可以避免很多问题的出现)

序号 包名 版本号 安装命令行
1 pure_sasl 0.5.1 pip install pure_sasl==0.5.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
2 thrift 0.9.3 pip install thrift==0.9.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
3 bitarray 0.8.3 pip install bitarray==0.8.3 -i https://pypi.tuna.tsinghua.edu.cn/simple
4 thrift_sasl 0.2.1 pip install thrift_sasl==0.2.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
5 thriftpy 0.3.9 pip install thriftpy==0.3.9 -i https://pypi.tuna.tsinghua.edu.cn/simple
6 impyla 0.14.1 pip install impyla==0.14.1 -i https://pypi.tuna.tsinghua.edu.cn/simple

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

package build size
ply-3.11 py37_0 80 KB
conda-4.6.1 py37_0 1.7 MB
thriftpy-0.3.9 py37h1de35cc_2 171 KB

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

最后有一点提示:

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

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

到此这篇关于Python连接Hadoop数据中遇到的各种坑(汇总)的文章就介绍到这了,更多相关Python连接Hadoop内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
用Python计算三角函数之acos()方法的使用
May 15 Python
在windows下快速搭建web.py开发框架方法
Apr 22 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
Nov 16 Python
pandas多级分组实现排序的方法
Apr 20 Python
python爬虫自动创建文件夹的功能
Aug 01 Python
Python中的Numpy矩阵操作
Aug 12 Python
python实现一个函数版的名片管理系统过程解析
Aug 27 Python
利用Python校准本地时间的方法教程
Oct 31 Python
python找出列表中大于某个阈值的数据段示例
Nov 24 Python
pytorch 实现删除tensor中的指定行列
Jan 13 Python
python开发入门——set的使用
Sep 03 Python
Python可视化工具如何实现动态图表
Oct 23 Python
jupyter notebook 调用环境中的Keras或者pytorch教程
Apr 14 #Python
Python用5行代码实现批量抠图的示例代码
Apr 14 #Python
在jupyter notebook中调用.ipynb文件方式
Apr 14 #Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
Apr 14 #Python
Python使用pyyaml模块处理yaml数据
Apr 14 #Python
Jupyter Notebook打开任意文件夹操作
Apr 14 #Python
Python requests模块cookie实例解析
Apr 14 #Python
You might like
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
2017/02/17 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
使用SyntaxHighlighter实现HTML高亮显示代码的方法
2010/02/04 Javascript
Jquery.TreeView结合ASP.Net和数据库生成菜单导航条
2010/08/27 Javascript
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
JavaScript实现垂直滚动条效果
2017/01/18 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
js实现音乐播放控制条
2017/09/09 Javascript
JS实现的判断方法、变量是否存在功能示例
2020/03/28 Javascript
AngularJs1.x自定义指令独立作用域的函数传入参数方法
2018/10/09 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
Vue中component标签解决项目组件化操作
2020/09/04 Javascript
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
Python零基础入门学习之输入与输出
2019/04/03 Python
python ChainMap的使用和说明详解
2019/06/11 Python
Python编写打字训练小程序
2019/09/26 Python
Reebok俄罗斯官方网上商店:购买锐步运动服装和鞋子
2016/09/26 全球购物
奥地利网上现代灯具和灯饰店:Lampenwelt.at
2018/01/29 全球购物
世界顶级俱乐部的官方球衣和套装:Subside Sports
2018/04/22 全球购物
倩碧澳大利亚官网:Clinique澳大利亚
2019/07/22 全球购物
摩飞电器俄罗斯官方网站:Morphy Richards俄罗斯
2020/07/30 全球购物
个人实用简单的自我评价
2013/10/19 职场文书
应届生幼儿园求职信
2013/11/12 职场文书
迟到检讨书500字
2014/02/05 职场文书
医学生毕业自我鉴定
2014/03/26 职场文书
化妆品活动策划方案
2014/05/23 职场文书
计算机网络专业求职信
2014/06/05 职场文书
物业管理委托协议(2篇)
2014/09/23 职场文书
缓刑人员思想汇报
2014/10/11 职场文书
尼克胡哲观后感
2015/06/08 职场文书
python3操作redis实现List列表实例
2021/08/04 Python
vue router 动态路由清除方式
2022/05/25 Vue.js