Hive学习笔记总结,未完待续
Hive的基本操作
前言
关于hive日常学习总结的笔记
提示:以下是本篇文章正文内容,下面案例可供参考
一、学习回顾
1.MapReduce中补充
- 分片的规则:决定了Map个数,取决于输入的类ileInputFormat会将输入的文件分歌城split。split的个数决定了map的个数。(文件的大小dfs.block.size:默认128M)
- 默认输入类:TextInputFormat
- 输入的文件是否大于128M的1.1倍
- 如果大于,128M一个块对应一个分片
- 如果小于,整个作为一个分片
- 分片的方法:getSplits
- 默认输入类:TextInputFormat
- MapReduce Join
- Reduce Join
- 特点:通过让两份数据经过shuffle,将相同的关联字段进行分组,在reduce中实现join
- 场景:大数据 join 大数据
- Map Join
- 特点:join发生在Map端,不用经过shuffle,将 小数据放入分布式缓存中,与大数据的每个部分进行join
- 场景:小数据 join 大数据
- Reduce Join
2,YARN
- 架构以及Mapreduce程序在YARN上运行的流程
- YARN的调度机制(3中)
- FIFO
- 单队列,内部还是FIFO
- 问题:不能实现多个程序并行,导致资源浪费
- Mapreduce v1中默认的通过4个Slot管理资源
- Capacity:容量调度
- Apache版本的Hadoop默认的调度机制
- 多队列,队列内部还是FIFO
- 允许动态资源抢占
- Fair:公平调度
- CDH版本的默认调度机制
- 多队列,每个队列内部公平共享资源
- 允许动态资源抢占,提供了权重机制
- FIFO
3.hive
-
功能
-
功能一:将HDFS文件映射成Hive中的数据
-
功能二:将HQL语句转换为计算的程序
-
默认转换为Mapreduce程序:hive.default.engine=mr
-
spark,tez
-
-
重点思考:这两个功能底层是如何设计实现的?
- == 功能是如何实现的? ==
- 构建HDFS文件 与Hive表的映射索引
- 例如: select * from tbname
- 通过记录表与文件的关系
- 当对表操作时,就根据映射关系,处理对应的文件
- 在hive中创建表
- == 功能是如何实现的? ==
-
create table tbname(
根据文件的内容来定义字段
)
row format delimited fields terminated by ',';
--指定以‘,’作为分隔符
- 将文件与表进行关联
load data inpath 'filepath' into table tbname;
- 元数据中记录了文件与表的映射关系
- 测试
use db_test;
create table tb_lianjia(
xiaoqu string,
huxing string,
area double,
region string,
floor string,
chaoxiang string,
tprice int,
sprice int,
builddate string
)row format delimited fields terminated by
',';
load data inpath '/secondhouse.csv' into
table tb_lianjia;
- 观察元数据: MySQL中hivemetadata数据库中
- DBS:记录了Hive中所有数据库的信息
- DBS:记录了Hive中所有数据库的信息
- TBLS:记录了Hive中所有表的信息
- - SDS:记录了Hive中的表与HDFS的映射关系
-
当用户提交SQL语句,对表进行操作时,通过映射关系,将表对应的HDFS中的目录下的所有文件进行处理
-
观察HDFS
- 数据仓库的目录
- 数据仓库的目录
-
数据库目录
-
表的目录
-
数据文件
-
== 功能二:将HQL语句转换为MAPReduce程序?==
-SQLselect 1 from 2 where 3 group by 4 having 5 order by 6 limit 7
-
1-结果的格式,决定了列
- 列的过滤
-
2-需要读取的数据源
- emp
- empno,ename,salary,deptno
- dept
- deptno ,dname
-
-
- 表/子查询【临时表】:结果中用到的列都来自于某一张表
-
- 查询所有员工编号大于100的员工编号和名称
- join:如果结果中的列来自于不同的表
- 查询所有员工编号大于100的员工名称和部门名称
- emp
-
3-决定了过滤条件,保留哪些行
- where empno > 100
-
4-按照哪个字段分组
- 关键字:每、各个‘不同、每个
-
5-决定了过滤条件,保留哪些行
- 与where的区别
- 过滤的条件是在分组前就有还是分组后才产生的
- 统计每个部门的平均薪资,返回平均薪资大于5000并且部门名称不为销售部的部门信息
- where dname != 销售部
- having avg_sal > 5000 and dname != 销售部
-
6-决定了按照哪列排序
- 关键字:最高、最低、升序,降序,前几,后几
-
7-限制输出
- limit M ,N
- M :起始位置,默认为0,第一条
- limit M ,N
-
Mapreduce
Input:输入 2 Map:基本一对一的处理,列,和行过滤 1,3 Shuffle:分组,排序 4,6 Mapreduce SQL Reduce:聚合 函数,5、7 Output 打印 -
需求:id,name,age
-
HDFS文件
1 laoda 20 2 laoer 22 3 laosan 24
-
hive
create table person(
id int,
name string,
age int
) row format delimited fields terminated by '\t';
- 关联
load data inpath 'filePath' into table persion;
-
SQL:select id,name from person where age > 20;
-
Input:根据表名访问元数据,找到这张表对应的HDFS文件
-
将这个表的目录下的所有文件作为Mapreduce的输入
-
-
Map
-
map
String[] splits = value.toString.split("\t") id = splits[0] name = split[1] age = split[2] if(age > 20){ context.write(id,name) }else{ return; }
-
-
应用场景
-
==构建数据仓库:目前Hive在工作中的主要使用场景 ==
- 通过功能一来实现的
- 管理模式:以表的形式来进行管理,通过SQL对数据进行处理
-
利用Hive实现数据的处理转换分析:目前很多的公司都选用背的工具来实现
- 通过功能二来实现
- 工作中能够使用的替代品
- SparkSQL
- Spark是一个全场景的分布式计算平台
- SparkCore:MapReduce
- 离线代码开发计算
- SparkSQL:Hive
- 离线交互式计算
- SparkStreaming:Storm / Flink
- 准实时计算,性能要求高的场景下,需要选用Storm、Flink
- SparkCore:MapReduce
- Spark是一个全场景的分布式计算平台
- Impala
- Presto
- ……
- 基于分布式内存的SQL计算引擎
- SparkSQL
-
Hive中的架构
-
CS:客户端服务端模式
- Client:客户端
- 提供与用户交互的接口
- 将请求提交给服务端
- 将结果返回给用户
- Server:服务端
- 处理客户端的请求
- Client:客户端
-
Hive客户端:与用户交互,提供SQL接口
-
Hive服务端:解析SQL,将解析好的任务提交给Hadoop
-
连接器:负责管理所有的客户端连接
-
JDBC
- url:指定服务端地址
- username
- password
-
解析器:解析SQL,验证语法,解析为语法树
- 逻辑计划:明确了用户想要实现的结果
-
优化器:根据用户的结果,自动选择一种最优的方式来实现
- 物理计划:真正要执行的计划
- 执行器:提交物理计划执行
-
-
-
元数据:负责存储整个Hive中所有关键性的信息
-
Hadoop:负责实现Hive服务端提交的任务
- 存储任务:HDFS
- 计算任务: MapReduce + YARN
-
三、Hive的元数据服务
1、元数据存储
- 内容
- Hive中运行时需要用到的所有信息
- 数据库
- 表
- 列
- 函数
- ……
- Hive中记录表与HDFS的映射关系:SDS
- Hive中运行时需要用到的所有信息
- 位置
- 默认:derby文本型数据库
- 缺点:元数据只有由一个进程进行管理访问,不能共享
- 存储的文本数据库不安全
- 缺点:元数据只有由一个进程进行管理访问,不能共享
- 自定义:将元数据存储在RDBMS中,MySQL
- 默认:derby文本型数据库
2、元数据共享
- 为什么要实现元数据共享?
- 目前在工作中已经很少使用Hive来做分析计算,由SparkSQL,Impala来实现分析计算
- 问题:SparkSQL和Impala如何知道Hive中哪些表,以及这些表对应HDFS文件?
- 解决:将Hive的元数据共享给SparkSQL或者Impala即可
- 问题:SparkSQL以及Impala不会解析元数据,只知道元数据存储的位置,不会解析元数据的内容?
- 解决:在Hive中专门构建一个服务用于提供元数据的读写请求,负责帮所有需要操作元数据的客户端进行解析
3、元数据服务
-
元数据服务:metastore
- 只要开启了元数据服务,所有需要访问元数据的进程都需要访问metastore服务
- 注意事项:服务进程启动的顺序,只要配置了metastore服务
- 先启动metastore服务
- 然后启动hive服务端
- 再启动hive客户端
-
配置并开启元数据服务
-
配置:修改hive-site.xml
<property> <name>hive.metastore.uris</name> <value>thrift://node3:9083</value> </property>
-
启动
bin/hive --service metastore
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gDrcG1Ux-1604558397905)(Day10_Hive的基本操作.assets/image-20201105113252417.png)]
-
检查端口
netstat -atunlp | grep 9083
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k3cHQd5t-1604558397907)(Day10_Hive的基本操作.assets/image-20201105113140129.png)]
-
4、测试
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YV3dz0uR-1604558397909)(Day10_Hive的基本操作.assets/image-20201105113209078.png)]
四、Hive客户端
1、Hive shell
- 命令:hive
- 特点:客户端与服务端一体的命令
- 应用:不适合于作为实现与用户的交互客户端
- 主要用于实现自动化Hive任务的开发
- 需求:每天的0点一多,所有的程序按照先后顺序自动化运行
2、Beeline
-
命令:beeline
-
特点:纯客户端,通用性的JDBC客户端
-
应用:交互性相对比较友好,一般用于测试开发的交互
-
使用
-
启动
-
先启动元数据服务:开放9083端口
-
然后启动Hive的服务端:hiveserver2:10000
bin/hiveserver2
-
检查端口
netstat -atunlp | grep 10000
-
-
最后启动Hive的客户端:beeline
-
-
-
启动方式
-
方式一
-
先进入beeline命令行
beeline
-
构建连接
!connect jdbc:hive2://node3:10000
-
输入用户名和密码
root 123456
-
进入命令行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kL9XONl3-1604558397910)(Day10_Hive的基本操作.assets/image-20201105121254390.png)]
-
-
方式二
beeline -u jdbc:hive2://node3:10000 -n root -p 123456
-
退出
!quit
-
-
问题
-
问题一:报找不到jar包
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-izfps3sI-1604558397911)(Day10_Hive的基本操作.assets/image-20201105120311827.png)]
-
原因:lib目录下没有这个jar包,beeline不需要这个jar包
- 这个jar包以前的确会在lib目录下,但是后来在2.x版本中将这个jar包放入了jdbc目录
-
解决:将这个jar包从jdbc目录复制到lib目录
cd /export/servers/hive-2.1.0-bin cp jdbc/hive-jdbc-2.1.0-standalone.jar lib/
-
-
问题二:root用户无法访问Hive
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-agwlyngT-1604558397913)(Day10_Hive的基本操作.assets/image-20201105120436525.png)]
-
原因:Hive默认的权限检查不允许root用户访问Hive以及Hadoop
-
解决:将root用户配置成Hadoop的代理用户
-
step1:先关闭hdfs和yarn
-
step2:修改配置文件core-site.xml,配置Hadoop代理用户访问
cd /export/servers/hadoop-2.7.5/etc/hadoop/ vim core-site.xml
<property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property>
-
step3:分发
scp core-site.xml node2:$PWD scp core-site.xml node3:$PWD
-
-
step4:重启HDFS和yarn
start-dfs.sh start-yarn.sh
-
-
3、JDBC
- 类似于MySQL的JDBC
- 区别:驱动类,url不一样
- 示例:https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-JDBC
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
public class HiveJdbcClient {
private static String driverName = "org.apache.hive.jdbc.HiveDriver";
/**
* @param args
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
try {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.exit(1);
}
//replace "hive" here with the name of the user the queries should run as
Connection con = DriverManager.getConnection("jdbc:hive2://localhost:10000/default", "hive", "");
Statement stmt = con.createStatement();
String tableName = "testHiveDriverTable";
stmt.execute("drop table if exists " + tableName);
stmt.execute("create table " + tableName + " (key int, value string)");
// show tables
String sql = "show tables '" + tableName + "'";
System.out.println("Running: " + sql);
ResultSet res = stmt.executeQuery(sql);
if (res.next()) {
System.out.println(res.getString(1));
}
// describe table
sql = "describe " + tableName;
System.out.println("Running: " + sql);
res = stmt.executeQuery(sql);
while (res.next()) {
System.out.println(res.getString(1) + "\t" + res.getString(2));
}
// load data into table
// NOTE: filepath has to be local to the hive server
// NOTE: /tmp/a.txt is a ctrl-A separated file with two fields per line
String filepath = "/tmp/a.txt";
sql = "load data local inpath '" + filepath + "' into table " + tableName;
System.out.println("Running: " + sql);
stmt.execute(sql);
// select * query
sql = "select * from " + tableName;
System.out.println("Running: " + sql);
res = stmt.executeQuery(sql);
while (res.next()) {
System.out.println(String.valueOf(res.getInt(1)) + "\t" + res.getString(2));
}
// regular hive query
sql = "select count(1) from " + tableName;
System.out.println("Running: " + sql);
res = stmt.executeQuery(sql);
while (res.next()) {
System.out.println(res.getString(1));
}
}
}
五、Hive常用操作配置
1、启动脚本
-
创建日志存储目录
mkdir /export/servers/hive-2.1.0-bin/logs
-
构建metastore脚本
#!/bin/bash #HIVE_HOME HIVE_HOME=/export/servers/hive-2.1.0-bin #run metastore $HIVE_HOME/bin/hive --service metastore >> $HIVE_HOME/logs/metastore.log 2>&1 &
-
构建HIveserver2脚本
#!/bin/bash #HIVE_HOME HIVE_HOME=/export/servers/hive-2.1.0-bin #run hiveserver2 $HIVE_HOME/bin/hiveserver2 >> $HIVE_HOME/logs/hiveserver2.log 2>&1 &
-
构建beeline脚本
#!/bin/bash #HIVE_HOME HIVE_HOME=/export/servers/hive-2.1.0-bin #run beeline $HIVE_HOME/bin/beeline -u jdbc:hive2://node3:10000 -n root -p 123456
2、SQL脚本
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2.读入数据
代码如下(示例):
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
该处使用的url网络请求的数据。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。