一、背景描述

随着中国数字化转型战略的推进,传统通信行业正面临着数字化转型的挑战和机遇;用户对通信服务的需求已经发生了根本性的变化,通信运营商正在通过技术创新和服务升级来满足这些需求;数字化转型涉及到网络建设、数据管理、服务创新等方面,大数据技术成为关键驱动力之一。

为了应对这一转型,我们要求参赛者搭建通信行业大数据分析平台,并利用 Hive 数仓技术和 Spark 计算引擎对通信用户行为数据进行操作和分析;通过这样的平台,可以快速处理和挖掘海量数据,得出有价值的洞察和分析结果。

同时,在展示数据分析结果方面,我们要求参赛者结合前端可视化框架 ECharts 和Python 可视化库pyecharts,创建交互式的数据可视化图表;这些图表能够直观地展示数据分析结果,帮助管理者更好地决策企业的发展战略,并对销售、营销、客服和技术等部门的目标策略进行全面部署;通过数据可视化,销售部门可以了解产品销售趋势和市场份额;营销部门可以优化营销活动和广告投放策略;客服部门可以提供更好的客户服务;技术部门可以进行网络优化和故障排查。

二、模块一:平台搭建与运维

(一)任务一:大数据平台搭建

本模块需要使用 root 用户完成相关配置;所有组件均在/root/software 目录下。

1.子任务一:基础环境准备

master、slave1、slave2三台节点都需要安装JDK

(1)将JDK安装包解压到/root/software目录下;

(2)在“/etc/profile”文件中配置JDK环境变量JAVA_HOME和PATH的值,并让配置文件立即生效;

(3)查看JDK版本,检测JDK是否安装成功。

在master节点操作

(1)在master上生成SSH密钥对;

(2)将master上的公钥拷贝到slave1和slave2上;在master 上通过 SSH 连接slave1 和slave2 来验证。

2.子任务二:Hadoop 完全分布式安装配置

master、slave1、slave2三台节点都需要安装Hadoop

(1)在 主 节 点 将 Hadoop 安 装 包 解 压  到/root/software目录下;

(2)依次配置hadoop-env.sh、core-sitxml、hdfs-site.xml、mapred-site.xml、yarn-site.xml和workers配置文件;Hadoop集群部署规划如下表;

表1     Hadoop集群部署规划

服务器 master slave1 slave2
HDFS NameNode
HDFS SecondaryNameNode
HDFS DataNode DataNode DataNode
YARN ResourceManager
YARN NodeManager NodeManager NodeManager
历史日志服务器 JobHistoryServer

 

(3)在master节点的Hadoop 安装目录下依次创建hadoopDatas/tempDatas 、 hadoopDatas/namenodeDatas 、hadoopDatas/datanodeDatas、hadoopDatas/dfs/nn/edits、

hadoopDatas/dfs/snn/name 和hadoopDatas/dfs/nn/snn/edits目录;

(4)在master节点上使用scp命令将配置完的Hadoop安装目录直接拷贝至slave1和slave2;

(5)三台节点的“/etc/profile”文件中配置Hadoop环境变量HADOOP_HOME和PATH的值,并让配置文件立即生效;

(6)在主节点格式化集群;

(7)在主节点依次启动HDFS、YARN集群和历史服务

3.子任务三:MySQL 安装配置

只在master节点操作

(1)将MySQL 7.25安装包解压到/root/software目录下;

(2)使用 rpm -ivh 依 次 安 装 mysql-community-common、mysql-community- libs、mysql-community-libs-compat 、 mysql-community-client 和 mysql-community-server包;

(3)安装好MySQL后,使用mysql用户初始化和启动数据库;

(4)使用root用户无密码登录MySQL,然后将root用户的密码修改为123456,修改完成退出MySQL,重新登录验证密码是否修改成功;

更改“mysql”数据库里的 user 表里的 host 项,从localhost 改成即可实现用户远程登录;设置完成刷新配置信息,让其生效。

4.子任务四:Hive 安装配置

只在master节点操作。

(1) 将Hive 3.1.2的安装包解压到/root/software目录下;

(2) 在“/etc/profile”文件中配置Hive环境变量HIVE_HOME和PATH的值,并让配置文件立即生效;

(3) 查看Hive版本,检测Hive环境变量是否设置成功;

(4) 切换到 $HIVE_HOME/conf 目录下,将 hiveenv.sh.template文件复制一份并重命名为hive-env.sh;然后,使用vim编辑器进行编辑,在文件中配置HADOOP_HOME、

HIVE_CONF_DIR以及HIVE_AUX_JARS_PATH参数的值,将原有值删除并将前面的注释符#去掉;配置完成,保存退出;

