Hive开荒
Hive起源
Apache Hive
*,*的百科全书
Apache Hive是一个建立在Hadoop架构之上的数据仓库。它能够提供数据的精炼,查询和分析。Apache Hive起初由Facebook开发,目前也有其他公司使用和开发Apache Hive,例如Netflix等。亚马逊公司也开发了一个定制版本的Apache Hive,亚马逊网络服务包中的Amazon Elastic MapReduce包含了该定制版本。
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析
什么是Hive
- Facebook开发的解决海量结构化日志的数据统计
- 基于Hadoop的数据仓库工具 HQL转换成MapReduce程序
- 使用HQL作为查询接口
- 使用HDFS存储
- 使用MapReduce计算
- 将结构化的数据文件映射成一张表 提供类SQL查询功能
- 灵活拓展性好 :支持UDF 自定义存储格式
- 适合做离线数据处理
为什么使用Hive
- MapReduce开发的不便利性
- 数据分析 针对DBA SQL语句 对数据分析
- MapReduce编程成本高
Hive的优点 使用场景
- 操作接口类SQL 提供快速的开发能力
- 避免写MR
- 统一的元数据管理 可与impala/Spark等共享元数据
- 易拓展(HDFS+MR:可以拓展任意集群规模;支持自定义函数)
- 数据离线处理;日志分析,海量结构化数据离线分析
- Hive执行延迟比较大,因此Hive常用与数据分析、对实时性要求不高的场景
- Hive优势在于处理大数据 小数据没有优势,因为Hive执行延迟比较高
Hive和Hadoop的关系
Hive架构
用户接口Client
- CLi
- JDBC/ODBC
- WEBUI
元数据:Metestore
- 表名
- 表所属的数据库
- 表拥有者
- 列、分区、
- 表的数据所在目录
默认的元数据存储在derby数据库中
推荐使用MySQL存储Metastore
Hive配置安装
首先安装Hadoop
Hadoop分布式安装
Hive安装:
Hive安装配置
安装MySQL
解压tar文件 命令
tar -xvf mysql-5.7.19-1.el7.x86_64.rpm-bundle.tar
卸载冲突的PRM组件
rpm -qa | grep postifix
rpm -qa | grep mariadb
rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64
rpm -ev postfix-2.10.1-6.el7.x86_64
安装依赖
yum -y install perl
安装命令
rpm -ivh mysql-community-common-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.19-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.19-1.el7.x86_64.rpm
启动数据库
//查看mysql是否启动
service mysqld status
//启动MySQL
service mysqld start
//停止mysql
service mysqld stop
//重启mysql
service mysqld restart
查看临时密码
grep password /var/log/mysqld.log
修改密码
数据库的密码需要满足:
- 大小写字母
- 数字
- 特殊符号
mysql -uroot -p 密码
ALTER USER ‘root’ @ 'localhost' IDENTIFIED BY 'aaa@qq.com' ;
授权远程登录
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT
OPTION;
mysql>FLUSH PRIVILEGES;
基于Mysql
配置hive-site.xml
vi conf/hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>mysql</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.150.1:3306/hive_metadata?
createDatabaseIfNotExsit=true&characterEncoding=UTF-8&verifyServerCerti
ficate=false&useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>datanucleus.schema.autoCreateAll</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
</configuration>
上传数据库驱动到lib目录下
初始化schema
bin/schematool -initScherma -dbType mysql
以命令行形式运行hive
vi conf/hvie-site.xml
配置Hive UI客户端
配置链接权限
vi core-site.xml
<property>
<name>hadoop.proxyuser.<username>.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.<username>.hosts</name>
<value>*</value>
</property>
注意: username应与hadoop使⽤的⽤户名⼀致
取消⽤户权限验证(hdfs-site.xml)
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
Hive基本操作
显示数据库
show database;
使用某个数据库
use dafault;
创建简单表
create table users(uname string,age int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\T';
//ROW FORMAT DELIMITED FIELDS TERMINATED BY '\T' : 指定导入数据的分隔符
导入本地数据到表中
load data local inpath '/opt/datas/users.tst' into table users;
查询表结构
desc users;
简单查询
不使用MR执行操作
select * from users;
执行MR操作
select count(*) from users;
select uname form users;
查看完整的表信息
desc formatted users;
查看所有的内置函数
show function;
查看内置函数的使用方法
//查看upper使用方法
desc function extended upper;
显示查询结果中表头信息
在CLI中 执行
set hive.cli.print.header = true;
或者在hive-site周那个 修改配置属性
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
Hive常用交互命令
-e 不进入交互式命令,执行hql语句
bin/hive -e "hql"
-f 执行hql脚本
vi hive,sql
内容 :
select * from users;
执行脚本:
bin/hive -f /opt/datas/hive.sql
或者将执行结果保存在文件中
bin hive -f /opt/datas/hive.sql > /opt/datas/res.txt
Hive常用shell命令
快速执行HDFS文件系统指令
hive > dfs -ls /
Hive详解
数据库相关
创建数据库
CREATE (DATABASE | SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name = property_value,...)];
create databse if not exists sysoa
COMMENT 'OA数据库'
LOCATION '/users/skhive/hive/warehouse/sysoa.db' ;
删除DB
DROB (DATABASE | SCHEMA ) [IF EXISTS] database_name [RESTRICT | CASCADE] ;
若数据库下有表存在,则必须使用CASCADE;
表相关
创建表
create table if not exists myusers
(
uid string COMMENT '用户id',
uname string COMMENT '用户名'
)
COMMENT '用户表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' , '
STORED AS TEXTFILE;
导入数据
load data local inpath '/opt/datas/myusers.txt' into table myusers;
第二种方式
create table IF NOT EXISTS myisers2
as select uname myusers;
第三种方式
create table IF NOT EXISTS myusers3
like myusers;
Hive worldcount实例
创建表
hive> create table wordcount(line string);
加载数据
hive> load data inpath '/inputdata/counter.txt' overwirite into table wordcount;
查询文件数据
hive> select * from wordcount;
按照‘ ’分割
select split(line,' ')from wordcount;
大爆炸
select explod(split(line , ' ' ) from wordcount;
explode函数将KEY相同的value存在数组里。这HQL条语句相当于Hadoop中的Map函数。
使用聚合函数count进行统计
select word,count(word) as count from (select explode(split(line, ' ')) as word form wordcount)group by word;
现在来处理第二条HQL语句:SELECT word,count(1) FROM w GROUP BY word ORDER BY word;
这条语句相当于Hadoop中的reduce函数。聚合函数count
按照词频排列
select word,count(word) as count form (select explode(split(line,' ')) as word from wordcount) group by word order by word;
存储计算结果
create table word_counts as select word,count(word) as count from (select explode(split(line,' ')) as word form wordcount ) group by word order by word;
select * from word_counts;
sougou搜索结果统计
日志上传到hdfs 启动hive
create table sougou (qtime string ,qid string ,qword string ,url string) row format delimited fileds terminated by ',';
加载数据
load data inpath '/sougou.dic' into table sougou;
select count(*) form sougou;
create table sougou_results as select keyword,count(qword) as count from (select qword as keyword from sougou ) group by keyword order by count desc;