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)添加环境变量

  1. #HIVE_HOME
  2. export HIVE_HOME=/opt/module/hive-3.1.2
  3. export PATH=$PATH:$HIVE_HOME/bin

2)解决日志 Jar 包冲突

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

3)初始化元数据库

  1. schematool -dbType derby -initSchema

4)启动 Hive

  1. hive

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

2、MySQL的安装

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

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

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

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

注意:按照顺序依次执行

3)初始化数据库

  1. sudo mysqld --initialize --user=mysql

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

  1. sudo cat /var/log/mysqld.log

5)启动 MySQL 服务

  1. sudo systemctl start mysqld

6)登录 MySQL 数据库

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

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

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

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

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

8)设置 MySQL 服务开机自启

  1. sudo systemctl enable mysqld

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

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

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

  1. <?xml version="1.0"?>
  2. <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
  3. <configuration>
  4. <!-- jdbc 连接的 URL -->
  5. <property>
  6. <name>javax.jdo.option.ConnectionURL</name>
  7. <value>jdbc:mysql://hadoop102:3306/metastore?useSSL=false</value>
  8. </property>
  9. <!-- jdbc 连接的 Driver-->
  10. <property>
  11. <name>javax.jdo.option.ConnectionDriverName</name>
  12. <value>com.mysql.jdbc.Driver</value>
  13. </property>
  14. <!-- jdbc 连接的 username-->
  15. <property>
  16. <name>javax.jdo.option.ConnectionUserName</name>
  17. <value>root</value>
  18. </property>
  19. <!-- jdbc 连接的 password -->
  20. <property>
  21. <name>javax.jdo.option.ConnectionPassword</name>
  22. <value>000000</value>
  23. </property>
  24. <!-- Hive 元数据存储版本的验证 -->
  25. <property>
  26. <name>hive.metastore.schema.verification</name>
  27. <value>false</value>
  28. </property>
  29. <!--关闭元数据存储授权-->
  30. <property>
  31. <name>hive.metastore.event.db.notification.api.auth</name>
  32. <value>false</value>
  33. </property>
  34. <!-- Hive 默认在 HDFS 的工作目录 -->
  35. <property>
  36. <name>hive.metastore.warehouse.dir</name>
  37. <value>/user/hive/warehouse</value>
  38. </property>
  39. </configuration>

2)登陆 MySQL

  1. mysql -uroot -p000000

3)新建 Hive 元数据库

  1. mysql> create database metastore;
  2. mysql> quit;

4)初始化 Hive 元数据库

  1. schematool -initSchema -dbType mysql - verbose

5)再次启动 Hive

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

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

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

2)启动 metastore

  1. hive --service metastore

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

3)启动hive

5、使用 JDBC 方式访问 Hive

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

  1. <!-- 指定 hiveserver2 连接的 host -->
  2. <property>
  3. <name>hive.server2.thrift.bind.host</name>
  4. <value>hadoop102</value>
  5. </property>
  6. <!-- 指定 hiveserver2 连接的端口号 -->
  7. <property>
  8. <name>hive.server2.thrift.port</name>
  9. <value>10000</value>
  10. </property>

2)启动 hiveserver2

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

  1. hive --service hiveserver2

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

若是beeline连接不上可参考:

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

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

4)看到如下界面

  1. Connecting to jdbc:hive2://hadoop102:10000
  2. Connected to: Apache Hive (version 3.1.2)
  3. Driver: Hive JDBC (version 3.1.2)
  4. Transaction isolation: TRANSACTION_REPEATABLE_READ
  5. Beeline version 3.1.2 by Apache Hive
  6. 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

  1. 修改/opt/module/hive-3.1.2/conf/hive-log4j2.properties.template 文件名称为hive-log4j2.properties
  2. 然后修改:
  3. hive.log.dir=/opt/module/hive-3.1.2/logs

7、后台运行

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

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

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

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