(5) 将 /root/software 目 录 下 的 MySQL 驱动包mysql-connector-java-5.1.47-bin.jar拷 贝 到$HIVE_HOME/lib目录下;

(6) 在$HIVE_HOME/conf目录下创建一个名为hive-site.xml的文件,并使用vim编辑器进行编辑;

配置如下内容:

表2    配置内容

配置参数 描述 参数值
javax.jdo.optio n.ConnectionURL 连接元数据库的链接信息 jdbc:mysql://master:3306/hivedb

 

?createDatabaseIfNotExist=true& amp;useSSL=false&useUnicode

=true&characterEncoding=UTF

 

-8

javax.jdo.optio n.ConnectionDri verName连接数据库驱动com.mysql.jdbc.Driver
javax.jdo.optio n.ConnectionUse连接数据库用户名称root

 

rName
javax.jdo.optio n.ConnectionPas sword 连接数据库用户密码  

123456

 

(7)使用schematool命令,通过指定元数据库类型为“mysql”,来初始化源数据库的元数据;

(8)使用CLI启动Hive,进入Hive客户端;在Hive默认数据库下创建一个名为student的管理表;

表3    数据表

字段 数据类型
id int
name string

 

(9)通过insert语句往student表中插入一条测试数据。

5.子任务五:Flume 安装配置

只在master 节点操作。

(1)将 Flume 11.0 的 安 装 包 解 压   到

/root/software目录下;

(2)在“/etc/profile”文件中配置Flume环境变量

FLUME_HOME和PATH的值,并让配置文件立即生效;

(3)使 用 cd 命 令 进 入 /root/software/apache- flume-1.11.0-bin/conf 目录下, 使用cp 命令将flume-env.sh.template文件复制一份,并重命名为flume-env.sh;使用vim 命令打开 “flume-env.sh” 配置文件, 找到JAVA_HOME参数位置,将前面的“#”去掉,将值修改为本机JDK的实际位置;修改完成,保存退出;

(4)查看Flume版本,检测Flume是否安装成功。

(二)任务二:数据库配置维护

1.子任务一:数据库配置

在Hive 中创建一个名为 comm 的数据库,如果数据库已经存在,则不进行创建。

2.子任务二:创建相关表

(1)在 comm 数 据 库 下 创 建 一 个 名 为

ods_behavior_log的外部表,如果表已存在,则先删除;分区字段为dt,即根据日期进行分区;同时,使用location关键  字  将  表  的  存  储  路  径  设  置  为  HDFS  的/behavior/ods/ods_behavior_log目录;字段类型如下表所示;

表4    字段类型

字段 数据类型 说明
line string 一整行JSON数据
dt string 日期,分区字段

 

(2)使 用  load   data  子  句  将  本  地/root/eduhq/data/app_log/behavior目录下的每个数据文件依次加载到外部表ods_behavior_log的对应分区中,按照日志文件对应日期定义静态分区(例如:dt=’2023-01-01’)

(3)查看ods_behavior_log表的所有现有分区、前3行数据,并统计外部表ods_behavior_log数据总行数;

(4)在 comm 数 据 库 下 创 建 一 个 名 为

dwd_behavior_log的外部表,如果表已存在,则先删除;分区字段为dt,即根据日期进行分区;另外,要求指定表的存储路径为HDFS的/behavior/dwd/dwd_behavior_log目录,存储文件类型为“orc”,文件的压缩类型为“snappy”;字段类型如下表所示;

表5    字段类型

字段 数据类型 说明
client_ip string 客户端请求的IP地址
 

device_type

 

string

请求的设备类型, 手机

 

mobile或者电脑pc

 

type

 

string

上网的模式,4G、5G或

 

WiFi

devicestring设备ID
urlstring访问的资源路径
provincestring省份
citystring城市
tsbigint时间戳
dtstring日期,分区字段

 

三、模块二:数据获取与处理

(一)任务一:数据获取与清洗

1.子任务一:数据获取

(1)启动Hadoop集群,使用HDFS Shell指令,在HDFS根目录下级联创建一个名为/behavior/origin_log的目录,用于存储采集到的用户行为日志;

(2)目录创建完成,使用HDFS Shell指令,将本地/root/eduhq/data/app_log/behavior目录下的所有用户行为日志文件采集至HDFS的/behavior/origin_log目录下;

(3)采集完成,在本机打开浏览器,访问http://本机主机名:9870或http://本机IP地址:9870进入HDFS WebUI界面,查看是否成功将数据采集到HDFS上。

2.子任务二:数据清洗

(1)使用Windows操作系统上的Excel软件,打开名为”behavior2023-01-01.csv”的文件;

(2)对数据进行清洗,专注处理名为”behavior2023- 01-01.csv”的文件中的”time”列。将时间日期格式进行分列,分别处理为日期和时间两列。

