什么是Hive
-
基于Hadoop 数据保存到HDFS
-
数据仓库工具(量比较大,访问不大,但保存历史版本,与mysql不同不是高并发)
-
结构化的数据 映射为一张数据库表
01,张三,89
02,李四,91
03,赵武,92
-
HQL查询功能 (Hive SQL)
-
本质 把HQL翻译成MapReduce 降低使用hadoop计算的门槛
-
主要用来做离线数据分析,开发效率比直接用MapReduce 高 但是速度还是比较慢
Hive架构
- 用户接口:shell命令行 即 CIL
- Hive将元数据存储在数据库中 (hive 和 hdfs 的映射)
- 数据库 表 都保存到哪些位置上(hdfs中的哪里)
- 表中的字段名字 类型
- mysql derby(自带)
- Drive
- 负责把HQL翻译成mapreduce
- 或者翻译成 shell 命令
Hive和Hadoop关系
- 利用hdfs存数据 利用mapreduce算
- Hive只需要跟 Master节点打交道 不需要集群
Hive和关系型数据库区别
Hive | 关系型数据库 | |
---|---|---|
ANSI SQL | 不完全支持 | 支持 |
更新 | INSERT OVERWRITE\INTO TABLE(默认) | UPDATE\INSERT\DELETE |
事务 | 不支持(默认) | 支持 |
模式 | 读模式 | 写模式 |
查询语言 | HQL | SQL |
数据存储 | HDFS | Raw Device or Local FS |
执行 | MapReduce | Executor |
执行延迟 | 高 | 低 |
子查询 | 只能用在From子句中 | 完全支持 |
处理数据规模 | 大 | 小 |
可扩展性 | 高 | 低 |
索引 | 0.8版本后加入位图索引 | 有复杂的索引 |
- hive 离线计算 海量查询
- hive最主要做查询 不涉及删除修改
- 默认不支持删除修改,默认不支持事务,并不完全支持标准sql
- sql 增删改查(CRUD)全部支持, 支撑在线业务,索引完整 支持事务
Hive 基本使用
-
创建数据库
- create database test;
-
创建表
-
create table student(classNo string, stuNo string, score int) row format delimited fields terminated by ‘,’;
-
字段不需要指定占多少字节
-
需要通过row format delimited fileds terminated by ‘,’ 指定列的分隔符
-
-
加载表数据的时候尽量使用 load data方式 把整个文件put上去
- load data local inpath '/home/hadoop/tmp/student.txt’overwrite into table student;
-
查看表的具体信息
- desc formatted students;
-
内部表和外部表
- 内部表 managed table
- 创建表的时候
- CREATE TABLE 表名(字段名 字段类型,)row format delimited fields terminated by ‘,’
- 删除表
- 元数据和数据一起删除
- 数据位置
- 默认是/user/hive/warehouse
- 创建表的时候
- 外部表 external table
- 建表语句
- CREATE External TABLE 表名(字段名 字段类型,)row format delimited fields terminated by ‘,’ location ‘数据在hdfs上的路径’;
- 删除表
- 只删除元数据 数据会保留
- 数据可以在hdfs上的任意位置
- 外部分区表即使有分区的目录结构, 也必须要通过hql添加分区, 才能看到相应的数据
- 建表语句
- 内部表 managed table
-
分区表
-
当数据量比较大的时候,使用分区表可以缩小查询的数据范围
-
分区表实际上就是在表的目录下创建的子目录
-
如果有分区表的话查询的时候,尽量要使用分区字段
-
查看分区
- show partitions 表名
-
创建分区表的语句
- create table 表名 (字段名,字段类型…) partitioned by (分区字段名 分区字段类型) row format delimited fields terminated by ‘,’ lines terminated by ‘\n’ stored as textfile;
-
向分区表中插入数据
- load data local inpath ‘/home/hadoop/tmp/employee.txt’ into table 表名 partition(分区字段名字=‘分区的具体值’);
-
添加分区
- alter table 表名 add if not exists partition(分区字段名字=‘分区的具体值’);
-
动态分区
-
插入数据的时候指定分区的字段,会自动帮助创建分区所对应的文件夹
-
需要关掉默认设置
- set hive.exec.dynamic.partition.mode=nonstrict;
-
-
sqoop 数据导入
-
作用 数据交换工具 可以实现 数据在mysql oracle<==> hdfs之间互相传递
-
原理 通过写sqoop 命令 把sqoop命令翻译成mapreduce 通过mapreduce连接各种数据源 实现数据的传递
-
通过sqoop 把数据从mysql导入到hdfs
-
sqoop import --connect jdbc:mysql://mysql数据库地址:3306/数据库名字 --username root --password password --table 要导出数据的表名 -m mrjob的数量(2:有两个文件)
-
默认会把文件导入到 hdfs上 /user/linux用户名 文件夹下
-
通过 --target-dir指定其它位置
-
Hive安装
-
Hive 安装前需要安装好 JDK 和 Hadoop。配置好环境变量。
-
下载Hive的安装包 http://archive.cloudera.com/cdh5/cdh/5/ 并解压
tar -zxvf hive-1.1.0-cdh5.7.0.tar.gz -C ~/app/
-
进入到 解压后的hive目录 找到 conf目录, 修改配置文件
cp hive-env.sh.template hive-env.sh vi hive-env.sh
在hive-env.sh中指定hadoop的路径
HADOOP_HOME=/home/hadoop/app/hadoop-2.6.0-cdh5.7.0
-
配置环境变量
-
vi ~/.bash_profile
-
export HIVE_HOME=/home/hadoop/app/hive-1.1.0-cdh5.7.0 export PATH=$HIVE_HOME/bin:$PATH
-
source ~/.bash_profile
-
-
根据元数据存储的介质不同,分为下面两个版本,其中 derby 属于内嵌模式。实际生产环境中则使用 mysql 来进行元数据的存储。
-
内置 derby 版:
bin/hive 启动即可使用
缺点:不同路径启动 hive,每一个 hive 拥有一套自己的元数据,无法共享 -
mysql 版:
-
上传 mysql驱动到 hive安装目录的lib目录下
mysql-connector-java-5.*.jar
-
vi conf/hive-site.xml 配置 Mysql 元数据库信息(MySql安装见文档)
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- 插入以下代码 --> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value><!-- 指定mysql用户名 --> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>hive</value><!-- 指定mysql密码 --> </property> <property> <name>javax.jdo.option.ConnectionURL</name>mysql <value>jdbc:mysql://127.0.0.1:3306/hive</value> </property><!-- 指定mysql数据库地址 --> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value><!-- 指定mysql驱动 --> </property> <!-- 到此结束代码 --> <property> <name>hive.exec.script.wrapper</name> <value/> <description/> </property> </configuration>
-
-
UDF自定义函数
-
hive提供的函数不能满足需求的时候就可以使用自定函数
-
UDF:就是做一个mapper,对每一条输入数据,映射为一条输出数据。
-
UDAF:就是一个reducer,把一组输入数据映射为一条(或多条)输出数据
-
使用别人已经编译好的.jar
- 在hdfs中创建 /user/hive/lib目录
- 把 hive目录下 lib/hive-contrib-hive-contrib-1.1.0-cdh5.7.0.jar 放到hdfs中
- 把集群中jar包的位置添加到hive中
- 在hive中创建临时UDF
- 在之前的案例中使用临时自定义函数(函数功能: 添加自增长的行号)
hadoop fs -mkdir /user/hive/lib
hadoop fs -put hive-contrib-1.1.0-cdh5.7.0.jar /user/hive/lib/
hive> add jar hdfs:///user/hive/lib/hive-contrib-1.1.0-cdh5.7.0.jar;
hive> CREATE TEMPORARY FUNCTION row_sequence as 'org.apache.hadoop.hive.contrib.udf.UDFRowSequence'
Select row_sequence(),* from employee
- 自己写python脚本实现udf、udaf
- 通过hdfs向hive中ADD file
- 加载文件到hdfs
- hive从hdfs中加载python脚本
- Transform
hadoop fs -put udf.py /user/hive/lib/
ADD FILE hdfs:///user/hive/lib/udf.py;
SELECT TRANSFORM(fname, lname) USING 'python udf1.py' AS (fname, l_name) FROM u;
Hive综合案例
详见https://blog.csdn.net/qq_30031221/article/details/109156276