省赛样题5解析

2024-2025学年广东省职业院校技能大赛

中职组大数据应用与服务赛项

5

一、背景描述

大数据时代背景下,人们生活习惯发生了很多改变。在传统运营模式中,缺乏数据积累,人们在做出一些决策行为过程中,更多是凭借个人经验和直觉,发展路径比较自我封闭。而大数据时代,为人们提供一种全新的思路,通过大量的数据分析得出的结果将更加现实和准确。平台可以根据用户的浏览,点击,评论等行为信息数据进行收集和整理。通过大量用户的行为可以对某一个产品进行比较准确客观的评分和评价,或者进行相应的用户画像,将产品推荐给喜欢该产品的用户进行相应的消费。

因数据驱动的大数据时代已经到来,没有大数据,我们无法为用户提供大部分服务,为完成互联网酒店的大数据分析工作,你所在的小组将应用大数据技术,通过 Python 语言以数据采集为基础,将采集的数据进行相应处理,并且进行数据标注、数据分析与可视化、通过大数据业务分析方法实现相应数据分析。运行维护数据库系统保障存储数据的安全性。通过运用相关大数据工具软件解决具体业务问题。你们作为该小组的技术人员,请按照下面任务完成本次工作。

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

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

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

本任务需要使用 root 用户完成相关配置,安装 Hadoop 需要配置前置环境。命令中要求使用绝对路径,具体要求如下:

(1)配置三个节点的主机名,分别为 master、slave1、slave2,然后修改三个节点的 hosts 文件,使得三个节点之间可以通过主机名访问,在 master上将执行命令 cat /etc/hosts 的结果复制并粘贴至【提交结果.docx】中对应的任务序号下;

1
2
3
4
5
6
[root@master ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.91 master
192.168.1.92 slave1
192.168.1.93 slave2

(2)将 /opt/software 目录下将文件 jdk-8u191-linux-x64.tar.gz 安装包(若slave1、slave2节点不存在以上文件则需从master节点复制)解压到 /opt/module 路径中(若路径不存在,则需新建),将 JDK 解压命令复制并粘贴至【提交结果.docx】中对应的任务序号下;

1
[root@master software]# tar -zxvf jdk-8u391-linux-x64.tar.gz -C /opt/module/

(3)在 /etc/profile 文件中配置 JDK 环境变量 JAVA_HOME 和 PATH 的值,并让配置文件立即生效,将在 master上 /etc/profile 中新增的内容复制并粘贴至【提交结果.docx】中对应的任务序号下;

1
2
export JAVA_HOME=/opt/module/jdk1.8.0_391
export PATH=$PATH:$JAVA_HOME/bin

(4)查看 JDK 版本,检测 JDK 是否安装成功,在 master 上将执行命令java -vserion 的结果复制并粘贴至【提交结果.docx】中对应的任务序号下;

1
2
3
4
[root@master module]# java -version
java version "1.8.0_391"
Java(TM) SE Runtime Environment (build 1.8.0_391-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.391-b13, mixed mode)

(5)创建 hadoop 用户并设置密码,为 hadoop 用户添加管理员权限。在 master 上将执行命令 grep ‘hadoop’ /etc/sudoers 的结果复制并粘贴至【提交结果.docx】中对应的任务序号下;

1
2
[root@master module]# grep 'hadoop' /etc/sudoers
hadoop ALL=(ALL) NOPASSWD:ALL

(6)关闭防火墙,设置开机不自动启动防火墙,在 master 上将执行命令 systemctl status fireawlld 的结果复制并粘贴至【提交结果.docx】中对应的任务序号下;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@master module]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@master module]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)

Feb 17 02:23:47 localhost.localdomain systemd[1]: Starting firewalld - dynamic f....
Feb 17 02:23:47 localhost.localdomain systemd[1]: Started firewalld - dynamic fi....
Feb 17 02:23:47 localhost.localdomain firewalld[747]: WARNING: AllowZoneDrifting ...
Feb 18 02:09:52 master systemd[1]: Stopping firewalld - dynamic firewall daemon...
Feb 18 02:09:53 master systemd[1]: Stopped firewalld - dynamic firewall daemon.
Hint: Some lines were ellipsized, use -l to show in full.

(7)配置三个节点的 SSH 免密登录,在 master 上通过 SSH 连接 slave1 和 slave2 来验证。

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@master module]# ssh slave1
Last failed login: Tue Feb 18 02:11:10 EST 2025 from slave2 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Tue Feb 18 02:02:49 2025 from 192.168.1.166
[root@slave1 ~]# hostname
slave1
[root@slave1 ~]# exit
logout
Connection to slave1 closed.
[root@master module]# ssh slave2
Last login: Tue Feb 18 02:02:52 2025 from 192.168.1.166
[root@slave2 ~]# hostname
slave2

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