(二)任务二:数据标注

开 发 一 个 简 单 的    Java 类  IpToLocUdf , 继 承org.apache.hadoop.hive.ql.udf.generic.GenericUDF ,重载initialize()、evaluate()和 getDisplayString()方法;该类需要实现通过 IP 从/root/eduhq/data/area.json文件中随机获取“省份”和“城市”信息,完成数据的分类标注。

(三)任务三:数据统计

1.子任务一:HDFS 文件上传下载

( 1 ) 将包“ com.hive.udf ”导出为名为 hive-udf- behavior-1.0.0.jar 的 JAR 文件, 并 保 存在 本地 的/root/eduhq/udf_jars 目录中;

(2)将打包文件 hive-udf-behavior-1.0.0.jar 上传到HDFS 的/hive/udf_jars 目录下;

(3)在 Hive 客户端,创建永久函数 url_trans 和get_city_by_ip,并将它们与开发好的 class 相关联;

(4)在 Hive 客户端,使用 select 语句测试url_trans和get_city_by_ip 函数;

(5)启动 Hive 的动态分区功能,并将 Hive 设置为非严格模式;

(6)使用 insert overwrite … select …子句将ods_behavior_log 表中数据插入分区表 dwd_behavior_log中,并实现根据 dt 进行动态分区。

2.子任务二:数据统计

(1)查看dwd_behavior_log表的所有现有分区;

(2)查看外部表dwd_behavior_log的前3行数据,并验证URL协议是否被统一为“http”,以及通过IP是否能够获取到“省份”和“城市”信息;

(3)统计外部表dwd_behavior_log数据总行数。

四、模块三:业务分析与可视化

(一)任务一:数据可视化

1.子任务一:数据分析

(1)在 comm 数 据 库 下 创 建 一 个 名 为dws_behavior_log的外部表,如果表已存在,则先删除;分区字段为dt,即根据日期进行分区;另外,要求指定表的存储路径为HDFS的/behavior/dws/dws_behavior_log目录,存储文件类型为“orc”,文件的压缩类型为“snappy”;字段类型如下表所示;

表6    字段类型表

字段 数据类型 说明
client_ip string 客户端请求的IP地址
 

device_type

 

string

请求的设备类型, 手机mobile或

 

者电脑pc

typestring上网的模式,4G、5G或WiFi
devicestring设备ID
urlstring访问的资源路径
provincestring省份

 

city string 城市

 

(2)启动Hive的动态分区功能,并将Hive设置为非严格模式;

(3)使用insert overwrite … select …子句将dwd_behavior_log表中数据插入分区表dws_behavior_log中,并实现根据dt进行动态分区;

(4)查看dws_behavior_log表的所有现有分区、前3行数据,并统计统计表数据总行数;

(5)在comm数据库下创建一个名为dim_date的外部表,如果表已存在,则先删除;另外,要求指定表的存储路径为HDFS的/behavior/dim/dim_date目录,字段分隔符为 “\t”  ,   建   表   时   添   加   TBLPROPERTIES(‘skip.header.line.count’=’1’) 语句让Hive读取外表数据时跳过文件行首(表头);字段类型如下表所示;

表7    字段类型表

字段 数据类型 说明
date_id string 日期
week_id string
week_day string 星期
day string 一个月的第几天
month string 月份
quarter string 季度
year string 年份

 

is_workday string 是否是工作日
holiday_id string 国家法定假日标识

(6)在comm数据库下创建一个名为dim_area的外部表,如果表已存在,则先删除;另外,要求指定表的存储路径为HDFS的/behavior/dim/dim_area目录,字段分隔符为“\t”;字段类型如下表所示;

表8    字段类型表

字段 数据类型 说明
city string 城市/区/县
province string 省份
area string 地区

(7)使用load data子句将本地/root/eduhq/data目录下的“dim_date_2023.txt”和“dim_area.txt”文件分别加载到外部表dim_date和dim_area中;

(8)分别查看外部表dim_date和dim_area的前3行数据;

(9)分别统计外部表dim_date和dim_area数据总行数;

(10)统计不同省份用户访问量;将统计结果导出到本地文件系统的/root/eduhq/result/ads_user_pro目录下,并指定列的分隔符为逗号(特别注意:因为省份是随机获取的,所以结果会有所差异);

(11)统计不同时间段的网页浏览量将统计结果导出到本地文件系统的/root/eduhq/result/ads_user_hour 目录下,并指定列的分隔符为逗号;

(12)不同网站访客的设备类型统计;将统计结果导出到本地文件系统的/root/eduhq/result/ads_visit_mode目录下,并指定列的分隔符为逗号;

