作者:韩信子@ShowMeAI
教程地址:http://www.showmeai.tech/tuto...
本文地址:http://www.showmeai.tech/arti...
申明:版权所有,转载请分割平台与作者并注明出处

1.Hive 搭建与配置

大数据生态中最重要的工具平台之一是Hive,它是离线计算的要害组件,罕用于数仓建设,在公司内会通过SQL实现大数据的统计与报表。上面来看一下Hive的搭建和配置应用办法。

1)下载Hive

装置Hive过程能够参考官网文档:https://cwiki.apache.org/confluence/display/Hive/GettingStarted。

依照文件倡议在 http://www.apache.org/dyn/closer.cgi/hive/ 下载最新的release,这里以Hive3.1.3为例解说。

把安装文件解压到装置有hadoop环境的机器上:

root@ubuntu:~/bigdata# lltotal 20drwxr-xr-x 27 root root 4096 Sep 30 07:24 azkaban/drwxr-xr-x  2 root root 4096 Oct 13 08:36 demo/drwxr-xr-x 12 1001 1001 4096 Sep 30 09:43 hadoop-3.3.0/drwxr-xr-x 11 root root 4096 Oct 13 07:58 hive-3.1.3/drwxr-xr-x 32 work work 4096 Aug 28 07:28 spark-3.0.1/root@ubuntu:~/bigdata# pwd/root/bigdata

接下来把Hive的bin目录导出PATH:

root@ubuntu:~/bigdata# cat /etc/profile.d/java.sh export PATH=/usr/local/jdk/bin:/root/bigdata/hadoop-3.3.0/bin:/root/bigdata/spark-3.0.1/bin:/root/bigdata/hive-3.1.3/bin:${PATH}

降级guava依赖为hadoop版本:

mv lib/guava-19.0.jar lib/guava-19.0.jar.bk ln -s  /root/bigdata/hadoop-3.3.0/share/hadoop/hdfs/lib/guava-27.0-jre.jar  /root/bigdata/hive-3.1.3/lib/guava-27.0-jre.jar

上述第一条命令先备份了Hive自带的guava依赖包,而后将hadoop自带的更高版本软链过去,这个版本一致性是Hive失常运行的要害之一。

2)装置MYSQL

hive的元数据服务是独立部署的,它基于mysql保留数据。能够应用apt命令在ubuntu环境装置oracle mysql:

apt-get install mysql-server

如果应用 mysql -h localhost -u root -p 登录时,提醒 access denied,那须要找到和删除 mysql user 表中的一条 localhost 的非凡规定:

delete from user where User=’root’ and Host=’localhost’;FLUSH PRIVILEGES;

接着创立hive数据库:

create database hive;

接着通过wget命令下载 JDBC mysql,并把该Jar放到hive的lib目录下(hive metastore服务将用该JDBC驱动连贯mysql读写元数据):

wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.21/mysql-connector-java-8.0.21.jarmv mysql-connector-java-8.0.21.jar lib

3)配置Hive

Hive会主动加载 conf/hive-site.xml 配置文件,官网在 conf/hive-default.xml.template 提供了一个模板文件,外面是 Hive 加载不到 hive-site.xml 时应用的默认值,能够参考 conf/hive-default.xml.template来填写 hive-site.xml,上面是一个配置好的样本(只配置了必要项):

root@ubuntu:~/bigdata/hive-3.1.3# cat conf/hive-site.xml <?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration>        <property>                <name>hive.cli.print.header</name>                <value>true</value>                <description>Whether to print the names of the columns in query output.</description>        </property>        <property>                <name>javax.jdo.option.ConnectionURL</name>                <value>jdbc:mysql://localhost:3306/hive</value>        </property>        <property>                <name>javax.jdo.option.ConnectionDriverName</name>                <value>com.mysql.cj.jdbc.Driver</value>        </property>        <property>                <name>javax.jdo.option.ConnectionUserName</name>                <value>root</value>        </property>        <property>                <name>javax.jdo.option.ConnectionPassword</name>                <value>xxxxx</value>        </property>        <property>                <name>hive.metastore.uris</name>                <value>thrift://localhost:9083</value>                <description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>        </property></configuration>

