hive(数据仓库):用来做数据(海量数据处理)统计、分析
hive的功能解释
web日志集群每天产生大量的log日志会被采集到HDFS文件系统上,文件内容都是一条条的记录,每条记录中包含很多字段,hive可以像mysql那样建表存储数据,不同的是hive可以把文件中每条记录的内容与表中的字段进行映射,并且hive有自己的mapreduce程序,可以用来统计计算。对于日志中内容的统计、分析,只需要在终端输入sql语句,hive会进行解析并组装一个MR job 提交到yarn上计算给出结果。
使用hive的基础是,有Hadoop集群和MySQL服务。(MySQL数据库用来存储元数据,即hive创建表的定义信息)
hive安装
1.首先在Hadoop集群上的任一节点安装MySQL,设置远程登录MySQL参考
启动MySQL:
service mysqld start
登录MySQL:
sudo mysql -u root -p
2.在任一节点安装hive(2.0版本以上的底层运算引擎是spark,我安装的是1.2.2,底层运算引擎是mapreduce)
3.修改hive的配置文件:进入安装目录下的conf,vi hive-site.xml
<configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://hdp2:3306/hive?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> </property> </configuration>
参数说明:
参数1:hive与MySQL建立连接,只需更改MySQL安装的位置(hdp2),建立连接后会在MySQL中建一个hive库
参数2:连接驱动使用jdbc驱动
参数3、4:MySQL的用户名和密码
4.在hive安装目录下的lib中放入一个jdbc驱动包(mysql-connector-java.jar)
5.配置Hadoop_HOME和hive_HOME到系统环境变量中 :vi /etc/profile
生效:source /etc/profile
hive启动
启动hive之前先启动hdfs和yarn
hive 的三种启动方式
1.hive单机程序(shell交互界面)
启动hive
cd 安装目录/bin 命令: ./hive cd 安装目录 命令: bin/hive 在任何地方 hive (配置了path)
在hive中建库建表,hdfs上就会生成默认的表目录:/user/hive/warehouse/库名.db或表名
直接在hive中 create table 表名(字段)来创建表要求与之映射的文件中字段是用 ^A (crtl+v,crtl+A)字符来分割的,例(001^A小明^A18^A男)
小tip:
设置hive交互界面时正在使用的库显示和查询时结果显示字段名
vi .hiverc
set hive.cli.print.header=true; set hive.cli.print.current.db=true;
例:
2.hive作为服务器启动
a.选择一个节点作为hive服务器(安装hive、更改配置文件)
前台启动命令:
bin/hiveserver2
后台启动命令:
nohup bin/hiveserver2 1>/dev/null 2>&1 &
hive服务示意图:
服务开启后可查看到其监听的端口,命令:
netstat -nltp
补充:查看某个进程的命令
ps -ef |grep 进程名
b.启动一个hive客户端去连接服务端
启动客户端的两种方式
1.启动: bin/beeline 连接服务:!connect jdbc:hive2://hdp1(服务端所在位置):10000 用户名:root 密码:跳过 2.bin/beeline -u jdbc:hive2://hdp1:10000 -n root
退出客户端:
!quit
3.hive的脚本化运行
a.编辑文件vi etl.sh
#!/bin/bash hive -e "sql语句1" hive -e "sql语句2"
运行脚本:sh etl.sh
b.编辑文件 vi test.hql——文件内容直接是sql语句
运行脚本:hive -f test.hql
hive的基本操作
建库、建表(常规操作):
hive的基本操作
建库、建表(常规操作):
create table 表名(字段1,字段2,字段3...) row format delimited fields terminated by ','; --指定表数据中的字段分隔符为','
删表:drop table 表名;
hive表分为内部表和外部表
内部表:常规操作建表,表数据默认存储在hdfs上的/user/hive/warehouse/....下,删除内部表,hdfs上的目录也会被删,内部表的创建一般用来查询生成新表
外部表:关键字——external,与接采集到hdfs上的原始数据目录对接,删除外部表,hdfs上的数据目录还存在
create external table 表名(字段) location 'hdfs上的目录(采集目录)' -- location :关联目录 row format delimited fields terminated by ',';
分区表:
表目录里含有子目录,注:分区字段不能是表定义中的已存在字段
create table 表名(字段1,字段2,字段3...) partitioned by (某个新字段) --例 partitioned by (day string) row format delimited fields terminated by ',';
按照某个字段创建好表后,导入相应的数据(分别导入):
load data local inpath '/root/hivetest/pv.log.20201210(本地存放文件的路径)' into table 表名 partition (day='20201210'); --在hdfs上的表目录中有一个名为 day='20201210'的文件
将数据导入hive的表有三种方式:
方式1:上述方法
方式2:去掉local,换成文件真正存放的节点名
方式3:手动hdfs命令将文件放入表目录
创建表的其他方式
create table 表名1 like 表名2 --创建一个表结构相同的表 create table 表名1 as select 字段1,字段2... from 表名2 --查询出原始表中某些字段的数据作为一个新表