(13)不同网站的上网模式统计;将统计结果导出到本地文件系统的/root/eduhq/result/ads_online_type 目录下,并指定列的分隔符为逗号;

2.子任务二:数据可视化

(1)使用Pyecharts库绘制中国地图,以直观展示不同省份用户访问量分布情况;

  • 文件名:ads_user_pro.py
  • 文件存放地址:/root/eduhq/python/
  • 数据目录:/root/eduhq/result/ads_user_pro目录
  • 背景地址:/root/eduhq/images/img_1.png
  • 图表名称:不同省份用户访问量分布图.html
  • 图表存放地址:/root/eduhq/html/

(2)使用Pyecharts库绘制一个带时间轴的柱形图,以直观展示不同经济大区用户的访问量统计情况;

  • 文件名:ads_user_region.py
  • 文件存放地址:/root/eduhq/python/
  • 数据目录:/root/eduhq/result/ads_user_region目录
  • 背景地址:/root/eduhq/images/img_2.png
  • 图表名称:不同经济大区用户访问量统计柱形图.html
  • 图表存放地址:/root/eduhq/html/

(3)使用Pyecharts绘制网页浏览量统计折线图,直观展示不同时间段内的访问量变化趋势;

  • 文件名:ads_user_hour.py
  • 文件存放地址:/root/eduhq/python/
  • 数据目录:/root/eduhq/result/ads_user_hour目录
  • 背景地址:/root/eduhq/images/img_3.png
  • 图表名称:不同时间段网页浏览量统计曲线图.html
  • 图表存放地址:/root/eduhq/html/

(4)使用Pyecharts绘制网页浏览量统计折线图,直观展示节假日和工作日不同时间段内的访问量变化趋势;

  • 文件名:ads_hol_work_user.py
  • 文件存放地址:/root/eduhq/python/
  • 数据目录:/root/eduhq/result/ads_hol_work_user目录
  • 背景地址:/root/eduhq/images/img_3.png
  • 图表名称:节假日和工作日各时间段网页浏览量统计曲线图.html
  • 图表存放地址:/root/eduhq/html/

(5)使用Pyecharts绘制堆积柱形图,直观地展示访客在不同设备类型上的访问次数情况;

  • 文件名:ads_visit_mode.py
  • 文件存放地址:/root/eduhq/python/
  • 数据目录:/root/eduhq/result/ads_visit_mode目录
  • 背景地址:/root/eduhq/images/img_2.png
  • 图表名称:网站访客设备类型统计堆积柱形图.html
  • 图表存放地址:/root/eduhq/html/

(6)使用Pyecharts绘制堆积柱形图,直观地展示访客在不同上网模式下的访问次数情况;

  • 文件名:ads_online_type.py
  • 文件存放地址:/root/eduhq/python/
  • 数据目录:/root/eduhq/result/ads_online_type目录
  • 背景地址:/root/eduhq/images/img_2.png
  • 图表名称:网站访客上网模式统计堆积柱形图.html
  • 图表存放地址:/root/eduhq/html/

(7)使用Pyecharts绘制词云图,直观地展示不同域名用户访问情况;

  • 文件名:ads_user_domain.py
  • 文件存放地址:/root/eduhq/python/
  • 数据目录:/root/eduhq/result/ads_user_domain目录
  • 背景地址:/root/eduhq/images/img_2.png
  • 图表名称:不同域名用户访问统计词云.html
  • 图表存放地址:/root/eduhq/html/

(二)任务二:业务分析

(1)统计每天不同经济大区用户访问量;将统计结 果 导 出 到 本  地  文  件  系  统  的/root/eduhq/result/ads_user_region目录下,并指定列的分隔符为逗号;

(2)统计节假日和工作日的浏览量差异;将统计结 果 导 出 到 本  地  文  件  系  统  的/root/eduhq/result/ads_hol_work_user目录下,并指定列的分隔符为逗号;

(3)统计不同域名的用户访问量;将统计结果导出 到 本 地 文 件   系     统    的/root/eduhq/result/ads_user_domain目录下,并指定列的分隔符为逗号;

2024年职业院校中职组”大数据应用与服务“技能大赛大数据应用与服务技能大赛01试题.pdf


参考答案:

模块一:平台搭建与运维

任务一:大数据平台搭建

 

1.基础环境准备

 

(1)将JDK安装包解压到/root/software目录下

tar zxvf jdk-8u202-linux-x64.tar.gz -C /root/software

(2)在“/etc/profile”文件中配置JDK环境变量JAVA_HOME和PATH的值,并让配置文件立即生效

vi /etc/profile

在文件最底部添加如下内容

export JAVA_HOME=/root/software/jdk1.8.0

