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. Selenium Webdriver驱动自管理

    Webdriver驱动自管理 背景 在selenium自动化中,驱动和浏览器有一定的对应关系,以最常见的chrome和firefox为例. chrome 要求比较严格. 比如在地址栏输入chrome: ...

  2. selenium注入js代码

    from selenium import webdriver from selenium.webdriver import ActionChains import time dr = webdrive ...

  3. Codeforces Round #849 (Div. 4)

    A. Codeforces Checking 题意 每个案例给一个字符,如果在 "codeforces" 中出现过,输出 YES,否则输出 NO code /** * @autho ...

  4. springcloud04 Ribbbon

    Ribbbon虽然现在已经进入维护模式了,但是使用的还是很多的. 1.官网 https://github.com/Netflix/ribbon/wiki/Getting-Started 2.Ribbo ...

  5. 微服务学习计划——SpringCloud

    微服务学习计划--SpringCloud 在学习并掌握了众多基础框架之后,我们的项目繁杂且难以掌握,那么我们就需要开启一门新的课程,也就是我们常说的微服务架构 随着互联网行业的发展,对服务的要求也越来 ...

  6. ubuntu卸载eigen

    1.sudo updatedb 2.locate eigen3 3.手动删除

  7. Cobalt Strike 之: Aggressor Script

    郑重声明: 本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关.倡导维护网络安全人人有责,共同维护网络文明和谐. Co ...

  8. .NET依赖注入之一个接口多个实现

    前言 最近又在项目中碰到需要将原本单实现的接口改造成多个实现的场景,这里记录一下常见的几种改法. 假设已经存在如下接口ICustomService和其实现CustomService,由于只有一种实现, ...

  9. 使用 FPM 将源码包转化为rpm包(技巧)

                    使用 FPM  将源码包转化为rpm包 1.支持的源类型包 dir: 将目录打包成所需要的类型,可以用于源码编译安装的软件包 rpm: 对rpm进行转换 gem: 对r ...

  10. Docker-Compose 管理镜像和容器(2)

    一.前言 上一文章中介绍了Docker部署ASP.NET Core 项目,如何构建镜像和运行容器,但是每次代码更新还需要重复的工作,本文介绍Docker-Compose一个指令重新构建镜像和运行容器. ...