什么是Hive
1. Hive是apache组织提供的一个基于Hadoop的数据仓库产品
数据库 DataBase OLTP
数据量级小
数据价值高
数据仓库 DataWarehouse OLAP
数据量级大
数据价值低
2. Hive基于Hadoop
底层数据存储 HDFS
运算方式 MR
原有MapReduce处理相关操作时,存在的问题|
mapreduce处理相关操作时,繁琐
mapReduce的作用:没有统计,没有分组合并,只做数据清洗,是可以没有reduce
Hive核心设计思想
- metastore (rdb) 文件 — 数据库 相关概念的对应关系 (映射 Mapping)
- SQL —> 复杂的过程( 语法检查 语义检查 生成语法树 优化sql的执行顺序 )----> MapReduce
- 类SQL ( HQL Hive Query Language
HQL Hibernate Query Language )
hive安装
1. hadoop安装完成
2. 解压缩hive.tar 到 /opt/install
3. 修改hive_home/conf/hive-env.sh
# Set HADOOP_HOME to point to a specific hadoop install directory
HADOOP_HOME=/usr/hadoop-2.6.0
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/opt/install/apache-hive-0.13.1-bin/conf
4. 在hdfs 创建 /tmp
/user/hive/warehouse
5. bin/hive
jps --- runjar进程
hive基本使用
1. 查看hive中的所有数据库
show databases
2. 创建用户自己的库
create database baizhi_158;
create database if not exists baizhi_158;
3. 使用用户自定义的数据库
use db_name
use baizhi_158;
# 所谓hive中的数据库,本质就是hdfs上的一级目录 默认: /user/hive/warehouse/${db_name}.db
4. 建表语句
create table if not exists t_user(
id int,
name string
)row format delimited fields terminated by '\t';
5. 查看当前数据库中所有的表
show tables
# 所谓hive中的表,本质就是hdfs上的一级目录 默认: /user/hive/warehouse/${db_name}.db/${table_name}
/user/hive/warehouse/baizhi_158.db/t_user
6. hive中导入数据命令
load data local inpath '' into table table_name;
load data local inpath '/root/data/data1' into table t_user;
# 所谓hive导入数据,本质就是hdfs中目录的数据文件
# 细节:
1. hive中的数据导入,本质上就是hdfs文件上传,删除表中的数据,本质上就是hdfs中文件的删除
hive load data local inpath '/root/hive/data/data1' into table t_user;
hdfs bin/hdfs dfs -put /root/hive/data/data1 /user/hive/warehouse/baizhi_158.db/t_user
2. hive命令的数据导入,如果出现文件名相同的情况下,自动改名
3. hive中表的数据,只的是这个目录下,所有文件数据之和
4. hive 执行sql
select * 的操作 不启动mr
select column 启动mr
hive的metastore默认使用的derby数据库,进行映射存储
问题:derby作为metastore使用,只能让客户开启一个client进行访问
安装MySQL
1. wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
2. yum -y install mysql57-community-release-el7-10.noarch.rpm
3. yum -y install mysql-community-server
4. systemctl start mysqld.service
5. mysql管理员密码
5.1 grep "password" /var/log/mysqld.log 查看临时密码
A temporary password is generated for root@localhost: ium+hhgLH7Xv
5.2 mysql -uroot -pium+hhgLH7Xv
5.3 修改密码
set global validate_password_policy=0;
set global validate_password_length=1;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
5.4 systemctl restart mysqld.service
5.5 mysql -uroot -p123456
6. 打开mysql远端访问权限
6.1 set global validate_password_policy=0;
6.2 set global validate_password_length=1;
6.3 GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "123456";
6.4 flush privileges;
6.5 systemctl stop firewalld
hive相关的设置
hive_home/conf/hive-site.xml
javax.jdo.option.ConnectionURL
jdbc:mysql://localhost:3306/hive_mysql?createDatabaseIfNotExist=true&useSSL=false
JDBC connect string fora JDBC metastore
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
Driver class name for aJDBC metastore
javax.jdo.option.ConnectionUserName
yourname
username to use againstmetastore database
javax.jdo.option.ConnectionPassword
yourpass
password to use againstmetastore database
1. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
2. 下载 centos7文件 并且上传 /etc/yum.repos.d/
3. yum clean all
4. yum makecache
1. hive终端基本的形式
bin/hive
2. 启动hive的同时,设置hive的相关参数
bin/hive --hiveconf hive.cli.print.current.db true
3. 启动hive的同时,指定数据库
bin/hive --database db_name
4. 启动hive的同时,运行sql语句
bin/hive --database baizhi_158 -e 'select * from t_user'
bin/hive --database baizhi_158 -e 'select * from t_user' > /root/hive_file
bin/hive --database baizhi_158 -e 'select * from t_user' >> /root/hive_file
5. 启动hive的同时,运行sql文件中的sql语句
bin/hive --database baizhi_158 -f /root/hive_sql
数据库相关
1. 创建数据库
create database if not exists db_name; // /user/hive/warehouse/db_name.db
create database if not exists db_name location '/suns' //
2. 显示所有数据库
show databases;
3. 使用数据库
use db_name
4. 删除数据库
drop database baizhi_suns; //删除空数据库
drop database baizhi_suns cascade //删除非空库
表的相关操作
管理表建表
0. 查看表的结构
1. 查看基本结构
desc table_name;
desc t_user;
describe t_user;
2. 查看表的扩展信息
desc extended table_name;
desc extended t_user;
3. 格式化查看表的扩展信息
desc formatted table_name;
desc formatted t_user;
1. 基本建表语句
create table if not exists table_name(
id int,
name string
)row format delimited fields terminated by 't\';
2. 指定表的存储位置
create table if not exists table_name(
id int,
name string
)row format delimited fields terminated by 't\' locaiton 'hdfs_path';
3. as 关键字建表 (洗数据)
create table if not exists table_name as select id,name from t_user;
4. like 关键字建表
create table if not exists table_name like t_user;
外部表
1. 基本建表语句
create external table if not exists table_name(
id int,
name string
)row format delimited fields terminated by 't\';
2. 指定表的存储位置
create external table if not exists table_name(
id int,
name string
)row format delimited fields terminated by 't\' locaiton 'hdfs_path';
3. as 关键字建表 (洗数据)
create external table if not exists table_name as select id,name from t_user;
4. like 关键字建表
create external table if not exists table_name like t_user;
管理表与外部表的区别
1. 管理表删除后,在hive中表将被删除,同时hdfs上目录也会被删除
2. 外部表删除后,在hive中表将被删除,同时hdfs上目录不会被删除 (删除metastore中的信息)
> 分区表一般是用于对hive查询进行优化使用,为了提高查询效率
>
> 1. 分区 必须有一个统一的父级目录,日后便于做全表的统一处理
> 2. 分区的子目录和数据本身之间没有必然联系,只是区分数据 (静态分区)
~~~markdown
create table t_user_part(
id int,
name string)
partitioned by (data string) row format delimited fields terminated by '\t';
load data local inpath '/root/hive/data/data1' into table t_user_part partition (data='17');
load data local inpath '/root/hive/data/data1' into table t_user_part partition (data='18');
select * from t_user_part;
select * from t_user_part where data='17'
~~~
桶表(了解)
临时表(了解)
1. 本地数据的导入(linux) 【重点】
load data local inpath '' into table table_name
2. hdfs中导入数据
load data inpath '' into table table_name
本质:目录中的数据移动
3. hdfs相关shell完成文件导入
bin/hdfs dfs -put 'local_path' '/user/hive/warehouse/db_name.db/table_name'
4. as关键字 【重点】
创建表的同时,通过查询导入数据
create table t_xxx as select id,name from t_yyy;
5. insert关键字 【重点】
表已经存在,通过查询导入数据
insert into table xxxx select id,name from t_user;
1. insert导出 【重点】
导出的数据 mr 自动生成
insert overwrite local directory '/root/xiaohei' select name from t_user;
2. hdfs的shell 【了解】
bin/hdfs dfs -get 'user/hive/warehouse/db_name.db/table' '/root/xxx'
3. hive启动的命令行参数 【了解】
bin/hive --database 'baizhi129' -f /root/hive.sql > /root/result
4. sqoop方式 【重点】
5. Hive导入 导出命令【了解】
1. export 导出
export table tb_name to 'hdfs_path'
2. import 导入
import table tb_name from 'hdfs_path'
1. 基本查询
select * from t_user; 不启动mr
select id from t_user; 启动mr
2. where
select * from t_user where id = xxx;
3. 常见谓词 in between and
4. 逻辑运算 and or not
5. 分组函数 count() avg() sum() max() min()
6. 分组 group by
7. 排序 order by
8. 分页 limit
不支持 limit 2,3
9. 多表联合查询
select e.id,e.name,d.dname
from t_emp e
inner join t_dept d
on e.dept_id = d.id;
10. 内置函数(窗口函数)
select length(name) from t_user_like;
select length('suns')
to_date
year
select substring('suns',1,2)
11. hive不支持子查询
1. mapreduce中map个数?
textInputFormat --- > block ----> split ----> map
dbInputFormat ----> 1 row ----> 1 split ----> 1 map
2. mapreduce中reduce个数?
默认 1 个
mapred-default.xml
mapreduce.job.reduces
1
job中应用过程中reduce 0---n
job.setReduceNumTasks()
3.Hive中MapReduce相关参数的设置
hive-site.xml
hive.exec.reducers.bytes.per.reducer
1000000000
hive.exec.reducers.max
999
hive-site.xml
hive.fetch.task.conversion
minimal
1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only 不启动MR,非上述3种情况,会启动MR
2. more : SELECT, FILTER, LIMIT only (TABLESAMPLE, virtual columns) 所有select,where,limit 都不起MR
总结:hive是一种离线处理的大数据技术,不需要实时产生处理结果,所以在hive中所做的相关操作,最终通过Sqoop导入RDB,通过Java程序直接访问RDB获得相应的结果。
Hadoop 各种发行版本
1. apache开源版 : 免费 难用
2. Cloudera (CDH) Doug Cutting首席架构师 $4000 1个
3. Hortonworks $12000 10个
搭建CDH版Hadoop及其Hive
1. 解压缩hadoop
2. 创建临时目录的位置
hadoop_home/data/tmp
3. 修改配置文件 hadoop_home/etc/hadoop
hadoop-env.sh
yarn-env.sh
mapred-env.sh
core-site.xml
fs.defaultFS
hdfs://hive1:8020
hadoop.tmp.dir
/opt/install/hadoop-2.5.0-cdh5.3.6/data/tmp
hdfs-site.xml
dfs.replication
1
dfs.permissions.enabled
false
mapred-site.xml
mapreduce.framework.name
yarn
yarn-site.xml
yarn.nodemanager.aux-services
mapreduce_shuffle
slaves
hive1
4. 替换cdh lib/native本地库
5. 格式化namenode
6. 启动服务进程
7. 安装hive并解压缩
8. 修改配置文件
hive-env.sh
hive-site.xml
9. 上传mysql驱动 hive_home/lib
10. hdfs /tmp
/user/hive/warehouse
安装Sqoop
1. 解压缩Sqoop
2. 修改配置 sqoop_home/conf
修改conf/sqoop-env.sh
export HADOOP_COMMON_HOME=/opt/install/hadoop-2.5.0-cdh5.3.6
export HADOOP_MAPRED_HOME=/opt/install/hadoop-2.5.0-cdh5.3.6
export HIVE_HOME=/opt/install/hive-0.13.1-cdh5.3.6
3. mysql-connect.jar copy sqoop_home/lib
4. 测试sqoop是否正常使用
bin/sqoop list-databases -connect jdbc:mysql://hive1:3306 -username root -password 123456
sqoop命令的书写规范
1. 一行写
bin/sqoop list-databases -connect jdbc:mysql://hive1:3306 -username root -password 123456
2. 每一个关键字一行
bin/sqoop list-databases \
--connect \
jdbc:mysql://hive1:3306 \
--username root \
--password 123456
mysql的准备工作
#mysql 创建数据库 创建表
create database sqoop
create table mysql_user(
id int primary key,
name varchar(12)
);
insert into mysql_user values (1,'suns1');
insert into mysql_user values (2,'suns2');
insert into mysql_user values (3,'suns3');
insert into mysql_user values (4,'suns4');
insert into mysql_user values (5,'suns5');
insert into mysql_user values (6,'suns6');
insert into mysql_user values (7,'suns7');
insert into mysql_user values (8,'suns8');
Sqoop的Import(导入)
bin/sqoop import \
--connect \
jdbc:mysql://hive1:3306/sqoop \
--username root \
--password 123456 \
--table mysql_user
# Sqoop 进行的数据导入和导出,本质上也是运行的MapReduce
# 如果不指定hdfs的导入路径,那么sqoop生成默认值 /user/root/${table_name}
# mapReduce的目标是数据库,所以Map的数量,由数据库的行数决定
# 导出文件的列分割符,是,
# 指定sqoop导入位置
bin/sqoop import \
--connect \
jdbc:mysql://hive1:3306/sqoop \
--username root \
--password 123456 \
--table mysql_user \
--target-dir /sqoop
# 删除已存在的目标目录
bin/sqoop import \
--connect \
jdbc:mysql://hive1:3306/sqoop \
--username root \
--password 123456 \
--table mysql_user \
--target-dir /sqoop \
--delete-target-dir
# 设置map的个数
bin/sqoop import \
--connect \
jdbc:mysql://hive1:3306/sqoop \
--username root \
--password 123456 \
--table mysql_user \
--target-dir /sqoop \
--delete-target-dir \
--num-mappers 1
# 设置列分隔符
bin/sqoop import \
--connect \
jdbc:mysql://hive1:3306/sqoop \
--username root \
--password 123456 \
--table mysql_user \
--target-dir /sqoop \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by '\t'
# 快速导入
使用mysql 导出工具 dump
bin/sqoop import \
--connect \
jdbc:mysql://hive1:3306/sqoop \
--username root \
--password 123456 \
--table mysql_user \
--target-dir /sqoop \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by '\t' \
--direct
#细节: sqoop 需要和 mysql 安装在同一个节点
如果没有安装在同一个节点,需要把mysql/bin下的内容 复制到sqoop机器
# 增量导入
--check-column Source column to check for incremental id
--last-value Last imported value in the incremental 5
--incremental Define an incremental import of type append
'append' or 'lastmodified'
--delete-target-dir \ 不需要加
bin/sqoop import \
--connect \
jdbc:mysql://hive1:3306/sqoop \
--username root \
--password 123456 \
--table mysql_user \
--target-dir /sqoop \
--num-mappers 1 \
--fields-terminated-by '\t' \
--direct \
--check-column id \
--last-value 5 \
--incremental append
# hive表的导入
#--hive-import \
#--hive-database baizhi125 \
#--hive-table t_user \
bin/sqoop import \
--connect \
jdbc:mysql://hive1:3306/sqoop \
--username root \
--password 123456 \
--table mysql_user \
--delete-target-dir \
--hive-import \
--hive-database baizhi129 \
--hive-table t_user \
--num-mappers 1 \
--fields-terminated-by '\t'
Sqoop的Export (HDFS/Hive ----> MySQL )
bin/sqoop export \
--connect \
jdbc:mysql://hive1:3306/sqoop \
--username root \
--password 123456 \
--table to_mysql \
--export-dir /sqoop \
--num-mappers 1 \
--input-fields-terminated-by '\t'
Sqoop脚本化编程
sqoop文件
create table filetomysql(
id int,
name varchar(12)
);
1. 创建一个Sqoop文件 普通文件 sqoop.file
export
--connect
jdbc:mysql://hive1:3306/sqoop
--username
root
--password
123456
--table
filetomysql
--export-dir
/sqoop
--num-mappers
1
--input-fields-terminated-by
'\t'
2. 执行文件
bin/sqoop --options-file /root/sqoop.file
job作业
1. 创建作业
bin/sqoop job \
--create test_job1 \
-- \
export \
--connect \
jdbc:mysql://hive1:3306/sqoop \
--username root \
--password 123456 \
--table filetomysql \
--export-dir /sqoop \
--num-mappers 1 \
--input-fields-terminated-by '\t'
2. 执行job作业
bin/sqoop job --exec test_job1(job_id)
3. 解决job作业执行过程中的密码输入问题
echo -n "123456" >> /root/password
bin/sqoop job \
--create test_job2 \
-- \
export \
--connect \
jdbc:mysql://hive1:3306/sqoop \
--username root \
--password-file file:///root/password \
--table filetomysql \
--export-dir /sqoop \
--num-mappers 1 \
--input-fields-terminated-by '\t'
bin/sqoop job -exec test_job2
思考Sqoop实战,主要的应用方式
1. 安装crontab (centos7 默认安装)
yum -y install vixie-cron
yum -y install crontabs
2. 启动服务
systemctl start crond.service
systemctl stop crond.service
systemctl restart crond.service
/sbin/service crond start
/sbin/service crond stop
3. 编辑定时计划
crontab -e
minute hour day month week command
*/5 * * * * command
··
*/1 * * * * /opt/install/sqoop-1.4.5-cdh5.3.6/test_job2.sh
0 0 * * * /opt/install/sqoop-1.4.5-cdh5.3.6/test_job2.sh
【https://www.cnblogs.com/tiandi/p/7147031.html】
mappers 1
–input-fields-terminated-by ‘\t’
bin/sqoop job -exec test_job2
~~~
思考Sqoop实战,主要的应用方式
1. 安装crontab (centos7 默认安装)
yum -y install vixie-cron
yum -y install crontabs
2. 启动服务
systemctl start crond.service
systemctl stop crond.service
systemctl restart crond.service
/sbin/service crond start
/sbin/service crond stop
3. 编辑定时计划
crontab -e
minute hour day month week command
*/5 * * * * command
··
*/1 * * * * /opt/install/sqoop-1.4.5-cdh5.3.6/test_job2.sh
0 0 * * * /opt/install/sqoop-1.4.5-cdh5.3.6/test_job2.sh
【https://www.cnblogs.com/tiandi/p/7147031.html】