最近准备使用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内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
本文向大家介绍Java连接各种数据库的方法,包括了Java连接各种数据库的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java连接各种数据库的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的java程序设计有所帮助。
本文向大家介绍JavaScript代码编写中各种各样的坑和填坑方法,包括了JavaScript代码编写中各种各样的坑和填坑方法的使用技巧和注意事项,需要的朋友参考一下 坑”这个字,在此的意思是“陷阱”。由于 JavaScript “弱语言”的性质,使得其在使用过程中异常的宽松灵活,但也极为容易“中招”。这些坑往往隐藏着,所以必须擦亮双眼,才能在学习与应用 JS 的道路上走的一帆风顺。 一、全局变量
本文向大家介绍python中常用的各种数据库操作模块和连接实例,包括了python中常用的各种数据库操作模块和连接实例的使用技巧和注意事项,需要的朋友参考一下 工作中,经常会有用python访问各种数据库的需求,比如从oracle读点配置文件或者往mysql写点结果信息之类的。 这里列一下可能用到的各个模块。 sqlite3: 内置模块 用sqlite,有时候确实很方便,我觉得它确实做到了宣称的“
1.问题现象描述 使用 json.Unmarshal(),反序列化时,出现了科学计数法,参考代码如下: jsonStr := `{"number":1234567}` result := make(map[string]interface{}) err := json.Unmarshal([]byte(jsonStr), &result) if err != nil { fmt.Print
本文向大家介绍详解Mybatis-plus中更新date类型数据遇到的坑,包括了详解Mybatis-plus中更新date类型数据遇到的坑的使用技巧和注意事项,需要的朋友参考一下 最近一年的项目都是在使用Mybatis-plus,感觉挺好用的,也没遇到很多问题,但是在最近项目上线之后,遇到了一些新的需要,在进行新版本开发的时候就开始遇到坑了,今天来说一下更新数据中有date类型数据的时候会出现的问
本文向大家介绍JavaScript字符串转数字的5种方法及遇到的坑,包括了JavaScript字符串转数字的5种方法及遇到的坑的使用技巧和注意事项,需要的朋友参考一下 String转换为Number有很多种方式,我可以想到的有5种! parseInt(num); // 默认方式 (没有基数) parseInt(num, 10); // 传入基数 (十位数) parseFloat(num) // 浮