export PATH=$PATH:$JAVA_HOME/bin

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

添加完成后保存。执行source /etc/profile命令。

(3)查看JDK版本,检测JDK是否安装成功

输入java -version查看版本。

(1)在master上生成SSH密钥对

执行ssh-keygen -t rsa,一直回车即可

(2)将master上的公钥拷贝到slave1和slave2上;

ssh-copy-id slave1

根据提示输入yes以及目标主机密码即可,slave2同理。

在 master 上通过 SSH 连接 slave1 和 slave2 来验证。

ssh slave1

执行上述命令后无需输入密码即可直接连接到slave1表示成功,slave2同理。

2.Hadoop 完全分布式安装配置

(1)在 主 节 点 将 Hadoop 安 装 包 解 压 到/root/software目录下

tar zxvf hadoop-3.2.1.tar.gz -C /root/software/

(2)依次配置hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml和workers配置文件

hadoop-env.sh:

export JAVA_HOME=/root/software/jdk1.8.0

export HDFS_NAMENODE_USER=root

export HDFS_DATANODE_USER=root

export HDFS_SECONDARYNAMENODE_USER=root

export YARN_RESOURCEMANAGER_USER=root

export YARN_NODEMANAGER_USER=root

core-site.xml:

<!– 在configuration标签内添加以下内容 –>

<property>

<name>fs.defaultFS</name>

<value>hdfs://master:9000</value>

</property>

<!– 临时文件存放位置 –>

<property>

<name>hadoop.tmp.dir</name>

<value>/root/software/hadoop-3.2.1/hadoopDatas/tempDatas</value>

</property>

hdfs-site.xml:

<!– 在configuration标签内添加以下内容 –>

<!– 设置副本数量 –>

<property>

<name>dfs.replication</name>

<value>2</value>

</property>

<!– namenode存放的位置,老版本是用dfs.name.dir –>

<property>

<name>dfs.namenode.name.dir</name>

<value>/root/software/hadoop-3.2.1/hadoopDatas/namenodeDatas</value>

</property>

<!– datanode存放的位置,老版本是dfs.data.dir –>

<property>

<name>dfs.datanode.data.dir</name>

<value>/root/software/hadoop-3.2.1/hadoopDatas/datanodeDatas/</value>

</property>

<!– 关闭文件上传权限检查 –>

<property>

<name>dfs.permissions.enalbed</name>

<value>false</value>

</property>

<!– namenode运行在哪儿节点,默认是0.0.0.0:9870,在hadoop3.x中端口从原先的50070改为了9870 –>

<property>

<name>dfs.namenode.http-address</name>

<value>master:9870</value>

</property>

<!– secondarynamenode运行在哪个节点,默认0.0.0.0:9868 –>

<property>

<name>dfs.namenode.secondary.http-address</name>

<value>master:9868</value>

</property>

mapred-site.xml:

<!– 在configuration标签内添加以下内容 –>

<!– 设置mapreduce在yarn平台上运行 –>

<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

<!– 配了上面这个下面这个也得配, 不然跑mapreduce会找不到主类。MR应用程序的CLASSPATH–>

<property>

<name>mapreduce.application.classpath</name>

