“携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情”
生命无罪,健康万岁,我是laity。
我曾七次鄙视自己的灵魂:
第一次,当它本可进取时,却故作谦卑;
第二次,当它在空虚时,用爱欲来填充;
第三次,在困难和容易之间,它选择了容易;
第四次,它犯了错,却借由别人也会犯错来宽慰自己;
第五次,它自由软弱,却把它认为是生命的坚韧;
第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;
第七次,它侧身于生活的污泥中,虽不甘心,却又畏首畏尾。
数据仓库基础知识
概念:数据仓库,是一个用于存储、分析、报告的数据系统。
- 数据仓库的目的是构建面向分析的集成化数据环境,分析结果为企业提供决策支持。
Hive入门
Hive是基于Hadoop的数据仓库软件,我们负责写Sql,Hive将我们写的Sql帮助我们转为mr。
- 元数据:表与文件的对应关系
元数据的概念:Metadate,又称中介数据、中继数据,为描述数据的数据,主要描述数据的属性信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。
元数据的存储:Hive说如果你不想自己存我有一个自己的关系型数据库Derby,当然你也可以使用第三方如MySQL等。
Hive安装部署
搭建远程服务:不使用Hive自己的数据库,使用第三方数据库
<!--在core-size.xml中添加-->
<!-- 整合hive 用户代理设置 -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
<!-- 文件系统垃圾桶保存时间 -->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
安装MySQL数据库
已完成
Hive安装
-
只需要在一台服务器上安装即可
-
上传安装包并解压
tar zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/laityInstall/
- 解决Hive与
Hadoop之间guava版本差异
cd /opt/laityInstall/apache-hive-3.1.2-bin/
rm -rf lib/guava-19.0.jar
cp /opt/laityInstall/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/
-
修改配置文件
-
hive-env.sh
cd /opt/laityInstall/apache-hive-3.1.2-bin/conf mv hive-env.sh.template hive-env.sh vim hive-env.sh export HADOOP_HOME=/opt/laityInstall/hadoop export HIVE_CONF_DIR=/opt/laityInstall/apache-hive-3.1.2-bin/conf export HIVE_AUX_JARS_PATH=/opt/laityInstall/apache-hive-3.1.2-bin/lib -
-
hive-site.xmlvim hive-site.xml<configuration> <!-- 存储元数据mysql相关配置 --> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://Itlaity101:3306/hive3?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>Wang9264.</value> </property> <!-- H2S运行绑定host --> <property> <name>hive.server2.thrift.bind.host</name> <value>Itlaity101</value> </property> <!-- 远程模式部署metastore metastore地址 --> <property> <name>hive.metastore.uris</name> <value>thrift://Itlaity101:9083</value> </property> <!-- 关闭元数据存储授权 --> <property> <name>hive.metastore.event.db.notification.api.auth</name> <value>false</value> </property> </configuration>
-
-
上传mysql jdbc驱动到hive安装包lib下
mysql-connector-java-5.1.32.jar -
初始化元数据
cd /opt/laityInstall/apache-hive-3.1.2-bin/ bin/schematool -initSchema -dbType mysql -verbos #初始化成功会在mysql中创建74张表 -
在hdfs创建hive存储目录(如存在则不用操作)
hadoop fs -mkdir /tmp hadoop fs -mkdir -p /user/hive/warehouse hadoop fs -chmod g+w /tmp hadoop fs -chmod g+w /user/hive/warehouse -
==启动hive==
-
1、启动metastore服务
#前台启动 关闭ctrl+c /opt/laityInstall/apache-hive-3.1.2-bin/bin/hive --service metastore #前台启动开启debug日志 /opt/laityInstall/apache-hive-3.1.2-bin/bin/hive --service metastore --hiveconf hive.root.logger=DEBUG,console #后台启动 进程挂起 关闭使用jps+ kill -9 nohup /opt/laityInstall/apache-hive-3.1.2-bin/bin/hive --service metastore & # 查看jps 83078 RunJar -- 有这个就说明后台启动成功了
-
-
2、启动hiveserver2服务 -- 不推荐
nohup /opt/laityInstall/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 & #注意 启动hiveserver2需要一定的时间 不要启动之后立即beeline连接 可能连接不上 # 显示两个 runjar 就是成功的表现 /opt/laityInstall/apache-hive-3.1.2-bin/bin/hive -
3、beeline客户端连接 -- 推荐
-
拷贝node1安装包到beeline客户端机器上(node3)
scp -r /opt/laityInstall/apache-hive-3.1.2-bin/ Itlaity103:/export/server/ -
错误
Error: Could not open client transport with JDBC Uri: jdbc:hive2://node1:10000: Failed to open new session: java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: root is not allowed to impersonate root (state=08S01,code=0)-
修改
在hadoop的配置文件core-site.xml中添加如下属性: <property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property> -
连接访问
/opt/laityInstall/apache-hive-3.1.2-bin/bin/beeline beeline> ! connect jdbc:hive2://Itlaity101:10000 beeline> root beeline> 直接回车
-
-
-
错误解决:==Hive3执行insert插入操作 statstask异常==
-
现象
在执行insert + values操作的时候 虽然最终执行成功,结果正确。但是在执行日志中会出现如下的错误信息。 -
开启hiveserver2执行日志。查看详细信息
2020-11-09 00:37:48,963 WARN [5ce14c58-6b36-476a-bab8-89cba7dd1706 main] metastore.RetryingMetaStoreClient: MetaStoreClient lost connection. Attempting to reconnect (1 of 1) after 1s. setPartitionColumnStatistics ERROR [5ce14c58-6b36-476a-bab8-89cba7dd1706 main] exec.StatsTask: Failed to run stats task -
但是 ==此错误并不影响最终的插入语句执行成功==。
-
分析原因和解决
-
statstask是一个hive中用于统计插入等操作的状态任务 其返回结果如下
-
此信息类似于计数器 用于告知用户插入数据的相关信息 但是不影响程序的正常执行。
-
Hive新版本中 这是一个issues 临时解决方式如下
-
==在mysql metastore中删除 PART_COL_STATS这张表即可==。
-
-
-
SQL语言:
- Hive可视化客户端:
DataGrip、Dbeaver、SQuirrel SQL Client等
DML语法:
关系型数据库sql语句我之前复习完完不久,所以我这里就再不做笔记了。
Load加载数据操作
# Hive服务的启动
nohup /opt/laityInstall/apache-hive-3.1.2-bin/bin/hive --service metastore & # metastore
nohup /opt/laityInstall/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 & # hiveserver2
# 客户端连接
/opt/laityInstall/apache-hive-3.1.2-bin/bin/beeline
beeline> ! connect jdbc:hive2://Itlaity101:10000
beeline> root
beeline> 直接回车
# 在 beeline客户端 中执行 -- 复制
load data local inpath "Hive部署的服务器中文件的地址(Itlaity101)" into table "HDFS存放的目标位置";
# 移动
load data inpath "HDFS的文件位置" into table "HDFS存放的目标位置";
insert插入数据操作
# 标准插入 -- 时间很慢
insert into table 表名("指定键") values("数据"...);
insert into table 表名 values("数据"...);
# insert + select
insert into table 表名 select 字段,字段... from student;
select查询语句
# having与where区别 -- 两个都是过滤
having 在分组(group by)后对数据进行过滤
where是在分组前对数据进行过滤
having可以使用聚合函数
where不可以使用聚合函数
# 执行顺序
select state,sum(deaths) as cnts from t_usa_covid19
where count_date = "2021-01-28"
group by state
having cnts> 10000
limit 2;
# 也就是 from > where > group by > having > limit > order by > select
join 关联查询 外键
# 使用最多的join分别是:
inner join -- 内连接
left join -- 左连接
# 内连接 -- 关联表的交集部分
# 左连接 -- 以左边表的全部数据为准,右边与之关联;左表数据全部返回,右表关联上的显示返回,关怀不上的显示null返回。
Hive 常用函数
# 查看hive有哪些函数
show functions;
# 描述一个函数的用法
describe function extended 函数名(count);