python脚本执行hive
⑴ python连接hive,怎么安装thrifthive
HiveServer2的启动
启动HiveServer2
HiveServer2的启动十分简便:
$ $HIVE_HOME/bin/hiveserver2
或者
$ $HIVE_HOME/bin/hive --service hiveserver2
默认情况下,HiverServer2的Thrift监听端口是10000,其WEB UI端口是10002。可通过http://localhost:10002来查看HiveServer2的Web UI界面,这里显示了Hive的一些基本信息。如果Web界面不能查看,则说明HiveServer2没有成功运行。
使用beeline测试客户端连接
HiveServer2成功运行后,我们可以使用Hive提供的客户端工具beeline连接HiveServer2。
$ $HIVE_HOME/bin/beeline
beeline > !connect jdbc:hive2://localhost:10000
如果成功登录将出现如下的命令提示符,此时可以编写HQL语句。
0: jdbc:hive2://localhost:10000>
报错:User: xxx is not allowed to impersonate anonymous
在beeline使用!connect连接HiveServer2时可能会出现如下错误信息:
Caused by: org.apache.hadoop.ipc.RemoteException:
User: xxx is not allowed to impersonate anonymous
这里的xxx是我的操作系统用户名称。这个问题的解决方法是在hadoop的core-size.xml文件中添加xxx用户代理配置:
<property> <name>hadoop.proxyuser.xxx.groups</name> <value>*</value></property><property> <name>hadoop.proxyuser.xxx.hosts</name> <value>*</value></property>
重启HDFS后,再用beeline连接HiveServer2即可成功连接。
常用配置
HiveServer2的配置可以参考官方文档《Setting Up HiveServer2》
这里列举一些hive-site.xml的常用配置:
hive.server2.thrift.port:监听的TCP端口号。默认为10000。
hive.server2.thrift.bind.host:TCP接口的绑定主机。
hive.server2.authentication:身份验证方式。默认为NONE(使用 plain SASL),即不进行验证检查。可选项还有NOSASL, KERBEROS, LDAP, PAM and CUSTOM.
hive.server2.enable.doAs:是否以模拟身份执行查询处理。默认为true。
Python客户端连接HiveServer2
python中用于连接HiveServer2的客户端有3个:pyhs2,pyhive,impyla。官网的示例采用的是pyhs2,但pyhs2的官网已声明不再提供支持,建议使用impyla和pyhive。我们这里使用的是impyla。
impyla的安装
impyla必须的依赖包括:
six
bit_array
thriftpy(python2.x则是thrift)
sasl
thrift_sasl
- from impala.dbapi import connect
- conn = connect(host='127.0.0.1', port=10000, database='default', auth_mechanism='PLAIN')
- cur = conn.cursor()
- cur.execute('SHOW DATABASES')print(cur.fetchall())
- cur.execute('SHOW Tables')print(cur.fetchall())
为了支持Hive还需要以下两个包:
可在Python PI中下载impyla及其依赖包的源码。
impyla示例
以下是使用impyla连接HiveServer2的示例:
⑵ Hive优化的十大方法
Hive用的好,才能从数据中挖掘出更多的信息来。用过hive的朋友,我想或多或少都有类似的经历:一天下来,没跑几次hive,就到下班时间了。Hive在极大数据或者数据不平衡等情况下,表现往往一般,因此也出现了presto、spark-sql等替代品。这里重点讲解hive的优化方式,例如
一. 表连接优化
二. 用insert into替换union all
如果union all的部分个数大于2,或者每个union部分数据量大,应该拆成多个insert into 语句,实际测试过程中,执行时间能提升50%。示例参考如下:
可以改写为:
三. order by & sort by
order by : 对查询结果进行全局排序消耗时间长,需要set hive.mapred.mode=nostrict
sort by : 局部排序,并非全局有序,提高效率。
四. transform+python
一种嵌入在hive取数流程中的自定义函数,通过transform语句可以把在hive中不方便实现的功能在python中实现,然后写入hive表中。示例语法如下:
如果除python脚本外还有其它依赖资源,可以使用ADD ARVHIVE。
五. limit 语句快速出结果
一般情况下,Limit语句还是需要执行整个查询语句,然后再返回部分结果。有一个配置属性可以开启,避免这种情况—对数据源进行抽样
缺点:有可能部分数据永远不会被处理到
六. 本地模式
对于小数据集,为查询触发执行任务消耗的时间>实际执行job的时间,因此可以通过本地模式,在单台机器上(或某些时候在单个进程上)处理所有的任务。
可以通过设置属性hive.exec.mode.local.auto的值为true,来让Hive在适当的时候自动启动这个优化,也可以将这个配置写在$HOME/.hiverc文件中。
当一个job满足如下条件才能真正使用本地模式:
七. 并行执行
Hive会将一个查询转化为一个或多个阶段,包括:MapRece阶段、抽样阶段、合并阶段、limit阶段等。默认情况下,一次只执行一个阶段。 不过,如果某些阶段不是互相依赖,是可以并行执行的。
会比较耗系统资源。
八. 调整mapper和recer的个数
假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(6个128m的块和1个12m的块),从而产生7个map数
假设input目录下有3个文件a,b,c,大小分别为10m,20m,130m,那么hadoop会分隔成4个块(10m,20m,128m,2m),从而产生4个map数。
即如果文件大于块大小(128m),那么会拆分,如果小于块大小,则把该文件当成一个块。
map执行时间:map任务启动和初始化的时间+逻辑处理的时间。
减少map数
若有大量小文件(小于128M),会产生多个map,处理方法是:
前面三个参数确定合并文件块的大小,大于文件块大小128m的,按照128m来分隔,小于128m,大于100m的,按照100m来分隔,把那些小于100m的(包括小文件和分隔大文件剩下的)进行合并。
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; – 执行前进行小文件合并。
增加map数
当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。
set mapred.rece.tasks=?
一般根据输入文件的总大小,用它的estimation函数来自动计算rece的个数:rece个数 = InputFileSize / bytes per recer
九. 严格模式
十. 数据倾斜
表现:
任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)rece子任务未完成。因为其处理的数据量和其他rece差异过大。单一rece的记录数与平均记录数差异过大,通常可能达到3倍甚至更多。 最长时长远大于平均时长。
原因:
解决方案:参数调节
⑶ python应该如何连接hive
为了连接Hive数据库,可以利用Python中的PyHive库。首先,通过pip命令在终端中安装PyHive库。
连接过程涉及三个重要步骤。首先,导入PyHive库中的三个模块。然后,使用特定命令建立与Hive服务器的连接,这里需要替换主机名、端口号、用户名、密码以及数据库名称。
接下来,使用Pandas库的read_sql()函数在Python环境中执行SQL查询,将结果存储为Pandas数据帧。在执行此命令时,需替换表名称为实际需要查询的表名,以获取表数据。
在完成数据操作后,记得使用特定命令关闭与Hive数据库的连接,以释放资源。至此,使用PyHive库连接Hive数据库的基本流程结束。连接成功后,即可利用SQL查询获取、处理和分析Hive数据库中的数据。
⑷ 在hive查询中使用变量
Hive配置属性存储于 hiveconf 命名空间中,该命名空间中的属性是可读写的。在查询语句中插入 '${hiveconf:变量名}' ,就可以通过 hive -hiveconf来替换变量。例如,查询语句和执行方式如下:
需要注意的是:
Hive命令行变量,存储于 hivevar 命名空间中,该命名空间中的变量是可读写的。使用方式和hive配置属性类似,只是在查询语句中插入的是 '${hivecar:变量名}' ,其中命名空间"hivecar:"可以省略。例如:
因为命令行变量的命名空间是唯一可以省略的,因此:
其他替换变量的方法:
利用shell脚本设置hive查询语句中的变量
利用Python替换Hive查询语句中的变量