其中外围的我的项目解释如下:

  • hive.cli.print.header:Hive命令行工具将打印table的表头,不便浏览后果
  • javax.jdo.option.ConnectionURL:数据库JDBC URL,这里就是mysql的Hive数据库
  • javax.jdo.option.ConnectionDriverName:JDBC类名,8.x版本Mysql jar的类名有所变动,须要留神
  • javax.jdo.option.ConnectionUserName:mysql用户名
  • javax.jdo.option.ConnectionPassword:mysql明码
  • hive.metastore.uris:启动metastore服务的监听地址

4)启动metastore服务

先执行Hive建表命令,实现mysql元数据建表:

bin/schematool -dbType mysql -initSchema

执行命令:

nohup hive –service metastore &

服务将监听在 localhost:9083 端口,生产环境须要让host是能够被其余服务器拜访到的,因为拜访metastore服务的客户端不肯定在本机。

当初命令行应用Hive命令,将会主动依据 hive-site.xml 连贯到 metastore 服务,运行Hive命令做一下测试:

root@ubuntu:~/bigdata/hive-3.1.3# hiveSLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar:file:/root/bigdata/hive-3.1.3/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]SLF4J: Found binding in [jar:file:/root/bigdata/hadoop-3.3.0/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]Hive Session ID = f0d4bf60-d85f-456a-98fb-e904d50f5242Logging initialized using configuration in jar:file:/root/bigdata/hive-3.1.3/lib/hive-common-3.1.3.jar!/hive-log4j2.properties Async: trueHive Session ID = 959e0cda-f8eb-4fc1-b798-cb5175e735d2Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.hive> show databases;OKdatabase_namedefaultTime taken: 0.516 seconds, Fetched: 2 row(s)
Hive命令过后进入,能够看到自带的default数据库,并且还提醒Hive目前应用MR作为计算引擎,理论Hive倡议开始应用spark或者tez作为SQL的底层计算引擎,将来最终会彻底勾销MR。

目前持续应用MR作为计算引擎即可,Hive会依据hadoop命令主动找到hadoop和yarn配置文件,最终SQL是通过MR运行在yarn上实现计算的。

以上就是Hive的残缺搭建过程,小伙伴们就能够欢快地开始应用Hive了。

2.Hive利用案例

本案例对视频网站的数据进行各种指标剖析,为管理者提供决策反对。

1)需要形容

统计youtube影音视频网站的惯例指标,各种TopN指标:

  • 统计视频观看数Top10
  • 统计视频类别热度Top10
  • 统计视频观看数Top20所属类别
  • 统计视频观看数Top50所关联视频的所属类别Rank
  • 统计每个类别中的视频热度Top10
  • 统计每个类别中视频流量Top10
  • 统计上传视频最多的用户Top10以及他们上传的视频
  • 统计每个类别视频观看数Top10

2)我的项目表字段

视频表

字段备注详细描述
video id视频惟一id11位字符串
uploader视频上传者上传视频的用户名String
age视频年龄视频在平台上的整数天
category视频类别上传视频指定的视频分类
length视频长度整形数字标识的视频长度
views观看次数视频被浏览的次数
rate视频评分满分5分
ratings流量视频的流量,整型数字
conments评论数一个视频的整数评论数
related ids相干视频id相干视频的id,最多20个

用户表

字段备注字段类型
uploader上传者用户名string
videos上传视频数int
friends敌人数量int

ETL原始数据

通过观察原始数据模式,能够发现,视频能够有多个所属分类,每个所属分类用 & 符号宰割,且宰割的两边有空格字符,同时相干视频也是能够有多个元素,多个相干视频又用 \t 进行宰割。

为了剖析数据时不便对存在多个子元素的数据进行操作,首先进行数据重组荡涤操作。即:将所有的类别用 & 宰割,同时去掉两边空格,多个相干视频 id 也应用 & 进行宰割。

