Hive

Hive的相关概念

Hive的架构图

  • 用户接口:包括 CLI、JDBC/ODBC、WebGUI。其中,CLI(command line interface)为shell命令行;Hive中的Thrift服务器允许外部客户端通过网络与Hive进行交互,类似于JDBC或ODBC协议。WebGUI是通过浏览器访问Hive。
  • 元数据存储:

    通常是存储在关系数据库如 mysql/derby中。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
  • Driver驱动程序:包括语法解析器、计划编译器、优化器、执行器。完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有执行引擎调用执行。
  • 执行引擎:Hive本身并不直接处理数据文件。而是通过执行引擎处理。当下Hive支持MapReduce、Tez、Spark 3种执行引擎。

Hive的数据模型

  • Databases 数据库

    默认数据库为default,数据存放路径为:HDFS的/user/hive/warehouse;其他数据库存放路径为:HDFS的/user/hive/warehouse/database.db

  • Tables 表

    数据存放路径为:HDFS的/user/hive/warehouse/database.db/tablename

  • Partition 分区

    分区是以表下面的子文件夹的形式存放的

  • Bucket 分桶

    Bucket分桶表是Hive的一种优化手段表。分桶是指根据表中字段(例如“编号ID”)的值,经过hash计算规则将数据文件划分成指定的若干个小文件。分桶规则:hashfunc(字段)%桶个数,余数相同的分到同一个文件。

Hive的安装

1、Hive的环境配置

1)添加环境变量

#HIVE_HOME
export HIVE_HOME=/opt/module/hive-3.1.2
export PATH=$PATH:$HIVE_HOME/bin

2)解决日志 Jar 包冲突

mv $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.jar $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.bak

3)初始化元数据库

schematool -dbType derby -initSchema

4)启动 Hive

hive

Hive 默认使用的元数据库为 derby,开启 Hive 之后就会占用元数据库,且不与其他客户端共享数据,只能开启一个终端。要想开启多个终端,我们需要将 Hive 的元数据地址改为 MySQL。

2、MySQL的安装

1)检查当前系统是否安装过 MySQL

rpm -qa|grep mariadb
//如果存在通过如下命令卸载
sudo rpm -e --nodeps mariadb-libs

2)在安装目录下执行 rpm 安装

sudo rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
sudo rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
sudo rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
sudo rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
sudo rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm

注意:按照顺序依次执行

3)初始化数据库

sudo mysqld --initialize --user=mysql

4)查看临时生成的 root 用户的密码

sudo cat /var/log/mysqld.log

5)启动 MySQL 服务

sudo systemctl start mysqld

6)登录 MySQL 数据库

mysql -uroot -p
Enter password: 输入临时生成的密码

7)必须先修改 root 用户的密码,否则执行其他的操作会报错

mysql> set password = password("新密码");

8)修改 mysql 库下的 user 表中的 root 用户允许任意 ip 连接

mysql> update mysql.user set host='%' where user='root';
mysql> flush privileges;

8)设置 MySQL 服务开机自启

sudo systemctl enable mysqld

3、将Hive的元数据配置到 MySQL

将 MySQL 的 JDBC 驱动拷贝到 Hive 的 lib 目录下

1)在conf 目录下新建 hive-site.xml 文件添加如下内容:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- jdbc 连接的 URL -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop102:3306/metastore?useSSL=false</value>
</property>
<!-- jdbc 连接的 Driver-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!-- jdbc 连接的 username-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!-- jdbc 连接的 password -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>000000</value>
</property>
<!-- Hive 元数据存储版本的验证 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<!--关闭元数据存储授权-->
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<!-- Hive 默认在 HDFS 的工作目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
</configuration>

2)登陆 MySQL

mysql -uroot -p000000

3)新建 Hive 元数据库

mysql> create database metastore;
mysql> quit;

4)初始化 Hive 元数据库

schematool -initSchema -dbType mysql - verbose

5)再次启动 Hive

4、使用元数据服务的方式访问 Hive

1)在 hive-site.xml 文件中添加如下配置信息

 <!-- 指定存储元数据要连接的地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop102:9083</value>
