目录
大数据导论与Linux基础
Apache Hadoop、HDFS
大数据导论与Linux基础
数据仓库基本概念
数据仓库概念
数据仓库主要特征
数据仓库主流开发语言--SQL
Apache Hive入门
Apache Hive概述
场景设计:如何模拟实现Hive功能
Apache Hive架构、组件
Apache Hive安装部署
Apache Hive元数据
Hive3安装
Apache Hive客户端使用
Hive SQL 语言
数据仓库基本概念
数据仓库概念
-
数据仓库(简称DW、数仓),是一个用于存储、分析、报告的数据系统
-
数据仓库本身并不“生产”任何数据,其数据来源于不同外部系统
-
同时数据仓库自身也不需要“消费”任何的数据,其结果开放给各个外部应用使用
-
这也是为什么叫“仓库”,而不叫“工厂”的原因
-
数据仓库是为了分析数据而来,分析结果给企业决策提供支撑
数据仓库主要特征
-
面向主题:主题是一个抽象概念,是较高层次上数据综合、归类并进行分析利用的抽象
-
集成性:主题相关的数据通常分布在多个操作系统中,彼此分散、独立、异构,因此再数据进入数仓之前,必须要经过统一与综合,对数据进行抽取、清理、转换和汇总
-
非易失性、非易变性:
-
数仓是分析数据的平台,而不是创造数据的平台。我们通过数仓去分析数据中的规律,而不是去创造修改其中的规律。因此数据进入数仓之后,它便稳定且不会改变
-
数仓的数据反应的是一段相当长的时间内历史数据的内容,数仓的用户对数据的操作大多是数据查询或比较复杂的挖掘,一旦数据进入数仓之后,一般情况下被较长时间保留
-
数仓一般有大量的查询操作,但修改和删除操作很少
-
-
时变性:数据仓库的数据需要随着时间更新,以适应决策的需要
数据仓库主流开发语言--SQL
-
结构化查询语言(简称SQL),是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理数据
-
虽然SQL语言是针对数据库软件设计的,但是在数仓领域,尤其是大数据数仓领域,很多数仓软件都会去支持SQL语法。原因在于:用于学习SQL成本低,SQL语言对数据分析十分友好
-
结构化数据与非结构化数据
-
SQL语法分类:
-
数据定义语言(DDL),使我们有能力创建或删除表,以及数据库、索引等各种对象,但是不涉及表中具体数据操作:
CREATE DATABASE - 创建新数据库 CREATE TABLE - 创建新表
-
数据操纵语言(DML),针对表中的数据进行增删改查:
SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT - 向数据库表中插入数据
-
Apache Hive入门
Apache Hive概述
什么是Hive
-
Hive是一款建立在Hadoop之上的开源的数仓系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,称为Hive查询语言(HQL),用于访问存储在Hadoop文件中的大型数据集
-
Hive核心是将HQL转化为MapReduce程序,然后将程序提交到Hadoop集群执行
为什么使用Hive
-
使用MapReduce直接处理数据所面临的问题
-
人员学习成本太高,需要掌握
-
MapReduce实现复杂查询逻辑开发难度太大
-
-
使用Hive处理数据的好处
-
操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)
-
避免直接写MapReduce,减少开发人员的学习成本
-
支持自定义函数,功能扩展很方便
-
背靠Hadoop,擅长存储分析海量数据集
-
Hive和Hadoop关系
-
Hive利用HDFS存储数据,利用MapReduce查询分析数据
场景设计:如何模拟实现Hive功能
-
Hive能将数据文件映射成为一张表,这个映射是什么?
-
映射信息专业的叫法称之为元数据信息,它包含:
-
表对应着哪个文件(位置信息)
-
表的列对应着文件哪一个字段(顺序信息)
-
文件字段之间的分隔符是什么
-
-
-
Hive软件本身到底承担了什么功能职责?
-
SQL语法校验、解析、编译成为MapReduce
-
-
最终效果
Apache Hive架构、组件
Apache Hive安装部署
Apache Hive元数据
-
元数据是描述数据的数据,主要是描述数据属性的信息
-
Hive Metadata即Hive的元数据,包含用Hive创建的database、table、表的位置、类型、属性、字段顺序类型等元信息
-
元数据存储在关系型数据库中。如hive内置的Derby或者第三方如MySQL等
-
Hive Metastore即元数据服务。Metastore服务的作用是管理metadata元数据,对外暴露服务地址,让各种客户端通过连接matestore服务,由metastore再去连接MySQL数据库来存取元数据
-
metastore服务配置有3张模式:内嵌模式、本地模式、远程模式
-
在生产环境中,建议用远程模式来配置Hive Metastore。在这种情况下,其他依赖hive的软件都可以通过Metastore访问hive。由于还可以完全屏蔽数据库层,因此这也带来了更好的可管理性/安全性。
Hive3安装
安装前准备
-
服务器基础环境:集群时间同步、防火墙关闭、主机Host映射、免密登录、JDK安装
-
Hadoop集群健康可用:启动Hive之前必须先启动Hadoop集群。特别要注意,需等待HDFS安全模式关闭之后再启动运行Hive
Hadoop与Hive整合
-
因为Hive需要把数据存储在HDFS上,并且通过MapReduce作为执行引擎处理数据;
-
因此需要在Hadoop中添加相关配置属性,以满足Hive在Hadoop上运行。
-
修改Hadoop中core-site.xml,并且Hadoop集群同步配置文件,重启生效。
<!-- 整合hive -->
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property
Mysql安装
-
卸载Centos7自带的mariadb
[root@node3 ~]# rpm -qa|grep mariadb mariadb-libs-5.5.64-1.el7.x86_64 [root@node3 ~]# rpm -e mariadb-libs-5.5.64-1.el7.x86_64 --nodeps [root@node3 ~]# rpm -qa|grep mariadb [root@node3 ~]#
-
安装mysql
mkdir /export/software/mysql #上传mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar 到上述文件夹下 解压 tar xvf mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar #执行安装 yum -y install libaio [root@node3 mysql]# rpm -ivh mysql-community-common-5.7.29-1.el7.x86_64.rpm mysql-community-libs-5.7.29-1.el7.x86_64.rpm mysql-community-client-5.7.29-1.el7.x86_64.rpm mysql-community-server-5.7.29-1.el7.x86_64.rpm warning: mysql-community-common-5.7.29-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY Preparing... ################################# [100%] Updating / installing... 1:mysql-community-common-5.7.29-1.e################################# [ 25%] 2:mysql-community-libs-5.7.29-1.el7################################# [ 50%] 3:mysql-community-client-5.7.29-1.e################################# [ 75%] 4:mysql-community-server-5.7.29-1.e################ ( 49%)
-
mysql初始化设置
#初始化 mysqld --initialize #更改所属组 chown mysql:mysql /var/lib/mysql -R #启动mysql systemctl start mysqld.service #查看生成的临时root密码 cat /var/log/mysqld.log [Note] A temporary password is generated for root@localhost: o+TU+KDOm004
-
修改root密码 授权远程访问 设置开机自启动
[root@node2 ~]# mysql -u root -p Enter password: #这里输入在日志中生成的临时密码 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.29 Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> #更新root密码 设置为hadoop mysql> alter user user() identified by "hadoop"; Query OK, 0 rows affected (0.00 sec) #授权 mysql> use mysql; mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'hadoop' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES; #mysql的启动和关闭 状态查看 (这几个命令必须记住) systemctl stop mysqld systemctl status mysqld systemctl start mysqld #建议设置为开机自启动服务 [root@node2 ~]# systemctl enable mysqld Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system/mysqld.service. #查看是否已经设置自启动成功 [root@node2 ~]# systemctl list-unit-files | grep mysqld mysqld.service enabled #退出mysql登陆 Ctrl+d
-
Centos7 干净卸载mysql 5.7
#关闭mysql服务 systemctl stop mysqld.service #查找安装mysql的rpm包 [root@node3 ~]# rpm -qa | grep -i mysql mysql-community-libs-5.7.29-1.el7.x86_64 mysql-community-common-5.7.29-1.el7.x86_64 mysql-community-client-5.7.29-1.el7.x86_64 mysql-community-server-5.7.29-1.el7.x86_64 #卸载 [root@node3 ~]# yum remove mysql-community-libs-5.7.29-1.el7.x86_64 mysql-community-common-5.7.29-1.el7.x86_64 mysql-community-client-5.7.29-1.el7.x86_64 mysql-community-server-5.7.29-1.el7.x86_64 #查看是否卸载干净 rpm -qa | grep -i mysql #查找mysql相关目录 删除 [root@node1 ~]# find / -name mysql /var/lib/mysql /var/lib/mysql/mysql /usr/share/mysql [root@node1 ~]# rm -rf /var/lib/mysql [root@node1 ~]# rm -rf /var/lib/mysql/mysql [root@node1 ~]# rm -rf /usr/share/mysql #删除默认配置 日志 rm -rf /etc/my.cnf rm -rf /var/log/mysqld.log
Hive的安装
-
上传安装包到/export/server 解压
tar zxvf apache-hive-3.1.2-bin.tar.gz
-
解决Hive与Hadoop之间guava版本差异
cd /export/server/apache-hive-3.1.2-bin/ rm -rf lib/guava-19.0.jar cp /export/server/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/
-
修改配置文件
-
hive-env.sh
cd /export/server/apache-hive-3.1.2-bin/conf mv hive-env.sh.template hive-env.sh vim hive-env.sh export HADOOP_HOME=/export/server/hadoop-3.3.0 export HIVE_CONF_DIR=/export/server/apache-hive-3.1.2-bin/conf export HIVE_AUX_JARS_PATH=/export/server/apache-hive-3.1.2-bin/lib
-
hive-site.xml
vim hive-site.xml <configuration> <!-- 存储元数据mysql相关配置 --> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://node1: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>hadoop</value> </property> <!-- H2S运行绑定host --> <property> <name>hive.server2.thrift.bind.host</name> <value>node1</value> </property> <!-- 远程模式部署metastore metastore地址 --> <property> <name>hive.metastore.uris</name> <value>thrift://node1: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 /export/server/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 /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore #前台启动开启debug日志 /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore --hiveconf hive.root.logger=DEBUG,console #后台启动 进程挂起 关闭使用jps+ kill -9 nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &
-
Apache Hive客户端使用
-
HiveServer2通过Metastore服务读写元数据。所以在远程模式下,启动HiveServer2之前必须先启动metastore服务
-
远程模式下,Beeline客户端只能通过HiveServer2服务访问Hive。而bin/hive是通过Metastore服务访问的
bin/beeline客户端使用
-
在hive安装的服务器上(node1),首先启动metastore服务,然后启动hiveserver2服务
nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &
nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 &
-
在node3上使用beeline客户端进行连接访问。需要注意hiveserver2服务启动之后需要稍等一会才可以对外提供服务
-
beeline客户端连接
-
拷贝node1安装包到beeline客户端机器上(node3)
scp -r /export/server/apache-hive-3.1.2-bin/ node3:/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>
-
连接访问
/export/server/apache-hive-3.1.2-bin/bin/beeline beeline> ! connect jdbc:hive2://node1:10000 beeline> root beeline> 直接回车
-
-
-
Hive SQL 语言
-
在Hive中,默认的数据库叫做default,存储数据位位于HDFS的/user/hive/warehouse下
-
用户自己创建的数据库存储位置是/user/hive/warehouse/database_name.db下
-
Hive最常用的数据类型是string和int
-
分隔符指定语法
-
row format delimited 语法用于指定字段之间等相关的分隔符,这样Hive才能正确的读取解析数据
-
-
Hive建表时如果没有 row format语法指定分隔符,则采用默认分隔符'\001',使用ASCII编码的值,键盘是打不出来的
-
在vim中,连续按下Ctrl+v/Ctril+a即可输入'\001',显示^A
-
-
-
-
在一些文本编辑器上以SOH的形式显示
-
-
练习
--创建数据库并切换使用
create database if not exists itheima;
use itheima;
--ddl create table
create table t_archer(
id int comment "ID",
name string comment "英雄名称",
hp_max int comment "最大生命",
mp_max int comment "最大法力",
attack_max int comment "最高物攻",
defense_max int comment "最大物防",
attack_range string comment "攻击范围",
role_main string comment "主要定位",
role_assist string comment "次要定位"
) comment "王者荣耀射手信息"
row format delimited
fields terminated by "\t";
建表成功之后,在Hive的默认存储路径下就生成了表对应的文件夹,将archer.txt文件上传到对应的文件夹下。
#在node机器上进行操作
cd ~
mkdir hivedata
cd hivedata/
#把文件从课程资料中首先上传到node1 linux系统上
#执行命令把文件上传到HDFS表所对应的目录下
hadoop fs -put archer.txt /user/hive/warehouse/itheima.db/t_archer
结果验证