一、背景描述
随着中国数字化转型战略的推进,传统通信行业正面临着数字化转型的挑战和机遇;用户对通信服务的需求已经发生了根本性的变化,通信运营商正在通过技术创新和服务升级来满足这些需求;数字化转型涉及到网络建设、数据管理、服务创新等方面,大数据技术成为关键驱动力之一。
为了应对这一转型,我们要求参赛者搭建通信行业大数据分析平台,并利用 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 |
device | string | 设备ID |
url | string | 访问的资源路径 |
province | string | 省份 |
city | string | 城市 |
ts | bigint | 时间戳 |
dt | string | 日期,分区字段 |
三、模块二:数据获取与处理
(一)任务一:数据获取与清洗
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 |
type | string | 上网的模式,4G、5G或WiFi |
device | string | 设备ID |
url | string | 访问的资源路径 |
province | string | 省份 |
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
任务二:数据库配置维护
数据库配置
create database if not exists comm;
创建相关表
(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”);
模块二:数据获取与处理
任务一:数据获取与清洗
数据获取
- 启动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
- 采集完成,查看
使用浏览器访问即可。
数据清洗
任务二:数据标注
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;