外围要做三件事件:

  • 长度不够9的删掉
  • 视频类别删掉空格
  • 该相干视频的宰割符

3)筹备工作

(1)创立 Hive 表

创立表:youtubevideo_oriyoutubevideo_user_ori
创立表:youtubevideo_orcyoutubevideo_user_orc

--创立: youtubevideo_ori表create table youtubevideo_ori(    videoId string,     uploader string,     age int,     category array<string>,     length int,     views int,     rate float,     ratings int,     comments int,    relatedId array<string>)row format delimitedfields terminated by "\t"collection items terminated by "&"stored as textfile;--创立 youtubevideo_user_ori表:create table youtubevideo_user_ori(    uploader string,    videos int,    friends int)row format delimitedfields terminated by "\t" stored as textfile;--创立 youtubevideo_orc表:create table youtubevideo_orc(    videoId string,     uploader string,     age int,     category array<string>,     length int,     views int,     rate float,     ratings int,     comments int,    relatedId array<string>)row format delimited fields terminated by "\t" collection items terminated by "&" stored as orc;--创立 youtubevideo_user_orc表:create table youtubevideo_user_orc(    uploader string,    videos int,    friends int)row format delimitedfields terminated by "\t" stored as orc;

(2)导入ETL后的数据

youtubevideo_ori

load data inpath "/output/youtube_video" into table youtubevideo_ori;

youtubevideo_user_ori

load data inpath "/youtube_video/user" into table youtubevideo_user_ori;

(3)向ORC表插入数据

youtubevideo_orc

insert overwrite table youtubevideo_orc select * from youtubevideo_ori;

youtubevideo_user_orc

insert into table youtubevideo_user_orc select * from youtubevideo_user_ori;

3.业务剖析

1)统计视频观看数 top10

思路:应用order by依照views字段做一个全局排序即可,同时设置只显示前10条。

SELECT   videoid,         uploader,         age,         category,         length,         views,         rate,         ratings,         commentsFROM     youtubevideo_orcORDER BY views DESC limit 10;-- 形式2SELECT *FROM  (                SELECT   videoid ,                         age,                         category,                         length,                         views,                         Row_number() OVER( ORDER BY views DESC) AS rn                FROM     youtubevideo_orc )tWHERE  t.rn <= 10;

2)统计视频类别热度Top10

思路:即统计每个类别有多少个视频,显示出蕴含视频最多的前10个类别。

  • ① 须要依照类别group by聚合,而后count组内的videoId个数即可。
  • ② 因为以后表构造为:一个视频对应一个或多个类别。所以如果要group by类别,须要先将类别进行列转行(开展),而后再进行count即可。
  • ③ 最初依照热度排序,显示前10条。
SELECT   category_name     AS category,         Count(t1.videoid) AS hotFROM     (                SELECT videoid,                       category_name                FROM   youtubevideo_orc lateral view explode(category) t_catetory as category_name) t1GROUP BY t1.category_nameORDER BY hot DESC limit 10;

3)统计出视频观看数最高的20个视频的所属类别以及类别蕴含Top20视频的个数

思路:

  • ① 先找到观看数最高的20个视频所属条目标所有信息,降序排列
  • ② 把这20条信息中的category决裂进去(列转行)
  • ③ 最初查问视频分类名称和该分类下有多少个Top20的视频
SELECT   category_name     AS category,         Count(t2.videoid) AS hot_with_viewsFROM     (                SELECT videoid,                       category_name                FROM   (                                SELECT   *                                FROM     youtubevideo_orc                                ORDER BY views DESC limit 20) t1 lateral VIEW explode(category) t_catetory as category_name) t2GROUP BY category_nameORDER BY hot_with_views DESC;

4)统计每个类别中的视频热度Top10,以Music为例

思路:

  • ① 要想统计Music类别中的视频热度Top10,须要先找到Music类别,那么就须要将category开展,所以能够创立一张表用于寄存categoryId开展的数据。
  • ② 向category开展的表中插入数据。
  • ③ 统计对应类别(Music)中的视频热度。
