大家好,喜欢Bigdata的阿尼亚来了!希望大家会喜欢阿尼亚的文章!!哇酷哇酷!!!
本次为师傅们带来的是“红亚杯”数据分析进阶—使用Python操作Hive专题赛——满分解析系列的第①期,让我们先来看看完整赛题叭!
目录
“红亚杯”数据分析进阶—使用Python操作Hive专题赛
本专题赛主要内容包括:使用Python操作Hive、使用Python库列出Hive中所有的Database、使用Python库执行DDL语句、使用Python定时执行查询
实操:使用Python操作Hive(100 / 100分)
Hive拥有HiveServer(Thrift)或者Hiveserver2组件,提供了JDBC驱动服务,使得我们可以用Java代码或者Python来连接Hive并进行一些关系型数据库的sql语句查询等操作。 HiveServer或者HiveServer2都是基于Thrift的,但HiveSever有时被称为Thrift server,而HiveServer2却不会。既然已经存在HiveServer为什么还需要HiveServer2呢? 这是因为HiveServer不能处理多于一个客户端的并发请求,这是由于HiveServer使用的Thrift接口所导致的限制,不能通过修改HiveServer的代码修正。因此在Hive-0.11.0版本中重写了HiveServer代码得到了HiveServer2,进而解决了该问题。HiveServer2支持多客户端的并发和认证,为开放API客户端如JDBC、ODBC提供了更好的支持。
配置Hadoop代理(8.00 / 8分)
Hadoop2.0版本开始支持ProxyUser的机制。含义是使用User A的用户认证信息,以User B的名义去访问hadoop集群。对于服务端来说就认为此时是User B在访问集群,相应对访问请求的鉴权(包括HDFS文件系统的权限,YARN提交任务队列的权限)都以用户User B来进行。User A被认为是superuser(这里super user并不等同于hdfs中的超级用户,只是拥有代理某些用户的权限,对于hdfs来说本身也是普通用户),User B被认为是proxyuser。
服务端需要在NameNode和ResourceManager的core-site.xml中进行代理权限相关配置。 对于每一个superUser用户,配置参数:
配置 | 说明 |
---|---|
hadoop.proxyuser.$superuser.hosts | 配置该superUser允许通过代理访问的主机节点 |
hadoop.proxyuser.$superuser.groups | 配置该superUser允许代理的用户所属组 |
hadoop.proxyuser.$superuser.users | 配置该superUser允许代理的用户 |
-
对于每个superUser用户,hosts必须进行配置,而groups和users至少需要配置一个。
-
以上配置项的值都可以使用*(星号)来表示允许所有的主机/用户组/用户。
对应文件路径:/root/software/hadoop-2.7.7/etc/hadoop/core-site.xml
<!-- 用于hiveserver2连接10000端口 -->
<property>
<name>hadoop.proxyuser.????.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.???.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hive.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hive.groups</name>
<value>*</value>
</property>
考核条件如下:
1. 修改core-site.xml,配置root用户可以在任何主机中执行代理(4.00 / 4分)
操作环境: python-hive
2. 修改core-site.xml,配置root用户可以在代理任意任务组的用户(4.00 / 4分)
操作环境: python-hive
配置Hiveserver2服务信息(8.00 / 8分)
Hive拥有HiveServer(Thrift)或者Hiveserver2组件,提供了JDBC驱动服务,使得我们可以用Java代码或者Python来连接Hive并进行一些关系型数据库的sql语句查询等操作。 HiveServer或者HiveServer2都是基于Thrift的,但HiveSever有时被称为Thrift server,而HiveServer2却不会。既然已经存在HiveServer为什么还需要HiveServer2呢? 这是因为HiveServer不能处理多于一个客户端的并发请求,这是由于HiveServer使用的Thrift接口所导致的限制,不能通过修改HiveServer的代码修正。因此在Hive-0.11.0版本中重写了HiveServer代码得到了HiveServer2,进而解决了该问题。HiveServer2支持多客户端的并发和认证,为开放API客户端如JDBC、ODBC提供了更好的支持。
-
TCP 的监听端口,默认为10000
-
TCP绑定的主机,默认为localhost
文件路径为:/root/software/apache-hive-2.3.4-bin/conf/hive-site.xml
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<!-- hiveserver2 -->
<property>
<name>hive.server2.thrift.port</name>
<value>????</value>
</property>
<property>
<name>hive.server2.thrift.bind.host</name>
<value>????</value>
</property>
考核条件如下:
1. 设置TCP的监听端口为10000(4.00 / 4分)
操作环境: python-hive
2. 设置TCP绑定的主机为localhost(4.00 / 4分)
操作环境: python-hive
开启相关服务(24.00 / 24分)
本次使用环境为单节点集群,对应主机名为Hadoop
,使用工具连接对应主机并进行相关操作。
-
环境中已经安装java、Hadoop、Hive、Mysql并配置对应环境变量,安装路径为/root/software/,对应版本如下;
内置安装/依赖包 | 已安装服务 | 系统版本 |
---|---|---|
jdk-8u211-linux-x64.tar.gz 、hadoop-2.7.7.tar.gz 、apache-hive-2.3.4-bin.tar.gz | mysql-community-server | CentOS Linux release 7.3.1611 (Core) |
1.环境中已经安装/root/software/hadoop-2.7.7
,格式化HDFS,开启集群,查看集群状态。(HDFS端口为9000,其他端口默认) 2.环境中已经安装/root/software/apache-hive-2.3.4-bin
,需要开启mysql服务,即可开启hiveserver2服务。
从Hive 2.0版本开始,为HiveServer2提供了一个简单的WEBUI
界面,界面中可以直观的看到当前链接的会话、历史日志、配置参数以及度量信息。
考核条件如下:
1. 修改云主机host文件,添加内网IP,对应映射名为hadoop000,实现云主机自身使用root用户ssh访问hadoop000免密登陆(4.00 / 4分)
操作环境: python-hive
2. 格式化HDFS文件系统(4.00 / 4分)
操作环境: python-hive
3. 启动Hadoop集群(4.00 / 4分)
操作环境: python-hive
4. 开启mysql服务,并初始化数据库(4.00 / 4分)
操作环境: python-hive
5. 开启hiveserver2服务,查看端口是否正常开启(4.00 / 4分)
操作环境: python-hive
6. 查看hiveserver2对应的UI界面是否正常打开(4.00 / 4分)
操作环境: python-hive
使用python操作hive(60.00 / 60分)
python中用于连接HiveServer2的客户端有3个:pyhs2,pyhive,impyla。
本次赛题要求使用pyhive,环境中已经安装python3.x。
1.python3使用pyhive所需库及软件,命令如下:(需要手动下载,无需修改本地源)
# 所需软件
yum -y install cyrus-sasl cyrus-sasl-devel cyrus-sasl-lib
yum -y install cyrus-sasl-plain cyrus-sasl-devel cyrus-sasl-gssapi
# 所需依赖库
pip install sasl
pip install thrift
pip install thrift-sasl
pip install pyhive
2.连接使用CUSTOM模式时,设置密码;
-
数据库用户名:root
-
数据库密码:123456
3.常用的函数
commit() :提交;
rollback() :回滚;
cursor用来执行命令的方法:
callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数;
execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数;
executemany(self, query, args):执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数;
nextset(self):移动到下一个结果集;
cursor用来接收返回值的方法:
fetchall(self):接收全部的返回结果行;
fetchmany(self, size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据;
fetchone(self):返回一条结果行;
scroll(self, value, mode='relative'):移动指针到某一行.如果mode='relative',则表示从当前所在行移动value条,如果 mode='absolute',则表示从结果集的第一行移动value条。
4.题目补充
1.创建文件/root/hs2/task1.py,编写程序连接hive,查看所有数据库,运行程序并打印结果。
2.创建文件/root/hs2/task2.py,编写程序连接hive,创建数据库qingjiao(如不存在则创建)。
3.创建文件/root/hs2/task3.py,编写程序连接hive,创建数据表student并添加数据(插入数据时间较长)。
1)数据库qingjiao下创建数据表student,字段为id ,name,数据类型自行定义;
2)添加数据为:
001 python
002 hive
4.创建文件/root/hs2/task4.py,编写程序连接hive,查询数据表student下所有数据。
5.创建文件/root/hs2/task5.py,编写程序连接hive,定时查询student数据,具体见步骤说明。 1)创建函数Get_Data_From_Hive()用于读取数据库qingjiao下student表中所有数据; 2)使用while循环进行定时查询,截止到2021-12-31 23:59:59之前,每十秒钟查询一次;
考核条件如下:
1. 创建文件/root/hs2/task1.py,编写程序连接hive,查看所有数据库,运行程序并打印结果。(10.00 / 10分)
操作环境: python-hive
2. 创建文件/root/hs2/task2.py,编写程序连接hive,创建数据库qingjiao(如不存在则创建)。(10.00 / 10分)
操作环境: python-hive
3. 验证数据库青椒上是否创建成功(10.00 / 10分)
操作环境: python-hive
4. 创建文件/root/hs2/task3.py,编写程序连接hive,创建数据表student并添加数据(具体见步骤说明)(10.00 / 10分)
操作环境: python-hive
5. 创建文件/root/hs2/task4.py,编写程序连接hive,查询数据表student下所有数据,执行程序,查看打印结果(10.00 / 10分)
操作环境: python-hive
6. 创建文件/root/hs2/task5.py,编写程序连接hive,定时查询student数据,具体见步骤说明。(10.00 / 10分)
操作环境: python-hive