</property>

2)启动 metastore

hive --service metastore

注意: 启动后窗口不能再操作,需打开一个新的 shell 窗口做别的操作

3)启动hive

5、使用 JDBC 方式访问 Hive

1)在 hive-site.xml 文件中添加如下配置信息

 <!-- 指定 hiveserver2 连接的 host -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop102</value>
</property>
<!-- 指定 hiveserver2 连接的端口号 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>

2)启动 hiveserver2

启动hiveserver2时间过长可参考:https://www.yht7.com/news/129329

hive --service hiveserver2

3)启动 beeline 客户端(需要多等待一会)

若是beeline连接不上可参考:

https://blog.csdn.net/u011495642/article/details/84305944

beeline -u jdbc:hive2://hadoop102:10000 -n an

4)看到如下界面

Connecting to jdbc:hive2://hadoop102:10000
Connected to: Apache Hive (version 3.1.2)
Driver: Hive JDBC (version 3.1.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 3.1.2 by Apache Hive
0: jdbc:hive2://hadoop102:10000>

总结一下


官方强烈建议使用二代客户端,此时需要同时开启Metastore服务和HiveServer2服务。

6、Hive 运行日志信息配置

1)Hive 的 log 默认存放在/tmp/an/hive.log 目录下(当前用户名下)

2)修改 hive 的 log 存放日志到/opt/module/hive-3.1.2/logs

修改/opt/module/hive-3.1.2/conf/hive-log4j2.properties.template 文件名称为hive-log4j2.properties

然后修改:
hive.log.dir=/opt/module/hive-3.1.2/logs

7、后台运行

前台启动的方式导致需要打开多个 shell 窗口,可以使用如下方式后台方式启动:

nohup: 放在命令开头,表示关闭终端进程也继续保持运行状态
2>&1 : 表示将错误重定向到标准输出上(可省略)
&: 放在命令结尾,表示后台运行

一般会组合使用: nohup [xxx 命令操作]> file 2>&1 &,表示将 xxx 命令运行的结果输出到 file 中,并保持命令启动的进程在后台运行。

nohup hive --service metastore 2>&1 &
nohup hive --service hiveserver2 2>&1 &

启动和关闭脚本:

#!/bin/bash
#检查进程是否运行正常,参数 1 为进程名,参数 2 为进程端口
function check_process()
{
pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}')
ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)
echo $pid
[[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1
}
function hive_start()
{
metapid=$(check_process HiveMetastore 9083)
cmd="nohup hive --service metastore 2>&1 &"
[ -z "$metapid" ] && eval $cmd || echo "Metastroe 服务已启动"
server2pid=$(check_process HiveServer2 10000)
cmd="nohup hiveserver2 2>&1 &"
[ -z "$server2pid" ] && eval $cmd || echo "HiveServer2 服务已启动"
}
function hive_stop()
{
metapid=$(check_process HiveMetastore 9083)
[ "$metapid" ] && kill $metapid || echo "Metastore 服务未启动"
server2pid=$(check_process HiveServer2 10000)
[ "$server2pid" ] && kill $server2pid || echo "HiveServer2 服务未启动"
}
case $1 in
"start")
hive_start
;;
"stop")
hive_stop
;;
"restart")
hive_stop
sleep 2
hive_start
;;
"status")
check_process HiveMetastore 9083 >/dev/null && echo "Metastore 服务运行正常" || echo "Metastore 服务运行异常"
check_process HiveServer2 10000 >/dev/null && echo "HiveServer2 服务运行正常" || echo "HiveServer2 服务运行异常"
;;
*)
echo Invalid Args!
echo 'Usage: '$(basename $0)' start|stop|restart|status'
;;
esac

Hive DDL语法

1、数据类型

基本数据类型:

集合数据类型

隐式转换:

  • 任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT 可以转换成INT,INT 可以转换成 BIGINT。
  • 所有整数类型、FLOAT 和 STRING 类型都可以隐式地转换成 DOUBLE。
  • TINYINT、SMALLINT、INT 都可以转换为 FLOAT。
  • BOOLEAN 类型不可以转换为任何其它的类型。