启动和关闭脚本:

  1. #!/bin/bash
  2. #检查进程是否运行正常,参数 1 为进程名,参数 2 为进程端口
  3. function check_process()
  4. {
  5. pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}')
  6. ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)
  7. echo $pid
  8. [[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1
  9. }
  10. function hive_start()
  11. {
  12. metapid=$(check_process HiveMetastore 9083)
  13. cmd="nohup hive --service metastore 2>&1 &"
  14. [ -z "$metapid" ] && eval $cmd || echo "Metastroe 服务已启动"
  15. server2pid=$(check_process HiveServer2 10000)
  16. cmd="nohup hiveserver2 2>&1 &"
  17. [ -z "$server2pid" ] && eval $cmd || echo "HiveServer2 服务已启动"
  18. }
  19. function hive_stop()
  20. {
  21. metapid=$(check_process HiveMetastore 9083)
  22. [ "$metapid" ] && kill $metapid || echo "Metastore 服务未启动"
  23. server2pid=$(check_process HiveServer2 10000)
  24. [ "$server2pid" ] && kill $server2pid || echo "HiveServer2 服务未启动"
  25. }
  26. case $1 in
  27. "start")
  28. hive_start
  29. ;;
  30. "stop")
  31. hive_stop
  32. ;;
  33. "restart")
  34. hive_stop
  35. sleep 2
  36. hive_start
  37. ;;
  38. "status")
  39. check_process HiveMetastore 9083 >/dev/null && echo "Metastore 服务运行正常" || echo "Metastore 服务运行异常"
  40. check_process HiveServer2 10000 >/dev/null && echo "HiveServer2 服务运行正常" || echo "HiveServer2 服务运行异常"
  41. ;;
  42. *)
  43. echo Invalid Args!
  44. echo 'Usage: '$(basename $0)' start|stop|restart|status'
  45. ;;
  46. 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

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

3、创建、删除表table

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

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

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

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

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

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

  • PARTITIONED BY 创建分区表

  • CLUSTERED BY 创建分桶表

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

  • ROW FORMAT

    1. DELIMITED [FIELDS TERMINATED BY char]字段之间
    2. [COLLECTION ITEMS TERMINATED BY char]集合元素之间
    3. [MAP KEYS TERMINATED BY char]MapKV之间
    4. [LINES TERMINATED BY char]行之间
    5. | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value,
    6. 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 允许用户复制现有的表结构,但是不复制数据。

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

Hive DML语法

1、加载数据

利用load:

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

利用insert:

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

利用查询结果:

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

2、导出数据

  1. hive(default)>insert overwrite local directory
  2. '/opt/module/hive/data/export/student1'
  3. ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
  4. 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. Node.js学习笔记-----day05 (使用MongonDB重写学生信息管理案例)

    认真学习,认真记录,每天都要有进步呀!!! 加油叭!!! 使用MongonDB重写学生信息管理案例 1. 显示首页 先在crud-demo目录下安装mongoose 改写student.js var ...

  2. Linux安装KingbaseES数据库 Unsupported major.minor version错误处理

    Linux系统安装V008R006C007B0012版本KingbaseES数据库报错:Unsupported major.minor version 52.0 系统版本: [root@vm-10-3 ...

  3. Emacs单文件配置

    编辑 ~/.emacs 输入以下内容 ;; 编码 (set-language-info "UTF-8" 'coding-priority '(utf-8 gb18030 gbk g ...

  4. 安卓逆向 crmak的动态调试

    1.java代码分析 检测是否输入密码,输入了就进行对比 由此,我们需要进入SO进行动态调试了 2.SO调试 过程太复杂,凌晨才搞出来,就直接给答案了,有文件检测和端口检测 还有调试检测,都需要干掉

  5. Solon v2.1.4 发布。支持 java、kotlin、groovy!

    本次发布,重点测试和验证了在 java.kotlin.groovy 三种 jvm 语言里,开箱即用的特性.并发布 Solon Initializr: https://solon.noear.org/s ...

  6. 手把手教你为基于Netty的IM生成自签名SSL/TLS证书

    1.引言 对于IM聊天应用来说,为了提升安全性,对聊天消息加密是常规操作. 众所周之,Netty是高性能的Java NIO网络通信框架,因而用Netty来写IM是再正常不过了.网上关于为Netty生成 ...

  7. pycharm+robotframework自动化指南

    习惯了用pycharm写代码,突然让我用ride写,着实不爽,这才有了这篇教程. 一. pycharm配置 1. pycharm安装依赖插件:IntelliBot#patch,安装完重启pycharm ...

  8. [NOI Online 2022 提高组] 如何正确地排序

    \(\text{Solution}\) 当 \(m=2\) 时,\(ans=2n\sum a_{i,j}\) 当 \(m=3\) 时 当然先套路地考虑某一行的贡献,记为第 \(x\) 行 则当取 \( ...

  9. JZOJ 2020.07.30【NOIP提高组】模拟

    总结 本场比赛很不负责对待 暴力都没怎么打 一个半小时后才开始打题 很悲剧的只有 \(23+11+36=70\) 分 \(T1\) 4300. 装饰大楼 题目 略 思路 很无聊的找规律题 考场弃疗 \ ...

  10. (原创)【B4A】一步一步入门05:控件、公有属性、水平锚定、垂直锚定(控件篇01)

    一.前言 前面的教程,已经完整讲述了用B4A开发安卓APP从新建项目到编译发布的完整流程.从本篇开始,我们将会从B4A的细节处着手,一步一步掌握B4A. 从本篇开始的子系列为"控件篇&quo ...