本任务需要使用 root 用户和 hadoop 用户完成相关配置,使用三个节点完成 Hadoop 完全分布式安装配置。命令中要求使用绝对路径,具体要求如下:

(1)在 master 节点中的 /opt/software 目录下将文件 hadoop-3.3.6.tar.gz 安装包解压到 /opt/module 路径中,将 hadoop 安装包解压命令复制并粘贴至【提交结果.docx】中对应的任务序号下;

1
[hadoop@master software]$ sudo tar -zxvf hadoop-3.3.6.tar.gz -C /opt/module/

(2)在 master 节点中将解压的 Hadoop 安装目录重命名为 hadoop ,并修改该目录下的所有文件的所属者为 hadoop,所属组为 hadoop,将修改所属者的完整命令复制并粘贴至【提交结果.docx】中对应的任务序号下;

1
[hadoop@master module]$ sudo chown -R hadoop:hadoop hadoop/

(3)在 master 节点中使用 hadoop 用户依次配置 hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、masters 和 workers 配置文件,Hadoop集群部署规划如下表,将 yarn-site.xml 文件内容复制并粘贴至【提交结果.docx】中对应的任务序号下;

服务器 master slave1 slave2
DHFS NameNode
HDFS SecondaryNameNode
HDFS DataNode DataNode DataNode
YARN ResourceManager
YARN NodeManager NodeManager NodeManager
历史日志服务器 JobHistoryServer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<configuration>

<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.application.classpath</name>
<value>/opt/module/hadoop/etc/hadoop:/opt/module/hadoop/share/hadoop/common/lib/*:/opt/module/hadoop/share/hadoop/common/*:/opt/module/hadoop/share/hadoop/hdfs:/opt/module/hadoop/share/hadoop/hdfs/lib/*:/opt/module/hadoop/share/hadoop/hdfs/*:/opt/module/hadoop/share/hadoop/mapreduce/*:/opt/module/hadoop/share/hadoop/yarn:/opt/module/hadoop/share/hadoop/yarn/lib/*:/opt/module/hadoop/share/hadoop/yarn/*
</value>
</property>
<property>
<name>yarn.web-proxy.address</name>
<value>master:8089</value>
</property>
<property>
<name>yarn.log-aggregation.enable</name>
<value>true</value>
</property>
</configuration>

(4)在 master 节点中使用 scp 命令将配置完的 hadoop 安装目录直接拷贝至 slave1 和 slave2 节点,将完整的 scp 命令复制并粘贴至【提交结果.docx】中对应的任务序号下;

1
2
[hadoop@master module]$ sudo scp -r jdk1.8.0_391/ hadoop/ slave1:`pwd`
[hadoop@master module]$ sudo scp -r jdk1.8.0_391/ hadoop/ slave2:`pwd`

(5)在 slave1 和 slave2 节点中将 hadoop 安装目录的所有文件的所属者为 hadoop,所属组为 hadoop。

1
2
[hadoop@slave1 module]$ sudo chown -R hadoop:hadoop hadoop/
[hadoop@slave2 module]$ sudo chown -R hadoop:hadoop hadoop/

(6)在三个节点的 /etc/profile 文件中配置 Hadoop 环境变量 HADOOP_HOME 和 PATH 的值,并让配置文件立即生效,将 master 节点中 /etc/profile 文件新增的内容复制并粘贴至【提交结果.docx】中对应的任务序号下;

1
2
export HADOOP_HOME=/opt/module/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

(7) 在 master 节点中初始化 Hadoop 环境 namenode,将初始化命令及初始化结果(截取初始化结果日志最后 20 行即可)粘贴至【提交结果.docx】中对应的任务序号下;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[hadoop@master hadoop]$ hadoop namenode -format

2025-02-18 02:31:58,444 INFO util.GSet: capacity = 2^16 = 65536 entries
2025-02-18 02:31:58,461 INFO namenode.FSImage: Allocated new BlockPoolId: BP-610088070-192.168.1.91-1739863918457
2025-02-18 02:31:58,468 INFO common.Storage: Storage directory /data/nn has been successfully formatted.
2025-02-18 02:31:58,484 INFO namenode.FSImageFormatProtobuf: Saving image file /data/nn/current/fsimage.ckpt_0000000000000000000 using no compression
2025-02-18 02:31:58,544 INFO namenode.FSImageFormatProtobuf: Image file /data/nn/current/fsimage.ckpt_0000000000000000000 of size 401 bytes saved in 0 seconds .
2025-02-18 02:31:58,549 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
2025-02-18 02:31:58,564 INFO namenode.FSNamesystem: Stopping services started for active state
2025-02-18 02:31:58,564 INFO namenode.FSNamesystem: Stopping services started for standby state
2025-02-18 02:31:58,566 INFO namenode.FSImage: FSImageSaver clean checkpoint: txid=0 when meet shutdown.
2025-02-18 02:31:58,566 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at master/192.168.1.91
************************************************************/