<value>/root/software/hadoop-3.2.1/share/hadoop/mapreduce/*:/root/software/hadoop-3.2.1/share/hadoop/mapreduce/lib/*</value>

</property>

<!– 历史服务器端地址 –>

<property>

<name>mapreduce.jobhistory.address</name>

<value>master:10020</value>

</property>

<!– 历史服务器web端地址 –>

<property>

<name>mapreduce.jobhistory.webapp.address</name>

<value>master:19888</value>

</property>

yarn-site.xml:

<!– 在configuration标签内添加以下内容 –>

<!– resourcemanager运行在哪个节点 –>

<property>

<name>yarn.resourcemanager.hostname</name>

<value>master</value>

</property>

<!– nodemanager获取数据的方式 –>

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce_shuffle</value>

</property>

<!– 关闭虚拟内存检查 –>

<property>

<name>yarn.nodemanager.vmem-check-enabled</name>

<value>false</value>

</property>

workers:

# 删掉里面的localhost,添加以下内容

master

slave1

slave2

(3)在master节点的Hadoop安装目录下依次创建hadoopDatas/tempDatas 、 hadoopDatas/namenodeDatas 、hadoopDatas/datanodeDatas、hadoopDatas/dfs/nn/edits、hadoopDatas/dfs/snn/name 和hadoopDatas/dfs/nn/snn/edits目录

进入hadoop安装目录下执行下面命令:

mkdir -p hadoopDatas/tempDatas

mkdir -p hadoopDatas/namenodeDatas

mkdir -p hadoopDatas/datanodeDatas

mkdir -p hadoopDatas/dfs/nn/edit

mkdir -p hadoopDatas/dfs/snn/name

mkdir -p hadoopDatas/dfs/nn/snn/edits

(4)在master节点上使用scp命令将配置完的Hadoop安装目录直接拷贝至slave1和slave2

scp -r /root/software/hadoop-3.2.1 root@slave1:/root/software/

scp -r /root/software/hadoop-3.2.1 root@slave2:/root/software/

(5)三台节点的“/etc/profile”文件中配置Hadoop环境变量HADOOP_HOME和PATH的值,并让配置文件立即生效;

vi /etc/profile

export HADOOP_HOME=/root/software/hadoop-3.2.1

export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

source /etc/profile

(6)在主节点格式化集群

hdfs namenode -format

(7)在主节点依次启动HDFS、YARN集群和历史服务

start-all.sh

mapred –daemon start historyserver(mr-jobhistory-daemon.sh start historyserver)

3.MySQL安装配置

(1)将MySQL 5.7.25安装包解压到/root/software目录下

tar xf mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar -C /root/software

(2)使用rpm -ivh依次安装

rpm -ivh mysql-community-common-5.7.25-1.el7.x86_64.rpm

rpm -ivh mysql-community-libs-5.7.25-1.el7.x86_64.rpm

rpm -ivh mysql-community-devel-5.7.25-1.el7.x86_64.rpm

rpm -ivh mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm

rpm -ivh mysql-community-client-5.7.25-1.el7.x86_64.rpm

rpm -ivh mysql-community-server-5.7.25-1.el7.x86_64.rpm

(3)启动数据库

systemctl start mysqld.service

(4)使用root用户无密码登录MySQL,然后将root用户的密码修改为123456

systemctl stop mysqld.service

vi /etc/my.cnf

加入下面配置

skip-grant-tables

systemctl start mysqld.service

此时即可无密码登录mysql,登录后执行下面命令修改密码

flush privileges;

set password for root@localhost = password(‘123456’);

flush privileges;

exit

修改完成后注释skip-grant-tables并重启服务。

在mysql命令行执行下面命令即可远程登录

GRANT ALL PRIVILEGES ON *.* TO ‘root’@’%’ IDENTIFIED BY ‘123456’ WITH GRANT OPTION;

flush privileges;

 

4.Hive 安装配置

(1)将Hive 3.1.2的安装包解压到/root/software目录下

tar zxf apache-hive-3.1.2-bin.tar.gz -C /root/software/

(2)在“/etc/profile”文件中配置Hive环境变量HIVE_HOME和PATH的值,并让配置文件立即生效

vi /etc/profile

export HIVE_HOME=/root/software/apache-hive-3.1.2-bin

export PATH=$PATH:$HIVE_HOME/bin

source /etc/profile

(3)查看Hive版本

hive –version

(4)配置hive-env.sh

cp hive-env.sh.template hive-env.sh

vim hive-env.sh

HADOOP_HOME=/root/software/hadoop-3.2.1

export HIVE_CONF_DIR=/root/software/apache-hive-3.1.2-bin/conf

export HIVE_AUX_JARS_PATH=/root/software/apache-hive-3.1.2-bin/lib

(5)驱动包拷贝

cp /root/software/ mysql-connector-java-5.1.47.jar /root/software/apache-hive-3.1.2-bin/lib

(6)创建一个名为hive-site.xml的文件、配置

touch hive-site.xml

vim hive-site.xml

<configuration>

<property>

<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8</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>123456</value>

<description>password to use against metastore database</description>

</property>

</configuration>

(7)初始化源数据库

/root/software/apache-hive-3.1.2-bin/bin/schematool -initSchema -dbType mysql -verbos

(8)使用CLI启动Hive,进入Hive客户端;在Hive默认数据库下创建一个名为student的管理表

hive

create table student(id int,name string);

(9)通过insert语句往student表中插入一条测试数据

insert into student(id,name) values(1,”test”);

5.Flume 安装配置

(1)解压

tar zxvf apache-flume-1.11.0-bin.tar.gz -C /root/software/

(2)环境变量

vim /etc/profile

export FLUME_HOME=/root/software/apache-flume-1.11.0-bin

export PATH=$PATH:$FLUME_HOME/bin

source /etc/profile

(3)文件复制与配置

cd /root/software/apache-flume-1.11.0-bin/conf

cp flume-env.sh.template flume-env.sh

vim flume-env.sh

export JAVA_HOME=/usr/local/jdk1.8.0

(4)查看Flume版本

flume-ng version

任务数据库配置维护


  1. 数据库配置

create database if not exists comm;


  1. 创建相关表

    (1)创建外部表

— 删除已存在的表

drop table if exists comm.ods_behavior_log;

— 创建外部表

create external table comm.ods_behavior_log(line string) partitioned by (dt string) location ‘/behavior/ods/ods_behavior_log’;

(2)加载数据

load data local inpath ‘/root/eduhq/data/app_log/behavior/behavior2023-01-01.log’ into table ods_behavior_log partition(dt=’2023-01-01′);

其他同理。

(3)查看ods_behavior_log表的所有现有分区、前3行数据,并统计外部表ods_behavior_log数据总行数

SHOW PARTITIONS ods_behavior_log;

select * from ods_behavior_log limit 3;

select count(*) from ods_behavior_log;

(4)创建dwd_behavior_log外部表

drop table if exists comm.dwd_behavior_log;

create external table comm.dwd_behavior_log(client_ip string,device_type string,type string,device string,url string,province string,city string,ts bigint) partitioned by (dt string) STORED AS orc location ‘/behavior/dwd/dwd_behavior_log’ tblproperties (“orc.compress”=”SNAPPY”);

 

模块二:数据获取与处理

任务一:数据获取与清洗


  1. 数据获取

  • 启动Hadoop集群,使用HDFS Shell指令,在HDFS根目录下级联创建一个名为/behavior/origin_log的目录,用于存储采集到的用户行为日志。

hadoop fs -mkdir -p /behavior/origin_log

  • 使用HDFS Shell指令,将本地/root/eduhq/data/app_log/behavior目录下的所有用户行为日志文件采集至HDFS的/behavior/origin_log目录下

hadoop fs -put /root/eduhq/data/app_log/behavior/* /behavior/origin_log

  • 采集完成,查看

使用浏览器访问即可。


  1. 数据清洗

    2024年职业院校中职组ZZ052大数据应用与服务赛项第01套赛题+答案2024年职业院校中职组ZZ052大数据应用与服务赛项第01套赛题+答案2024年职业院校中职组ZZ052大数据应用与服务赛项第01套赛题+答案 2024年职业院校中职组ZZ052大数据应用与服务赛项第01套赛题+答案 2024年职业院校中职组ZZ052大数据应用与服务赛项第01套赛题+答案 2024年职业院校中职组ZZ052大数据应用与服务赛项第01套赛题+答案 2024年职业院校中职组ZZ052大数据应用与服务赛项第01套赛题+答案

    任务二:数据标注

    import org.apache.hadoop.hive.ql.exec.UDFArgumentException;

    import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;

    import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;

    import org.apache.hadoop.hive.ql.metadata.HiveException;

    import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;

    import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;

    import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;

    import org.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;

    import org.codehaus.jackson.JsonNode;

    import org.codehaus.jackson.map.ObjectMapper;

    import org.codehaus.jackson.node.ObjectNode;

     

    import java.io.File;

    import java.io.IOException;

    import java.util.ArrayList;

    import java.util.List;

     

    public class IpToLocUdf extends GenericUDF {

    private StringObjectInspector stringInspector;

    private ObjectInspector outputOI;

    // 初始化函数,用于设置函数参数和输出类型

    /*

    这个initialize方法的主要作用是验证输入参数的数量和类型,并设置输出类型为字符串。

    如果输入参数不符合要求,它将抛出异常。

    最后,它返回一个输出类型的ObjectInspector,供其他方法使用。

    */

    @Override

    public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {

    // 检查参数数量是否为1,如果不是则抛出异常

    if (arguments.length != 1) {

    throw new UDFArgumentLengthException(

    “The function iptoloc(ip) takes exactly 1 argument.”);

    }

     

    // 检查第一个参数是否为StringObjectInspector类型,如果不是则抛出异常

    if (!(arguments[0] instanceof StringObjectInspector)) {

    throw new UDFArgumentTypeException(0,

    “The argument must be a string, but ” + arguments[0].getTypeName()

    + ” was given.”);

    }

     

    // 将第一个参数设置为字符串类型的ObjectInspector

    this.stringInspector = (StringObjectInspector) arguments[0];

     

    // 设置输出类型为字符串,通过反射创建ObjectInspector实例

    this.outputOI = ObjectInspectorFactory.getReflectionObjectInspector(String.class,

    ObjectInspectorFactory.ObjectInspectorOptions.JAVA);

     

    // 打印输出类型的ObjectInspector信息

    System.out.println(outputOI);

    return outputOI; // 返回输出类型的ObjectInspector,供其他方法使用

    }

     

    @Override

    public Object evaluate(DeferredObject[] arguments) throws HiveException {

    // 获取传入的IP地址参数

    String ip = stringInspector.getPrimitiveJavaObject(arguments[0].get());

     

    // 从指定文件中读取地区信息

    //File file = new File(“/root/eduhq/data/area.json”);

    File file = new File(“/resources/area.json”);

    ObjectMapper mapper = new ObjectMapper();

    List<String> provinces = new ArrayList<>();

    List<String> cities = new ArrayList<>();

     

    try {

    // 解析JSON文件

    JsonNode rootNode = mapper.readTree(file);

     

    // 遍历JSON节点,获取省份和城市信息

    for (JsonNode node : rootNode) {

    String province = node.path(“province”).getTextValue();

    String city = node.path(“city”).getTextValue();

     

    provinces.add(province);

    cities.add(city);

    }

    } catch (IOException e) {

    throw new HiveException(“Failed to read area.json file: ” + e.getMessage(), e);

    }

     

    // 根据IP地址进行分类标注

    int index = ipToIndex(ip);

    String province = provinces.get(index);

    String city = cities.get(index);

     

    // 返回分类标注结果

    ObjectNode result = mapper.createObjectNode();

    result.put(“province”, province);

    result.put(“city”, city);

     

    return result.toString();

    }

     

    @Override

    public String getDisplayString(String[] children) {

    return “iptoloc(” + children[0] + “)”;

    }

     

    private int ipToIndex(String ip) {

    // 根据IP地址的某种算法得到索引值

    // 这里简单地使用IP地址的字符长度模拟算法

    return ip.length() % 7;

    }

    }

    <dependency>

    <groupId>org.apache.hive</groupId>

    <artifactId>hive-exec</artifactId>

    <version>3.1.2</version>

    </dependency>

    任务三:数据统计

    1.HDFS 文件上传下载

    (1)将包“com.hive.udf”导出为名为 hive-udf-behavior-1.0.0.jar的JAR 文 件 , 并 保 存 在 本 地 的/root/eduhq/udf_jars 目录中 https://blog.csdn.net/gb4215287/article/details/132793531

    (2)将打包文件 hive-udf-behavior-1.0.0.jar 上传到HDFS 的/hive/udf_jars目录下 hadoop fs -put hive-udf-behavior-1.0.0.jar /hive/udf_jars

    (3)在 Hive 客户端,创建永久函数 url_trans 和get_city_by_ip,并将它们与开发好的 class 相关联 add jar /root/eduhq/udf_jars/hive-udf-behavior-1.0.0.jar create function url_trans as com.hive.udf.url_trans; create function get_city_by_ip as com.hive.udf.get_city_by_ip;

    (4)在 Hive 客户端,使用 select 语句测试 url_trans和 get_city_by_ip 函数; 根据具体作用使用。例如: select get_city_by_ip(ip);

    (5)启动Hive的动态分区功能,并将 Hive 设置为非严格模式; set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nostrict;

    (6)使用 insert overwrite … select …子句将ods_behavior_log 表中数据插入分区表 dwd_behavior_log中,并实现根据 dt 进行动态分区。 insert overwrite table dwd_behavior_log PARTITION (dt) select *,date_format(dt,’yyyy-MM-dd’) from ods_behavior_log;

    2.数据统计

