一、hive 的历史价值
1)hive是hadoop上的killApplication,hive是hadoop上的数据仓库,hive同时兼具有数据仓库中的存储引擎和查询引擎的作用,而sparksql是一个更加出色和高级的查询引擎。所以在现在企业级应用中,sparksql+hive成为了业界使用大数据最为高效和流行的趋势。
2)hive是facebook推出的。只要是为了不懂java代码编码的人员也能通过sql来驾驭hadoop集群进行分布式数据的多维度分析,甚至可以通过web界面来直接操作hive(通过hive来驾驭hadoop),这对于市场营销人员,系统管理员,数据分析至关重要。
3)hive 的核心把hive 自己的sql语言即hql语言翻译为mapreduce代码,然后交给hadoop集群执行,也就是说hive本身是一个单机版的软件!!!
4)由于是通过写hql来完成业务需求的,所以相对于编写mapreduce而已非常的方便简易和灵活,能够非常轻易的满足业务的需求和多变的场景。
5)Hive几乎存在一切使用大数据的公司中!
二、Hive的本质到是什么?
1)Hive是分布式数据仓库,同时又是查询引擎,所以Spark SQL取代只是Hive查询引擎,在企业实际生产环境下Hive + Spark SQL是目前最为经典的数据分析组合;
2)Hive本身就是一个简单单机版本的软件,主要负责:
a)把HQL翻译成Mapper(s)-Reducer-Mapper(s)的代码; 并且可能产生很多MapReduce的Job;
b)把生产的MapReduce代码及相关资源打包成为Jar并发布到Hadoop集群中且进行运行(这一切都是自动的)。
三、hive 的架构设计
1)Hive的架构图
2)Hive中的数据只是元数据,所谓元数据就是hive要操作数据的描述信息,该metastore默认存储在derby中,但是derby不能被生成环境下的多用户去使用,所以生产环境下一般最常用的是mysql来存储hive 的元数据。
3)Hive要操作的数据是由hive 的配置文件决定的。在生产环境下该数据位于hdfs 上(其实也就是hdfs上的普通文件而已,只不过是按照hive的方式组织一下)。
4)从hive的角度来看,数据就是一张张的table,我们的操作就是基于sql来多维度的查询table。
5)人们一直努力用hive来取代传统的数据仓库,但是以失败告终。因为hive太慢啦!!!所以业界目前趋势上黄金组合是hive(数据仓库的存储引擎)+sparksql(分析查询引擎)。
6)Hql会被hive解释,优化并生成查询计划,一般情况下查询计划会被转化为mapreduce任务。
7)但是形如select * from table不会转化成为mapreduce 任务。
8)Hive 有索引吗? 没有!!!
四、Hive的安装实战
Hive只在一个节点上安装即可
1)上传tar包
2)解压
- [root@yarn tools]# mkdir -p /usr/local/hive
- [root@yarn tools]# tar -zxf apache-hive-1.2.1-bin.tar.gz -C/usr/local/hive/
- [root@yarn tools]# cd /usr/local/hive/
3)更名
- [root@yarn hive]# # mv apache-hive-1.2.1-bin apache-hive-1.2.1
4)配置mysql 5.6
1)
- rpm-qa | grep mysql
2)卸载
- [root@yarnhive]# rpm -e apr-util-mysql-1.3.9-3.el6_0.1.x86_64--nodeps // --nodep 强制卸载
- [root@yarn hive]# rpm -e mysql-libs-5.1.71-1.el6.x86_64 –nodeps
3)安装mysql
- [root@yarn hive]# yum install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm -y
- [root@yarn hive]#yum install mysql mysql-devel mysql-servermysql-utilities
4)启动mysql
- [root@yarn hive]#/etc/init.d/mysqldstart
- [root@yarn hive]# mysql -uroot -p //默认密码是空 回车就可以进去
5)修改mysql的密码(注意:删除匿名用户,允许用户远程连接)
- [root@yarn hive]# /usr/bin/mysql_secure_installation
点击回车
设置新密码
6)登录mysql 用自己设置的新密码
- mysql –uroot -p
7)查看数据库
- Show databases;
8)修改mysql的用户登录权限,允许远程连接
- mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'citicbank' WITH GRANTOPTION;
- mysql> FLUSH PRIVILEGES;
- mysql> select user,host frommysql.user;
9)用Navicat for MySQL 测试下远程连接
五、配置Hive
1)修改 hive-site.xml
- mv hive-default.xml.template hive-site.xml
修改hive-site.xml(删除所有内容,只留一个<property></property>)
添加如下内容:
- <property>
- <name>javax.jdo.option.ConnectionURL</name>
- <value>jdbc:mysql://10.0.0.158:3306/hive?createDatabaseIfNotExist=true</value> //也可以用主机名
- <description>JDBC connect string for a JDBC metastore</description>
- </property>
- <property>
- <name>javax.jdo.option.ConnectionDriverName</name>
- <value>com.mysql.jdbc.Driver</value>
- <description>Driver class name for a JDBC metastore</description>
- </property>
- <property>
- <name>javax.jdo.option.ConnectionUserName</name>
- <value>root</value>
- <description>username to use against metastore database</description>
- </property>
- <property>
- <name>javax.jdo.option.ConnectionPassword</name>
- <value>citicbank</value> // 用户授权密码
- <description>password to use against metastore database</description>
- </property>
2)修改hive-env.sh
- [root@yarn hive]# mv hive-env.sh.template hive-env.sh
- [root@yarn conf]# vim hive-env.sh
在最后一行添加以下内容
- export HIVE_HOME=/usr/local/hive/apache-hive-1.2.1/
- export HIVE_CONF_DIR=/usr/local/hive/apache-hive-1.2.1/conf
3)修改hive-config.sh
- [root@yarn conf]# vim ../bin/hive-config.sh
在最后一行添加以下内容
- export HADOOP_HOME=/usr/local/hadoop/hadoop-2.6.0-cdh5.5.1/
- export SPARK_HOME=/usr/local/spark/spark-1.6.0-bin-hadoop2.6/
- exportJAVA_HOME=/usr/local/jdk1.8.0_60/
4)下载驱动包(mysql-connector-java-5.1.35.tar.gz) 放入usr/local/hive/apache-hive-1.2.1/lib/
六、启动hive
1)先启动hadoop的hdfs 和yarn,mysql在启动hive。启动成功如下图所示
2)创建表
Hive的表有两种基本类型:一种内部表(这种表数据属于Hive本身,言外之意是如果原来的数据在HDFS的其它地方,此时数据会通过HDFS移动到Hive数据仓库所在的目录,如果删除Hive中的该表的话数据和元数据均会被删除)另外一种属于外部表(这种表数据不属于Hive数据仓库,元数据中会表达具体数据在哪里,使用的时候和内部表的使用是一样的,只是如果通过Hive去删除的话,此时删除的只是元数据,本没有删除数据本身);
- hive> create table a1(a string,b int);
- OK
- Time taken: 1.875 seconds
- hive> create table a2(a string,b int);
- OK
- Time taken: 0.088 seconds
3)查看表
- Show tables;
七、使用hive 操作搜索引擎数据实战
1)将搜狗实验室的数据放入到hdfs 中
- hadoop dfs -mkdir /library/sogou
- hadoop dfs -put ./sogouQ3.txt /library/sogou
2)在hive 中创建表
- create table sogouQ3(ID STRING,WEBSESSION STRING,WORDSTRING,S_SEQ INT,C_SEQ INT,WEBSIT STRING) ROW FORMAT DELIMITED FIELDSTERMINATED BY '\t' LINES TERMINATED BY '\n';
3)将sogouQ3.txt 加载到表sogouQ3 中
- LOAD DATA INPATH 'library/sogou/sogouQ3.txt' INTO TABLEsogouQ3
4)在hive 中查询表sogouQ3
- select count(*) from sogouQ3
- select count(*) from SOGOUQ2 where S_SEQ=1 and C_SEQ=1and WEBSITE like '%baidu%';
5)创建外部表
- CREATE EXTERNAL TABLE SOGOUQ2(ID STRING,WEBSESSIONSTRING,WORD STRING,S_SEQ INT,C_SEQ INT,WEBSIT STRING) ROW FORMAT DELIMITEDFIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' STORED AS TEXTFILE LOCATION '/library/sogou/sogouQ2EXTERNAL';
将数据放入hdfs 中
- hadoop dfs -put ./sogouQ1.txt /library/sogouQ1external
查询记录的总条数
- select count(*) from SogouQ1 where s_seq = 1 and c_seq=1
找出排名前5位的内容
- select word,count(word) as countword from sogouQ1 group by word order by countword desc limit 5;
6)tdDate.txit 字段描述:分别为日期、年月、年、月、日、周几、第几周、季度、旬、半月。
tbstock.txt 字段描述:订单号,交易的位置, 交易的日期
tbStockdetail.txt 字段描述:订单号、行号、货品、、“”、数量、金额
在hvie中创建3张表
- CREATE TABLE tbDate(dateIDstring,theyearmonth string,theyear string,themonth string,thedatestring,theweek string,theweeks string,thequot string,thetendaystring,thehalfmonth string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINESTERMINATED BY '\n' ;
- CREATE TABLE tbStock(ordernumber STRING,locationid string,dateIDstring) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
- CREATE TABLE tbStockDetail(ordernumber STRING,rownum int,itemidstring,qty int,price int ,amount int) ROW FORMAT DELIMITED FIELDS TERMINATED BY',' LINES TERMINATED BY '\n' ;
将数据load到tbDate表中
- load data local inpath '/home/hadoop/tbDate.txt' into table tbDate;
将数据load 到tbStock表中
- hadoop dfs -put tbStock.txt /library
- load data inpath 'library/tbstock.txt' into table tbStock
在HDFS上如果直接把数据放入Hive数据仓库的话,会把数据直接剪切过去
将数据load 到tbStockDetail表中
- load data local inpath '/home/hadoop/tbStockDetail.txt' into table tbStockDetail;
统计季度销售前10
- select c.theyear,c.thequot,sum(b.amount) assumofamount from tbStock a,tbStockDetail b,tbDate c wherea.ordernumber=b.ordernumber and a.dateid=c.dateid group by c.theyear,c.thequotorder by sumofamount desc limit 10;
统计销售额大于20000
- select a.ordernumber,sum(b.amount) assumofamount from tbStock a,tbStockDetail b where a.ordernumber=b.ordernumbergroup by a.ordernumber having sumofamount>200000;
年度最畅销的商品
- select distinct e.theyear,e.itemid,f.maxofamount from (selectc.theyear,b.itemid,sum(b.amount) as sumofamount from tbStock a,tbStockDetailb,tbDate c where a.ordernumber=b.ordernumber and a.dateid=c.dateid group byc.theyear,b.itemid) e , (select d.theyear,max(d.sumofamount) as maxofamountfrom (select c.theyear,b.itemid,sum(b.amount) as sumofamount from tbStocka,tbStockDetail b,tbDate c where a.ordernumber=b.ordernumber anda.dateid=c.dateid group by c.theyear,b.itemid) d group by d.theyear) f wheree.theyear=f.theyear and e.sumofamount=f.maxofamount order by e.theyear;
注:本学习笔记来自DT大数据梦工厂 微信公众号:DT_Spark 每晚8点YY永久直播频道:68917580