显示转换:

  • 可以使用 CAST 操作显示进行数据类型转换

    例如 CAST('1' AS INT)将把字符串'1' 转换成整数 1;如果强制类型转换失败,如执行CAST('X' AS INT),表达式返回空值NULL。

2、创建、删除数据库database

CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];

3、创建、删除表table

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement]
  • CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;

    用户可以用 IF NOT EXISTS 选项来忽略这个异常。

  • EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时可以指定一个指向实

    际数据的路径(LOCATION),在删除表的时候,内部表的元数据和数据会被一起删除,而外

    部表只删除元数据,不删除数据。

  • COMMENT:为表和列添加注释。

  • PARTITIONED BY 创建分区表

  • CLUSTERED BY 创建分桶表

  • SORTED BY 不常用,对桶中的一个或多个列另外排序

  • ROW FORMAT

    DELIMITED [FIELDS TERMINATED BY char]字段之间
    [COLLECTION ITEMS TERMINATED BY char]集合元素之间
    [MAP KEYS TERMINATED BY char]Map的KV之间
    [LINES TERMINATED BY char]行之间
    | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value,
    property_name=property_value, ...)]

    用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW

    FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户还需

    要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive 通过 SerDe 确定表

    的具体的列的数据。

    SerDe 是 Serialize/Deserilize 的简称, hive 使用 Serde 进行行对象的序列与反序列化。

  • STORED AS 指定存储文件类型

    常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列

    式存储格式文件)

    如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED

    AS SEQUENCEFILE。

  • LOCATION :指定表在 HDFS 上的存储位置。

  • AS:后跟查询语句,根据查询结果创建表。

  • LIKE 允许用户复制现有的表结构,但是不复制数据。

DROP TABLE [IF EXISTS] table_name [RESTRICT|CASCADE];

Hive DML语法

1、加载数据

利用load:

hive> load data [local] inpath '数据的 path' [overwrite] into table
student [partition (partcol1=val1,…)];
  • load data:表示加载数据
  • local:表示从本地加载数据到 hive 表;否则从 HDFS 加载数据到 hive 表
  • inpath:表示加载数据的路径
  • overwrite:表示覆盖表中已有数据,否则表示追加
  • into table:表示加载到哪张表
  • student:表示具体的表
  • partition:表示上传到指定分区

利用insert:

hive (default)> insert overwrite table student_par
select id, name from student where month='201709';
  • insert into:以追加数据的方式插入到表或分区,原有数据不会删除
  • insert overwrite:会覆盖表中已存在的数据
  • 注意:insert 不支持插入部分字段

利用查询结果:

create table if not exists student3
as select id, name from student;

2、导出数据

hive(default)>insert overwrite local directory
'/opt/module/hive/data/export/student1'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
select * from student;
  • 没有local是将查询的结果导出到 HDFS 上

3、查询