(1)查看dwd_behavior_log表的所有现有分区; SHOW PARTITIONS dwd_behavior_log;

(2)查看外部表dwd_behavior_log的前3行数据,并验证URL协议是否被统一为“http”,以及通过IP是否能够获取到“省份”和“城市”信息; SELECT * FROM dwd_behavior_log LIMIT 3; SELECT URL FROM dwd_behavior_log WHERE URL LIKE ‘http://%’; 返回所有以“http://”开头的URL。如果返回的行数大于0,则说明URL协议被统一为“http”。 通过ip获取省份,例如:select get_city_by_ip(ip);

(3)统计外部表dwd_behavior_log数据总行数。 SELECT COUNT(*) FROM dwd_behavior_log;

模块三:业务分析与可视化

任务一:数据可视化

1.数据分析

(1)在 comm 数 据 库 下 创 建 一 个 名 为dws_behavior_log的外部表,如果表已存在,则先删除;分区字段为dt,即根据日期进行分区;另外,要求指定表的存储路径为HDFS的/behavior/dws/dws_behavior_log目录,存储文件类型为“orc”,文件的压缩类型为“snappy”; DROP TABLE IF EXISTS dws_behavior_log; create external table comm.dws_behavior_log(client_ip string,device_type string,type string,device string,url string,province string,city string) partitioned by (dt string) STORED AS orc location ‘/behavior/dws/dws_behavior_log’ tblproperties (“orc.compress”=”SNAPPY”);

(2)启动Hive的动态分区功能,并将Hive设置为非严格模式; set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nostrict;

文档下载

相关新闻

联系我们

027-87870986

在线咨询:点击这里给我发消息

邮件:931234110@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息