如何使用python客户端访问远程服务器上的Hive

时间:2015-09-01 09:25:59

标签: python hadoop hive

案例:我在cloudera平台上安装了Hive。我想从我的计算机上使用python客户端访问Hive上的数据库。我读了一个类似的SO问题,但它使用pyhs2,我无法在远程服务器上安装。这个SO问题也使用了Thrift,但我似乎也无法安装它。

代码:按照文档后,当我执行以下程序时,它给了我一个错误。

import pyodbc, sys, os
   pyodbc.autocommit=True
   con = pyodbc.connect("DSN=default",driver='SQLDriverConnect',autocommit=True)  
   cursor = con.cursor()
   cursor.execute("select * from fb_mpsp")

错误:ssh://ashish@ServerIPAddress/home/ashish/anaconda/bin/python2.7 -u /home/ashish/PyCharm_proj/hdfsConnect/home/ashish/PyCharm_proj/hdfsConnect/Hive_connect/hive_connect.py

追踪(最近一次通话):   文件“/home/ashish/PyCharm_proj/hdfsConnect/home/ashish/PyCharm_proj/hdfsConnect/Hive_connect/hive_connect.py”,第5行,在     con = pyodbc.connect(“DSN = default”,driver ='SQLDriverConnect',autocommit = True)

pyodbc.Error:('IM002','[IM002] [unixODBC] [Driver Manager]未找到数据源名称,未指定默认驱动程序(0)(SQLDriverConnect)')

使用退出代码1完成处理

请建议我该如何解决这个问题?此外,我不确定为什么在使用hadoop配置单元执行代码时必须将驱动程序指定为SQLDriverConnect?

由于

3 个答案:

答案 0 :(得分:1)

这对我有用

oODBC = pyodbc.connect("DSN=Cloudera Hive DSN 64;", autocommit = True, ansi = True )

现在一切正常。

确保DSN使用以下任何内容都可以:

isql -v "Cloudera Hive DSN 64" 

并将“Cloudera Hive DSN 64”替换为您在odbc.ini中使用的名称

此外,目前我无法使用kerberos身份验证,除非我手工制作门票。 Impala使用kerberos keytab文件顺利运行

有关如何让hive odbc使用keytab文件的任何帮助表示赞赏。

答案 1 :(得分:0)

如果您决定重新访问pyhs2,请注意它不需要安装在远程服务器上,它已安装在本地客户端上。

如果继续使用pyodbc,则需要为Hive安装ODBC驱动程序,您可以从Cloudera's site获取该驱动程序。

您无需在连接中指定驱动程序,它应该是DSN的一部分。创建DSN的细节取决于您的操作系统,但基本上您将使用管理工具创建它 - >数据源(Windows),安装ODBC并编辑/Library/ODBC/odbc.ini(Mac)或编辑/etc/odbc.ini(Linux)。

从概念上讲,将DSN视为表示连接的所有信息的规范 - 它将包含主机,端口和驱动程序信息。在您的代码中,您不必指定这些内容,并且可以在不更改代码的情况下切换有关数据库的详细信息。

# Note only the DSN name specifies the connection
import pyodbc
conn = pyodbc.connect("DSN=Hive1") 
cursor = conn.cursor()
cursor.execute("select * from YYY")

或者,我已经更新了您引用的其他问题以及有关如何安装thrift库的信息。如果你有这个选择,我认为这是要走的路。

答案 2 :(得分:0)

尝试使用此方法来从hive服务器远程连接和获取数据: 使用ssh连接远程服务器并使用cli命令从远程服务器访问数据: ssh -o UserKnownHostsFile=/dev/null -o ConnectTimeout=90 -o StrictHostKeyChecking=no shashanks@remote_host 'hive -e "select * from DB.testtable limit 5;" >/home/shashanks/testfile'