前面介绍了前面介绍了 Hadoop 基本概念与生态、安装(HDFS+YARN+MapReduce)实战操作、常用命令、架构基石 HDFS、统一资源管理和调度平台 YARN、分布式计算框架 MapReduce 等相关的知识点,今天我将详细的为大家介绍 大数据 Hadoop 数据仓库 Hive 相关知识!
数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策;
数据仓库的体系结构:
Hive 是建立在 Hadoop 之上的数据仓库,由 Facebook 开发,在某种程度上可以看成是用户编程接口,本身并不存储和处理数据,依赖于 HDFS 存储数据,依赖 MR 处理数据。有类 SQL 语言 HiveQL,不完全支持SQL 标准,如,不支持更新操作、索引和事务,其子查询和连接操作也存在很多限制。
Hive把HQL语句转换成MR任务后,采用批处理的方式对海量数据进行处理。数据仓库存储的是静态数据,很适合采用MR进行批处理。Hive还提供了一系列对数据进行提取、转换、加载的工具,可以存储、查询和分析存储在HDFS上的数据。
Hive在企业大数据分析平台中的应用
Hive在Facebook公司中的应用
Hive 主要由三个部分组成:Clients(客户端)、Serverices(服务)、Storage and compute(存储和计算)。
Hive 的存储结构包括数据库、表、视图、分区和表数据:
select rank, level ,count(*) as value from score group by rank, level
1.由Hive驱动模块中的编译器对用户输入的SQL语言进行词法和语法解析,将SQL语句转化为抽象语法树的形式;
2.抽象语法树的结构仍很复杂,不方 便直接翻译为MapReduce算法程序,因此把抽象语法树转化为查询块;
3.把查询块转换成逻辑查询计划,里面包含了许多逻辑操作符;
4.重写逻辑查询计划,进行优化,合并多余操作,减少MapReduce任务数量;
5.将逻辑操作符转换成需要执行的具体MapReduce任务;
6.对生成的MapReduce任务进行优化,生成最终的MapReduce任务执行计划;
7.由Hive驱动模块中的执行器,对最终的MapReduce任务进行执行输出;
为什么安装 MySQL 而不使用 Hive 自带的 derby?
下载并安装 MySQL 官方的 Yum Repository,采用wget方式进行安装。
wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
使用上面的命令就直接下载了安装用的Yum Repository,大概25KB,然后就可以直接应用yum进行安装了,命令及执行效果如下:
sudo yum -y install mysql57-community-release-el7-10.noarch.rpm安装Mysql服务器
sudo yum -y install mysql-community-server启动Mysql并查看运行状态
sudo systemctl start mysqld.service修改默认密码
sudo systemctl status mysqld.service
#初始密码获取
sudo grep "password" /var/log/mysqld.log
#输入密码登录mysql
mysql -u root -p
#密码修改
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Hive@2020';
注意:密码设置必须要大小写字母数字和特殊符号,不然不能配置成功。
开启mysql的远程访问执行以下命令开启远程访问限制(注意:下面命令开启所有的IP,如要开启某个具体IP是192.168.150.71,则将%替换成IP地址):
grant all privileges on *.* to 'root'@'%' identified by 'Hive@2020' with grant option;修改mysql的字符编码以防止中文乱码问题
#刷新权限:
flush privileges;
#显示原来编码
show variables like '%character%';
#若character_set_server不是utf-8,修改/etc/my.cnf(sudo vim /etc/my.cnf)(输入如下参数选项)
character_set_server=utf8
init_connect='SET NAMES utf8'
#重启数据库生效配置
sudo systemctl restart mysqld
#下载Hive文件解压与赋权
sudo tar -zxvf ./Downloads/apache-hive-3.1.2-bin.tar.gz -C /usr/local
cd /usr/local/
sudo mv apache-hive-3.1.2-bin hive
sudo chown -R hadoop ./hive
Hive环境变量配置:vim ~/.bashrc
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
记住:source ~/.bashrc
修改配置文件新建hive-site.xml,添加如下配置信息
<?xml version="1.0" encoding="UTF-8" standalone="no"?>Hive的MySQL配置
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false</value>
<description>
JDBC connect string for a JDBC metastore.
To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL.
For example, jdbc:postgresql://myhost/db?ssl=true for postgres database.
</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>Username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
<description>password to use against metastore database</description>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/hive/warehouse</value>
<description>location of default database for the warehouse</description>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<property>
<name>datanucleus.readOnlyDatastore</name>
<value>false</value>
</property>
<property>
<name>datanucleus.fixedDatastore</name>
<value>false</value>
</property>
<property>
<name>datanucleus.autoCreateSchema</name>
<value>true</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
<property>
<name>datanucleus.autoCreateTables</name>
<value>true</value>
</property>
<property>
<name>datanucleus.autoCreateColumns</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
</configuration>
下载jdbc驱动:https://dev.mysql.com/downloads/connector/j/5.1.html
#解压拷贝:
sudo tar -zxvf ./Downloads/mysql-connector-java-5.1.49.tar.gz -C /usr/local #解压
cd /usr/local/
cp mysql-connector-java-5.1.49/mysql-connector-java-5.1.49-bin.jar ./hive/lib
启动并登陆MySQL
mysql -u root -p
新建hive数据库
create database hive; # 与hive-site.xml中localhost:3306/hive的hive对应,用来保存hive元数据
配置Mysql允许hive接入
create user ‘hive’@‘localhost’ identified by ‘hive’; # hive用户密码;
GRANT ALL ON \*.\* TO ‘hive’@‘localhost’; # 将所有数据库的所有表的所有权限赋给hive用户;
flush privileges; # 刷新mysql系统权限关系表;
启动hive
#启动hdfs与yarn:start-dfs.sh、start-yarn.sh
#启动hive
cd /usr/local/hive
./bin/schematool -dbType mysql -initSchema
./bin/hive
使用mysql作为元数据库时登陆启动Hive过程中,可能出现的错误和解决方案:
java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument
#原因:hive内依赖的guava.jar和hadoop内的版本不一致;
#解决方法:
1、查看hadoop安装目录下share/hadoop/common/lib内guava.jar版本;
2、查看hive安装目录下lib内guava.jar的版本 如果两者不一致,删除版本低的,并拷贝高版本的,问题解决;
org.datanucleus.store.rdbms.exceptions.MissingTableException: Required table missing : “VERSION” in Catalog “Schema”. DataNucleus requires this table to perform its persistence operations.
#解决方法:进入hive安装目录(比如/usr/local/hive),执行如下命令
./bin/schematool -dbType mysql -initSchema
Hive metastore database is not initialized
schematool -dbType mysql -initSchema
#创建数据库:create database [if not exists] database_name;查看数据库、表
hive> create database if not exists college;
#创建表(内部表、外部表以及分区表见附录):
create [external] table [if not exists] table_name
[(col_1 dt [comment c_com_1],col_2 dt [comment c_com_2],...)]
[partitioned by (col dt,...)];
hive> use college;
hive> create table if not exists student(id int,name string);
#创建视图
hive> create view stu as select id,name from student where id<10;
查看数据库
#查看所有数据库修改数据库、表
hive> show databases;
#查看以h开头的所有数据库
hive> show databases like ‘col.*’
#查看hive数据库位置等信息
describe database hive;
desc database hive;
desc database extended hive;
#查看表
hive> show tables;
hive> show tables in college like ‘s.*’;
用户可以使用ALTER DATABASE命令为某个数据库的DBPROPERTIES设置键-值对属性值,来描述这个数据库的属性信息,数据库的其它元数据信息都是不可更改的,包括数据库名和数据库所在的目录位置。
alter database hive set dbproperties(‘createtime’=‘20201122’);
#重命名(RENAME)表删除数据库、表
alter table table_name rename to new_table_name
#增加(ADD)/修改(CHANGE)/替换(REPLACE)列信息
alter table table_name add columns (col dt); # 加到所有列后,但在partition列前
alter table table_name change column col_name new_col_name data_type;
alter table table_name replace columns (col_a dt,col_b dt,…); # 替换整个表的列
#删除数据库向表中装载数据
drop database db [cascade]; # 非空数据库使用cascade,否则报错
#删除表
drop table table_name;
#装载本地数据
hive> load data local inpath ‘/home/hadoop/stu.txt’ overwrite into table student; #overwrite覆盖
#与下述语句等同(load本地数据本质即为上传本地数据到hive数据表存放路径)
hadoop fs -put /home/hadoop/stu.txt /hive/warehouse/college.db/student
#装载hdfs数据
hive> load data inpath ‘/user/hadoop/stu.txt’ overwrite into table student; # overwrite 覆盖
向表中插入数据
insert (overwrite) table student_copy select * from student where id<10;
从查询表中数据
使用select…from…where…等语句,并结合关键字group by、having、like等操作;
case…when…then…连接
select id,name
case
when id=1 then 'first'
when id=2 then 'second'
else 'other' end from student;
#内连接
select stu.*, course.* from stu join course on(stu.id=course.sid);
#左连接
select stu.*, course.* from stu left outer join course on(stu.id=course.sid);
#右连接
select stu.*, course.* from stu right outer join course on(stu.id=course.sid);
#全连接
select stu.*, course.* from stu full outer join course on(stu.id=course.sid);
#半连接
select stu.* from stu left semi join course on(stu.id=course.sid);
默认创建的表都是所谓的管理表,有时也被称为内部表,因为这种表,Hive会或多或少地控制着数据的生命周期。Hive默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse/dir所定义的目录或其子目录下。当我们删除一个管理表时,Hive也会删除这个表中的数据。管理表不适合和其它工具共享数据。
Hive创建外部表时,仅记录数据所在的路径,不会对数据的位置做任何改变。外部表与内部表的主要区别在于删除外部表时,Hive不会删除这个表中的数据,重新创建该表仍然可以查到该数据(Mysql的元数据与Hdfs的原数据缺失任何一个都不能查询到该表的数据,且它们数据的先后,即先有元数据或先有原数据,不影响表数据的查询;Hive删除外部表只是删除元数据,但删除内部表会删除元数据与原数据)。
管理表与外部表的的互相转换:
alter table student set tblproperties(‘EXTERNAL’=‘FALSE’);
alter table student set tblproperties(‘EXTERNAL’=‘TRUE’)
注:‘EXTERNAL’='FALSE’必须大写;
分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹是该分区所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句的表达式选择查询所需要的指定的分区能够提高查询效率(避免全表扫描)。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!