(8) 在 master 节点中依次启动HDFS、YARN集群和历史服务。在 master 上将执行命令 jps 的结果复制并粘贴至【提交结果.docx】中对应的任务序号下;

1
2
3
4
5
6
7
8
9
[hadoop@master hadoop]$ jps
4372 NameNode
5045 ResourceManager
5253 NodeManager
5591 WebAppProxyServer
4618 DataNode
4812 SecondaryNameNode
5724 Jps
5662 JobHistoryServer

(9) 在 slave1 查看 Java 进程情况。在 slave1上将执行命令 jps 的结果复制并粘贴至【提交结果.docx】中对应的任务序号下。

1
2
3
4
[hadoop@slave1 module]$ jps
2838 Jps
2634 DataNode
2746 NodeManager

(二)任务二:数据库服务器的安装与运维

1. 子任务一:MySQL 安装配置

本任务需要使用 rpm 工具安装 MySQL 并初始化,具体要求如下:

(1) 在 master 节点中的 /opt/software 目录下将 MySQL 5.7.44 安装包解压到 /opt/module 目录下;

1
[root@master software]# tar -xvf mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar -C /opt/module/

(2)在 master 节点中使用 rpm -ivh 依次安装 mysql-community-common、mysql-community-libs、mysql-community-libs-compat 、 mysql-community-client 和 mysql-community-server 包,将所有命令复制粘贴至【提交结果.docx】 中对应的任务序号下;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@master module]# rpm -ivh mysql-community-common-5.7.44-1.el7.x86_64.rpm 
warning: mysql-community-common-5.7.44-1.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 3a79bd29: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:mysql-community-common-5.7.44-1.e################################# [100%]
[root@master module]# rpm -ivh mysql-community-libs-5.7.44-1.el7.x86_64.rpm
warning: mysql-community-libs-5.7.44-1.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 3a79bd29: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:mysql-community-libs-5.7.44-1.el7################################# [100%]
[root@master module]# rpm -ivh mysql-community-libs-compat-5.7.44-1.el7.x86_64.rpm
warning: mysql-community-libs-compat-5.7.44-1.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 3a79bd29: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:mysql-community-libs-compat-5.7.4################################# [100%]
[root@master module]# rpm -ivh mysql-community-client-5.7.44-1.el7.x86_64.rpm
warning: mysql-community-client-5.7.44-1.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 3a79bd29: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:mysql-community-client-5.7.44-1.e################################# [100%]
[root@master module]# rpm -ivh mysql-community-server-5.7.44-1.el7.x86_64.rpm
warning: mysql-community-server-5.7.44-1.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 3a79bd29: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:mysql-community-server-5.7.44-1.e################################# [100%]

(3)在 master 节点中启动数据库系统并初始化 MySQL 数据库系统,将完整命令复制粘贴至【提交结果.docx】 中对应的任务序号下;

1
[root@master module]# mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql

2.子任务二:MySQL 运维

本任务需要在成功安装 MySQL 的前提,对 MySQL 进行运维操作,具体要求如下:

(1)修改 MySQL 配置文件启用远程连接,将修改后的配置内容复制粘贴至【提交结果.docx】中对应的任务序号下;

1
bind-address=0.0.0.0

(2)启用 MySQL 慢查询日志功能,设置慢查询阈值为 2 秒,将完整的配置命令和验证命令结果复制粘贴至【提交结果.docx】中对应的任务序号下;

1
2
3
4
5
mysql> set global slow_query_log = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> set global long_query_time = 2;
Query OK, 0 rows affected (0.00 sec)

(3)创建名为 hadoop 的数据库用户,密码设置为 Hadoop@2025,将创建用户的完整命令及执行结果复制粘贴至【提交结果.docx】中对应的任务序号下;

1
2
mysql> create user 'hadoop'@'%' identified by 'Hadoop@2025';
Query OK, 0 rows affected (0.01 sec)

(4)为 hadoop 用户授予 bigdata 数据库的 SELECT、INSERT 和 UPDATE 权限,将授权命令及执行结果复制粘贴至【提交结果.docx】中对应的任务序号下;

1
2
3
4
5
mysql> grant select, insert, update on bigdata.* to 'hadoop'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