--创立表类别表:CREATE TABLE youtubevideo_category             (                          videoid STRING,                          uploader STRING,                          age INT,                          categoryid STRING,                          length INT,                          views  INT,                          rate FLOAT,                          ratings  INT,                          comments INT,                          relatedid ARRAY<string>             )             row format delimited fields terminated BY "\t" collection items terminated BY "&" stored AS orc;--向类别表中插入数据:INSERT INTO table youtubevideo_categorySELECT videoid,       uploader,       age,       categoryid,       length,       views,       rate,       ratings,       comments,       relatedidFROM   youtubevideo_orc lateral view explode(category) catetory AS categoryid;--统计Music类别的Top10(也能够统计其余)SELECT   videoid,         viewsFROM     youtubevideo_categoryWHERE    categoryid = "Music"ORDER BY views DESC limit 10;-- 形式2SELECT *FROM  (                SELECT   videoid ,                         age,                         categoryid,                         length,                         views,                         Row_number() OVER( ORDER BY views DESC) AS rn                FROM     youtubevideo_category                WHERE    categoryid = "music" )tWHERE  t.rn <= 10;

5)统计每个类别中视频流量Top10

思路:

  • ① 创立视频类别开展表(categoryId列转行后的表)
  • ② 依照ratings排序即可
SELECT *FROM  (SELECT videoid,              age,              categoryid,              length,              ratings,              Row_number()                OVER(                  partition BY categoryid                  ORDER BY ratings DESC) AS rn       FROM   youtubevideo_category)tWHERE  t.rn <= 10; 

6)统计上传视频最多的用户Top10以及他们上传的观看次数在前10的视频

思路:

  • ① 先找到上传视频最多的10个用户的用户信息
  • ② 通过uploader字段与youtubevideo_orc表进行join,失去的信息依照views观看次数进行排序即可。
--第一步:SELECT *FROM   youtubevideo_user_orcORDER  BY videos DESCLIMIT  10;--第二步:SELECT t2.videoid,       t2.uploader,       t2.views,       t2.ratings,       t1.videos,       t1.friendsFROM   (SELECT *        FROM   youtubevideo_user_orc        ORDER  BY videos DESC        LIMIT  10) t1       JOIN youtubevideo_orc t2         ON t1.uploader = t2.uploaderORDER  BY views DESCLIMIT  20;

ShowMeAI相干文章举荐

  • 图解大数据 | 导论:大数据生态与利用
  • 图解大数据 | 分布式平台:Hadoop与Map-reduce详解
  • 图解大数据 | 实操案例:Hadoop零碎搭建与环境配置
  • 图解大数据 | 实操案例:利用map-reduce进行大数据统计
  • 图解大数据 | 实操案例:Hive搭建与利用案例
  • 图解大数据 | 海量数据库与查问:Hive与HBase详解
  • 图解大数据 | 大数据分析开掘框架:Spark初步
  • 图解大数据 | Spark操作:基于RDD的大数据处理剖析
  • 图解大数据 | Spark操作:基于Dataframe与SQL的大数据处理剖析
  • 图解大数据 | 综合案例:应用spark剖析美国新冠肺炎疫情数据
  • 图解大数据 | 综合案例:应用Spark剖析开掘批发交易数据
  • 图解大数据 | 综合案例:应用Spark剖析开掘音乐专辑数据
  • 图解大数据 | 流式数据处理:Spark Streaming
  • 图解大数据 | Spark机器学习(上)-工作流与特色工程
  • 图解大数据 | Spark机器学习(下)-建模与超参调优
  • 图解大数据 | Spark GraphFrames:基于图的数据分析开掘

ShowMeAI系列教程举荐

  • 图解Python编程:从入门到精通系列教程
  • 图解数据分析:从入门到精通系列教程
  • 图解AI数学根底:从入门到精通系列教程
  • 图解大数据技术:从入门到精通系列教程