Hive基本概念的更多相关文章

  1. hive学习1(hive基本概念)

    hive基本概念 hive简介 hive是什么 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能. 为什么使用hive 1)简单易上手.提 ...

  2. Hive从概念到安装使用总结

    一.Hive的基本概念 1.1 hive是什么? (1)Hive是建立在hadoop数据仓库基础之上的一个基础架构: (2)相当于hadoop之上的一个客户端,可以用来存储.查询和分析存储在hadoo ...

  3. 【Hive】概念、安装、数据类型、DDL、DML操作、查询操作、函数、压缩存储、分区分桶、实战Top-N、调优(fetch抓取)、执行计划

    一.概念 1.介绍 基于Hadoop的数据仓库工具,将结构化数据映射为一张表,可以通过类SQL方式查询 本质:将HQL转换成MapReduce程序 Hive中具有HQL对应的MapReduce模板 存 ...

  4. Hive基础概念、安装部署与基本使用

    1. Hive简介 1.1 什么是Hive Hives是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能. 1.2 为什么使用Hive ① 直接使用 ...

  5. [Hive_1] Hive 基本概念

    Hive 系列01 Hive 简介 & Hive 应用场景 & Hive 与 Hadoop 的关系 & Hive 与传统数据库对比 1. Hive 简介 [ 官方介绍 ] Ap ...

  6. 大数据开发实战:离线大数据处理的主要技术--Hive,概念,SQL,Hive数据库

    1.Hive出现背景 Hive是Facebook开发并贡献给Hadoop开源社区的.它是建立在Hadoop体系架构上的一层SQL抽象,使得数据相关人员使用他们最为熟悉的SQL语言就可以进行海量数据的处 ...

  7. Hive(一)【基本概念、安装】

    目录 一. Hive基本概念 1.1 Hive是什么 1.2 Hive的优缺点 1.3 Hive的架构 1.4 Hive和数据库的区别 二. Hive安装 2.1 安装地址 2.2 Mysql的安装 ...

  8. Hive Tutorial(上)(Hive 入门指导)

    用户指导 Hive 指导 Hive指导 概念 Hive是什么 Hive不是什么 获得和开始 数据单元 类型系统 内置操作符和方法 语言性能 用法和例子(在<下>里面) 概念 Hive是什么 ...

  9. 《OD学hive》第四周0717

    一.Hive基本概念.安装部署与初步使用 1. 后续课程 Hive 项目:hadoop hive sqoop flume hbase 电商离线数据分析 CDH Storm:分布式实时计算框架 Spar ...

  10. Hive详解

    1.   Hive基本概念 1.1  Hive简介 1.1.1 什么是Hive Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能. 1.1 ...

随机推荐

  1. avue入门

    <html> <head> <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.min. ...

  2. 笔记本电脑有WIFI,但不可上网

    有时候我们玩电脑时发现连上的WiFi在自己的电脑上不可用,但别人的却好好的,这要怎么办呢? 我们不妨试一试这个方法: 1 打开控制面板 2 点击网络和Internet,点击里面的Internet选项 ...

  3. LM算法详解

    1. 高斯牛顿法 残差函数f(x)为非线性函数,对其一阶泰勒近似有: 这里的J是残差函数f的雅可比矩阵,带入损失函数的: 令其一阶导等于0,得: 这就是论文里常看到的normal equation. ...

  4. 视觉十四讲:第七讲_2D-2D:对极几何估计姿态

    1.对极几何 从2张图片中,得到若干个配对好的2d特征点,就可以运用对极几何来恢复出两帧之间的运动. 设P的空间坐标为: \(P=[X,Y,Z]^{T}\) 两个像素点\(p_{1},p_{2}\)的 ...

  5. SpringMVC的常用注解、参数绑定、转发与重定向

    SpringMvc的常用注解 @RequestMapping() SpringMvc通过@RequestMapping注解将URL请求与业务的方法进行映射,在控制器的类定义处定义方法处都可以添加@Re ...

  6. 解决Linux上tomcat解析war包中文文件乱码

    解决Linux上tomcat解析war包中文文件乱码 第一步 编辑tomcat/conf server.xml vim /usr/local/src/tomcat/conf/server.xml us ...

  7. 关于vue keep-alive配合swiper的问题

    问题描述,首页优化使用keep-alive之后,从别的页面跳回来,swiper轮播不播放,查了好久资料,有的说要重新调用swiper的init方法进行初始化,等等,最终都没能解决问题,最终通过查看文档 ...

  8. 用 HTTP 协议下载资源(WinINet 实现)

    用 HTTP 协议下载资源(WinINet 实现) WinINet 使用 HTTP 协议下载资源的流程 相关函数 InternetCrackUrl 解析 URL BOOL InternetCrackU ...

  9. windows定时任务执行python爬虫

    有一些定时爬取的操作,适合用定时任务去执行.个人单独用的项目不适合放在工作所用的服务器上,也没必要单独买个服务器,我们windows电脑本身就有这项功能.接下来是一个windows定时任务执行pyth ...

  10. JZOJ 3448.公路维护

    \(\text{Problem}\) 1.询问区间最小值是否大于 \(0\) 2.区间加(可正可负) 3.区间取 \(\max\) 如果某个数经过操作后小于等于 \(0\),以后的操作就不会再影响这个 ...