(5)创建名为 monitor 的监控专用用户,仅授予 PROCESS 和 SHOW DATABASES 权限,将完整命令及执行结果复制粘贴至【提交结果.docx】中对应的任务序号下;

1
2
3
4
5
6
7
8
mysql> create user 'monitor'@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> grant process, show databases on *.* to 'monitor'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

(6)使用 mysqldump 工具备份 bigdata 数据库,将备份文件保存为 bigdata_backup.sql,将备份命令及执行过程复制粘贴至【提交结果.docx】中对应的任务序号下;

1
2
3
4
[root@master module]# mysqldump -uroot -p bigdata > bigdata_backup.sql
Enter password:
[root@master module]# ls
bigdata_backup.sql

(7)配置数据库字符集为 utf8mb4,并将默认排序规则设置为 utf8mb4_unicode_ci,将配置命令和验证结果复制粘贴至【提交结果.docx】中对应的任务序号下;

1
2
3
4
5
mysql> set global character_set_server = 'utf8mb4';
Query OK, 0 rows affected (0.00 sec)

mysql> set global collation_server = 'utf8mb4_unicode_ci';
Query OK, 0 rows affected (0.00 sec)

(8)创建一个定时备份脚本,实现每天凌晨 2 点自动备份 bigdata 数据库到 /opt/backup 目录,并只保留最近 7 天的备份文件,将完整脚本内容复制粘贴至【提交结果.docx】中对应的任务序号下;

1
2
3
4
5
6
7
8
9
#!/bin/bash
db_name="bigdata"
backup_dir="/opt/backup"
date=$(date +"%Y%m%d%H%M%S")
backup_file="$backup_dir/$db_name-$date.sql"

mysqldump -uroot -p'123456' $db_name > $backup_file

find "$backup_dir" -type f -name "${db_name}-*.sql" -mtime +7 -exec rm {} \;

3.子任务三:数据表的创建及维护

(1)根据以下数据字段在 bigdata 数据库中创建酒店表 (hotel)。酒店表字段如下:

字段 类型 中文含义 备注
id int 酒店编号
hotel_name varchar 酒店名称
city varchar 城市
province varchar 省份
level varchar 星级
room_num int 房间数
score double 评分
commnet_num varchar 评论数
1
2
3
4
5
6
7
8
9
10
mysql> create table hotel(
-> id int,
-> hotel_name varchar(255),
-> city varchar(255),
-> province varchar(255),
-> level varchar(255),
-> room_num int,
-> score double,
-> commnet_num varchar(255));
Query OK, 0 rows affected (0.01 sec)

(2)根据以下数据字段在 bigdata 数据库中创建评论表 (comment)。评论表字段如下:

字段 类型 中文含义 备注
id int 评论编号
name varchar 酒店名称
commentator varchar 评论人
score double 评分
comment_time datetime 评论时间
content varchar 评论内容
1
2
mysql> create table comment( id int, name varchar(255), commentator varchar(255), score double, comment_time datetime, content varchar(255));
Query OK, 0 rows affected (0.01 sec)

将这两个 SQL 建表语句分别复制粘贴至【提交结果.docx】中对应的任务序号下。

(3)根据已给到的 sql 文件将这两份数据导入 bigdata 数据库中,并对其中的数据进行如下操作:

1
2
mysql> source /opt/module/hotel_all_data.sql
mysql> source /opt/module/comment_all_data.sql
  • 统计各省份的平均酒店评分,并将评分低于该省份平均分的酒店评分上调0.5分(评分上限为5分);

    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE hotels h
    JOIN (
    SELECT province, AVG(score) AS avg_score
    FROM hotels
    GROUP BY province
    ) AS prov_avg ON h.province = prov_avg.province
    SET h.score = LEAST(h.score + 0.5, 5)
    WHERE h.score < prov_avg.avg_score;
  • 查找出每个城市评论数最多的酒店及其详细信息;

    1
    2
    mysql> select h.* from ( select city, max(commnet_num) as max_commnet_num from hotel group by city) as city_max  join hotel h on h.city = city_max.city and h.commnet_num = city_max.max_commnet_num order by h.city;
    Empty set (0.01 sec)
  • 找出所有发表过3条及以上差评(评分小于等于2分)的评论人,并列出这些评论人的评论时间、评论内容及对应的酒店名称,按评论时间降序排序。

    1
    2
    mysql> select c.commentator, c.comment_time, c.content, c.name from comment c join (seleect commeor having count_min >=3) as select_count_min on c.commentator=select_count_min.commentattor where c.score <= 2 order by comment_time desc;
    Empty set (0.00 sec)

将这3个 SQL 语句分别复制粘贴至 【提交结果.docx】中对应的任务序号下。