最近准备使用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

import impala.dbapi as ipdb

File "/Users/wangxxin/miniconda3/lib/python3.7/site-packages/impala/dbapi.py", line 28, in

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连接Hadoop数据中遇到的各种坑(汇总)

本文地址: http://www.cppcns.com/jiaoben/python/307541.html

python替代hadoop_Python连接Hadoop数据中遇到的各种坑(汇总)相关推荐

  1. python比对excel表数据中的差异_Excel表格中数据比对和查找的几种技巧

    经常被人问到怎么对两份Excel数据进行比对,提问的往往都很笼统:在工作中,有时候会需要对两份内容相近的数据记录清单进行比对,需求不同,比对的的目标和要求也会有所不同.下面Office办公助手(www ...

  2. python matplotlib 绘制二维数据中某些列到折线图,没有线的解决方法

    results.txt中的文本数据是这样的. { "epoch":0, "imgindex":0, "imgcount":63, " ...

  3. python渐变_嘈杂的数据中的渐变,python

    我有宇宙射线探测器的能谱.光谱遵循指数曲线,但它会有宽的(也可能是非常轻微的)肿块.显然,数据包含噪声元素. 我正在尝试平滑数据,然后绘制其渐变. 到目前为止,我一直在使用scipy sline函数来 ...

  4. 程序员、工程师使用mac电脑过程中遇到的各种坑汇总

    由于mac电脑的电源待机时间超长,操作便利,系统响应快,超能的命令行,便于携带,越来越多程序猿们开始从windows转向mac.鉴于目前大部分应用都是先有windows版本,然后再开发mac版本,因此 ...

  5. iOS总结:项目中的各种小坑汇总

    一.字符串转JSON 在网络请求时,如果服务端返回的是字符串,那么就需要我们自己封装一个类,将请求下来的字符串转换成json对象,从而存入模型中. 注意: 字符串中如果含有一些特殊转意符(如\n.\t ...

  6. HTML5中Audio使用踩坑汇总

    Cannot read property 'catch' of undefined 原因:在调用play()时,现代浏览器返回的是一个promise,对于执行失败的,会触发一个Unhandled Pr ...

  7. python用另一个字段替代本字段的null_Python中的数据库

    数据库和Python 持久化存储 在任何应用中,都需要持久化存储,一般有三种基础的存储机制,文件,数据库系统,以及一些混合类型,一种是使用普通文件或者python特定文件进行访问,另一种是使用数据库管 ...

  8. [学习笔记]Python for Data Analysis, 3E-8.数据整理:连接、合并和重塑

    在许多应用程序中,数据可能分布在多个文件或数据库中,或者以不便于分析的形式排列.本章重点介绍有助于合并.联接和重新排列数据的工具. 首先,介绍一下pandas中的分层索引的概念,这个概念在其中一些操作 ...

  9. 《Python Spark 2.0 Hadoop机器学习与大数据实战_林大贵(著)》pdf

    <Python+Spark 2.0+Hadoop机器学习与大数据实战> 五星好评+强烈推荐的一本书,虽然内容可能没有很深入,但作者非常用心的把每一步操作详细的列出来并给出说明,让我们跟着做 ...

最新文章

  1. ISP 【一】————boost标准库使用——批量读取保存文件 /boost第三方库的使用及其cmake添加,图像gramma
  2. 软件测试概述--基础篇
  3. pandas生成新的累积连乘数据列(cumprod)、pandas生成新的累积连乘cumprod数据列(数据列中包含NaN的情况)、pandas计算整个dataframe的所有数据列的累积连乘
  4. 大系统化小之后,微信如何解决大规模微服务下的难题?
  5. Linux 性能监测工具
  6. jenkins详细设置(二)
  7. 分库分表就能无限扩容吗,解释得太好了
  8. C# Cookie操作类
  9. 修改ssh默认端口号
  10. treeview右键添加新节点
  11. Jquery屏蔽回车键
  12. js将long日期格式转换为标准日期格式
  13. linux运维高频命令汇总
  14. 记一下vue.js事件的修饰等问题
  15. proc文件系统实现用户空间与内核空间的数据通信
  16. gem5源码解读se.py以及simulate.py(一)
  17. 月入5万!这个头条号变现大招好多人都没注意到
  18. STM32_ADC模数转换的基本原理
  19. elemtnui 表格如何修改某行文字颜色(elemtnui table 修改某行文字颜色)
  20. css代码文字破碎js特效

热门文章

  1. SpringBoot集成flowable-modeler(6.4.1) 实现免登
  2. Navicat创建数据库表 、导入sql文件,生成表结构
  3. Redis 工具类_慕课版本
  4. spark中local模式与cluster模式使用场景_不可不知的Spark调优点
  5. linux rm 某个时间以前,(转)linux的一个find命令配合rm删除某天前的文件
  6. c语言正确理解以下名词及其含义,C程序作业答案.doc
  7. C/C++ _strlwr_s 函数 – 字符串大写转小写- C语言零基础入门教程
  8. Python print 函数- Python零基础入门教程
  9. jq之slideDown() stop()
  10. fadeToggle()