Loading...

《大数据综合实训》实训报告书

请直接点击下方查看pdf文件,或者下载pdf文件查看,内容太多了

《大数据综合实训》实训报告书.PDF

复制的文档内容(无图片)

大数据综合实训报告

起止时间:2024年 06月14日 至2024年06 月 26日

信息与智慧交通学院

目录
1 设定项目经理及项目组成员角色 13
2 实验一:运行环境安装与配置 13
2.1 实验目的 13
2.2 实验要求 13
2.3 实验环境 13
2.4 试验过程 14
2.4.1 实验任务一:安装和配置CentOS操作系统 14
2.4.1.1 步骤一:安装CentOS操作系统 14
2.4.1.2 步骤二:配置主机名 18
2.4.1.3 步骤三:配置系统IP及网关 18
2.4.1.4 步骤四:配置存储空间 19
2.4.1.5 步骤五:配置防火墙 19
2.4.1.6 步骤六:创建账号及密码,修改账号权限 19
2.4.2 实验任务二:安装和配置JDK 19
2.4.2.1 步骤一:上传JDK安装包 19
2.4.2.2 步骤二:解压安装JDK 19
2.4.2.3 步骤三:配置环境变量 20
2.4.2.4 步骤四:激活环境变量 20
2.4.2.5 步骤五:验证安装结果 20
3 实验二:基础中间件的安装和配置 20
3.1 实验目的 20
3.2 实验要求 21
3.3 实验环境 21
3.4 试验过程 21
3.4.1 实验任务一:安装和配置MySQL 21
3.4.1.1 步骤一:删除系统自带的MariaDB: 21
3.4.1.2 步骤二:安装依赖的组件 22
3.4.1.3 步骤三:上传MySQL安装包 22
3.4.1.4 步骤四:解压MySQL安装包 22
3.4.1.5 步骤五:安装MySQL组件 22
3.4.1.6 步骤六:起停数据库 22
3.4.1.7 步骤七:初始化root帐号密码 23
3.4.1.8 步骤八:设置允许远程连接 23
3.4.2 实验任务二:简单操作MySQL 24
3.4.2.1 步骤一:连接数据库 24
3.4.2.2 步骤二:查看当前登录用户 24
3.4.2.3 步骤三:查看数据库清单 24
3.4.2.4 步骤四:创建数据库 25
3.4.2.5 步骤五:使用数据库、查看当前数据库 25
3.4.2.6 步骤六:创建一张表 26
3.4.2.7 步骤七:查看数据库的表清单 26
3.4.2.8 步骤八:查看表结构 26
3.4.2.9 步骤九:插入一条数据 27
3.4.2.10 步骤十:查询表数据 27
3.4.3 实验任务二:使用MySQL常用工具集 27
3.4.4 实验任务四:备份与恢复MySQL数据库 27
3.4.4.1 步骤一:备份数据库 27
3.4.4.2 步骤二:重建数据库 29
3.4.4.3 步骤三:从备份文件恢复数据库 30
3.4.5 实验任务五:安装和配置Redis 31
3.4.5.1 步骤一:安装gcc 31
3.4.5.2 步骤二:上传redis安装包 32
3.4.5.3 步骤三:解压安装包并移动到redis目录 32
3.4.5.4 步骤四:编译安装redis 32
3.4.5.5 步骤五:修改redis配置 32
3.4.5.6 步骤六:启动redis 33
3.4.6 实验任务六:使用Redis 33
3.4.6.1 步骤一:使用redis-cli连接redis 33
3.4.6.2 步骤二:简单使用redis数据结构 34
3.4.7 实验任务七:维护Redis 35
3.4.7.1 步骤一:简单配置Redis 35
3.4.7.2 步骤二:使用命令维护redis 35
3.4.8 实验任务八:安装和配置zookeeper(伪集群模式) 40
3.4.8.1 步骤一:上传zookeeper安装包 40
3.4.8.2 步骤二:解压安装三个节点 40
3.4.8.3 步骤三:修改zookeeper1节点的配置文件 40
3.4.8.4 步骤四:配置zookeeper1节点的server id 41
3.4.8.5 步骤三:修改zookeeper2节点的配置文件 41
3.4.8.6 步骤四:配置zookeeper2节点的server id 42
3.4.8.7 步骤三:修改zookeeper3节点的配置文件 42
3.4.8.8 步骤四:配置zookeeper3节点的server id 43
3.4.8.9 步骤五:启动zookeeper 43
3.4.8.10 步骤五:验证安装结果 43
3.4.9 实验任务九:安装和配置kafka 44
3.4.9.1 步骤一:上传kafka安装包 44
3.4.9.2 步骤二:解压安装kafka 44
3.4.9.3 步骤三:修改节点1的配置 44
3.4.9.4 步骤四:新增并修改节点2的配置 44
3.4.9.5 步骤五:新增并修改节点3的配置 45
3.4.9.6 步骤六:启动kafka 45
3.4.9.7 步骤七:验证安装结果 46
3.4.9.8 步骤八:验证发送消息 46
3.4.9.9 步骤八:验证接收消息 46
4 实验三:大数据集群环境安装、配置与基本管理 47
4.1 实验目的 47
4.2 实验要求 47
4.3 实验环境 47
4.4 试验过程 47
4.4.1 实验任务一:部署前准备 47
4.4.1.1 步骤一:禁用防火墙 47
4.4.1.2 步骤二:禁用SELinux 48
4.4.1.3 步骤三:安装辅助工具 48
4.4.1.4 步骤四:安装节点及目录规划 49
4.4.1.5 步骤五:安装包及同步环境准备 50
4.4.2 实验任务二:安装和配置Hadoop 51
4.4.2.1 步骤一:解压安装Hadoop 51
4.4.2.2 步骤二:配置环境变量 51
4.4.2.3 步骤三:激活环境变量 51
4.4.2.4 步骤四:准备数据目录 52
4.4.2.5 步骤五:修改master1的配置文件 52
4.4.2.6 步骤六:将配置同步到其他节点 54
4.4.2.7 步骤七:格式化NameNode 54
4.4.2.8 步骤八:起停Hadoop 54
4.4.2.9 步骤九:验证安装结果 55
4.4.3 实验任务三:安装和配置Hive 57
4.4.3.1 步骤一:解压安装Hive 57
4.4.3.2 步骤二:配置环境变量 57
4.4.3.3 步骤三:激活环境变量 57
4.4.3.4 步骤四:修改master1的配置文件 57
4.4.3.5 步骤五:将配置同步到其他节点 59
4.4.3.6 步骤六:初始化Hive仓库 59
4.4.3.7 步骤七:启动并连接Hive 59
4.4.4 实验任务四:安装和配置Scala 60
4.4.4.1 步骤一:上传Scala安装包 60
4.4.4.2 步骤二:解压安装Scala 60
4.4.4.3 步骤三:配置环境变量 61
4.4.4.4 步骤四:激活环境变量 61
4.4.4.5 步骤五:验证安装结果 61
4.4.4.6 步骤六:在其他节点上安装Scala 61
4.4.5 实验任务五:安装和配置Spark 62
4.4.5.1 步骤一:上传Spark安装包 62
4.4.5.2 步骤二:解压安装Spark 62
4.4.5.3 步骤三:配置环境变量 62
4.4.5.4 步骤四:激活环境变量 62
4.4.5.5 步骤四:复制spark-env.sh.template模板文件 63
4.4.5.6 步骤五:编辑spark-env.sh文件 63
4.4.5.7 步骤六:复制spark-defaults.conf.template模板文件 63
4.4.5.8 步骤七:编辑spark-defaults.conf文件 64
4.4.5.9 步骤八:复制slaves.template文件 64
4.4.5.10 步骤九:编辑slaves文件 64
4.4.5.11 步骤十:配置slave1节点 65
4.4.5.12 步骤十一:配置slave2节点 65
4.4.5.13 步骤十二:启动Spark 65
4.4.5.14 步骤十三:验证安装结果 65
5 实验四:基于网页爬虫的数据采集、处理和数据存储 66
5.1 实验目的 66
5.2 实验要求 66
5.3 实验环境 66
5.4 试验过程 67
5.4.1 实验任务一:安装Scrapy运行环境 67
5.4.1.1 步骤一:安装EPEL源 67
5.4.1.2 步骤二:安装pip包管理工具 67
5.4.1.3 步骤三:安装Scrapy爬虫框架 67
5.4.1.4 步骤四:安装辅助工具 67
5.4.2 实验任务二:网站结构分析及爬虫算法设计 68
5.4.2.1 步骤一:选取目标网站 68
5.4.2.2 步骤二:分析网站结构 68
5.4.2.3 步骤三:设计资源抓取算法 70
5.4.3 实验任务三:搭建爬虫项目 71
5.4.3.1 步骤一:创建项目 71
5.4.3.2 步骤二:新建爬虫程序 71
5.4.3.3 步骤二:定义结构化数据 72
5.4.3.4 步骤三:修改spiders/books.py 72
5.4.3.5 步骤四:配置爬虫 74
5.4.3.6 步骤五:运行爬虫 75
5.4.4 实验任务四:将爬取的数据存储到MySQL 75
5.4.4.1 步骤一:编写Pipeline处理类 75
5.4.4.2 步骤二:修改爬虫配置 76
5.4.4.3 步骤三:重新运行爬虫 76
5.4.5 实验任务五:将爬取的数据存储到文件 77
5.4.5.1 步骤一:修改爬虫配置 77
5.4.5.2 步骤二:重新运行爬虫 77
5.4.6 实验任务六:安装flume-ng 78
5.4.6.1 步骤一:上传flume安装包 78
5.4.6.2 步骤二:解压安装flume 78
5.4.6.3 步骤三:配置环境变量 78
5.4.6.4 步骤四:激活环境变量 78
5.4.6.5 步骤五:验证安装结果 79
5.4.7 实验任务六:通过flume-ng将文件数据导入到kafka 79
5.4.7.1 步骤一:创建数据源目录 79
5.4.7.2 步骤二:准备数据文件 79
5.4.7.3 步骤三:配置从文件到kafka的任务 79
5.4.7.4 步骤四:执行任务 80
5.4.7.5 步骤五:验证执行结果 80
5.4.8 实验任务七:通过flume-ng将kafka数据导出到文件 80
5.4.8.1 步骤一:创建接收文件目录 80
5.4.8.2 步骤二:配置从kafka到文件的任务 80
5.4.8.3 步骤四:执行任务 81
5.4.8.4 步骤五:验证执行结果 81
6 实验五:ETL工具的使用 81
6.1 实验目的 81
6.2 实验要求 82
6.3 实验环境 82
6.4 实验过程 82
6.4.1 试验任务一:安装Kettle 82
6.4.1.1 步骤一:下载Kettle 82
6.4.1.2 步骤二:解压安装Kettle 83
6.4.2 实验任务二:新建从MySQL到文件的转换 83
6.4.2.1 步骤一:启动Kettle Spoon 83
6.4.2.2 步骤二:新建转换 84
6.4.2.3 步骤三:新建输入步骤 84
6.4.2.4 步骤四:新建输出步骤 88
6.4.2.5 步骤五:测试转换 90
6.4.3 实验任务三:新建和配置作业 92
6.4.3.1 步骤一:新建作业 92
6.4.3.2 步骤二:测试作业 94
6.4.3.3 步骤三:通过Kitchen命令后台运行作业 94
6.4.4 实验任务四:安装和配置Sqoop 95
6.4.4.1 步骤一:检查Hadoop 2.X是否已经安装 95
6.4.4.2 步骤二:上传Sqoop安装包 95
6.4.4.3 步骤三:解压安装Sqoop 95
6.4.4.4 步骤四:验证安装结果 95
6.4.4.5 步骤五:修改Sqoop配置 96
6.4.4.6 步骤六:验证修改配置的结果 97
6.4.4.7 步骤七:上传MySQL数据库驱动包 97
6.4.4.8 步骤八:将MySQL驱动包添加到Sqoop的lib目录 97
6.4.5 实验任务五:将MySQL数据导入到HDFS 97
6.4.5.1 步骤一:检查HDFS中目录是否存在 97
6.4.5.2 步骤二:将MySQL数据导入到HDFS 98
6.4.5.3 步骤三:查看导入结果 98
6.4.6 实验任务六:将HDFS数据导出到MySQL 98
6.4.6.1 步骤一:检查数据库中表中是否存在数据 98
6.4.6.2 步骤二:将HDFS数据导出到MySQL 99
6.4.6.3 步骤三:查看导出结果 100
7 实验六:数据清洗 100
7.1 实验目的 100
7.2 实验要求 100
7.3 实验环境 100
7.4 实验过程 101
7.4.1 实验任务一:Spark实现数据清洗 101
7.4.1.1 步骤一:搭建项目框架 101
7.4.1.2 步骤二:添加Maven依赖 101
7.4.1.3 步骤三:Spark读取kafka数据 102
7.4.1.4 步骤四:Spark处理字段非法值 102
7.4.1.5 步骤五:Spark移除重复数据 102
7.4.1.6 步骤六:Spark将数据写入HDFS 102
7.4.1.7 步骤七:完整代码实现 103
7.4.2 实验任务三:发布Spark数据清洗服务 105
7.4.2.1 步骤一:本地打包 105
7.4.2.2 步骤二:上传至服务器 106
7.4.2.3 步骤三:运行服务 106
7.4.3 实验任务二:MapReduce实现离线分析 106
7.4.3.1 步骤一:配置本地环境 106
7.4.3.2 步骤二:搭建项目框架 106
7.4.3.3 步骤三:添加Maven依赖 107
7.4.3.4 步骤四:实现mapreduce分组储存 107
7.4.3.5 步骤五:实现mapreduce统计 108
7.4.3.6 步骤六:分组完整代码实现 108
7.4.3.7 步骤六:统计完整代码实现 113
7.4.4 实验任务四:发布MapReduce离线分析服务 116
7.4.4.1 步骤一:本地打包 116
7.4.4.2 步骤二:上传至服务器 116
7.4.4.3 步骤三:运行服务 116
8 实验七:数据仓库的建立 116
8.1 实验目的 116
8.2 实验要求 117
8.3 实验环境 117
8.4 实验过程 117
8.4.1 实验任务一:检查Hive运行环境 117
8.4.1.1 步骤一:检查Hadoop环境 117
8.4.1.2 步骤二:检查Hive环境 117
8.4.1.3 步骤三:检查数据是否准备好 118
8.4.2 试验任务二:设计数据结构 118
8.4.2.1 步骤一:查看HDFS源数据结构 118
8.4.2.2 步骤二:根据返回结果确定数据结构 118
8.4.3 实验任务三:创建库和表 119
8.4.3.1 步骤一:进入Hive环境 119
8.4.3.2 步骤二:创建数据库 119
8.4.3.3 步骤三:创建表 119
8.4.4 实验任务二:数据入库 120
8.4.4.1 步骤一:登录数据库 120
8.4.4.2 步骤二:装载数据入库 120
8.4.4.3 步骤三:验证数据入库结果 120
9 实验八:数据挖掘 120
9.1 实验目的 121
9.2 实验要求 121
9.3 实验环境 121
9.4 实验过程 121
9.4.1 实验任务一:检查Hive及表数据 121
9.4.1.1 步骤一:登录数据库 121
9.4.1.2 步骤二:检查表数据 121
9.4.1.3 步骤三:退出Hive运行环境 122
9.4.2 实验任务二:建立汇聚视图 122
9.4.2.1 步骤一:按月统计教材发布数量 122
9.4.2.2 步骤二:验证统计结果 122
9.4.3 实验任务三:建立分析视图 122
9.4.3.1 步骤一:分析最受欢迎的10本教材 122
9.4.3.2 步骤二:验证分析结果 122
9.4.4 实验任务四:将分析结果导出到MySQL 123
9.4.4.1 步骤一:在MySQL中创建表 123
9.4.4.2 步骤二:导出数据到MySQL 123
9.4.4.3 步骤三:验证导出结果 124
10 实验九:数据可视化 124
10.1 实验目的 124
10.2 实验要求 124
10.3 实验环境 124
10.4 实验过程 125
10.4.1 实验任务一:准备基础开发环境、组件和数据 125
10.4.1.1 步骤一:下载Echarts 125
10.4.1.2 步骤二:下载jQuery 125
10.4.1.3 步骤三:下载Tomcat 126
10.4.1.4 步骤四:检查可视化数据源的数据情况 127
10.4.2 实验任务二:开发WEB可视化项目 127
10.4.2.1 步骤一:创建WEB项目 127
10.4.2.2 步骤二:修改Maven配置,添加项目依赖 128
10.4.2.3 步骤三:调整项目目录结构 129
10.4.2.4 步骤四:新建项目启动类 130
10.4.2.5 步骤五:新建JavaBean类 131
10.4.2.6 步骤六:新建数据库访问类 131
10.4.2.7 步骤七:新建控制器类 132
10.4.2.8 步骤八:新建资源文件 133
10.4.2.9 步骤九:实现WEB界面 134
10.4.2.10 附件:完整的项目代码 135
10.4.3 实验任务三:本地运行项目 135
10.4.3.1 步骤一:安装Tomcat 135
10.4.3.2 步骤二:添加Tomcat运行配置 136
10.4.3.3 步骤三:启动Tomcat项目并发布应用 138
11 实验十:大数据运维 139
11.1.1 实验任务一:备份NameNode的元数据 140
11.1.1.1 步骤一:设置冗余地址 140
11.1.2 实验任务二:DataNode块扫描器 140
11.1.2.1 步骤一:查看完整性 140
11.1.3 实验任务三:负载器均衡调整 140
11.1.3.1 步骤一:调整-threshold 140
11.1.3.2 步骤二:调整dfs.balance.bandwidthPerSec 141
11.1.4 实验任务四:例行停止机器 141
11.1.4.1 步骤一:停止命令 141
11.1.5 实验任务五:集群添加服务器及服务节点 142
11.1.5.1 步骤一:新服务器启动DataNode 142
11.1.5.2 步骤二:新服务器启动jobtracker 143
11.1.6 实验任务六:集群节点性能测试 143
11.1.6.1 步骤一:磁盘IO 143
11.1.7 实验任务七:平台日志查看及审计 144
11.1.8 实验任务八:设置日志级别 144
11.1.9 实验任务九:清理临时日志 144
11.1.10 实验任务十:定期执行数据均衡脚本 144
11.1.11 实验任务十一:Namenode的高可靠性 144
11.1.12 实验任务十二:HDFS HA 144
11.1.13 实验任务十三:大数据管理平台 HA 144
11.1.14 实验任务十五:Ganglia监控软件 144
11.1.14.1 步骤一:中心节点的安装 144
11.1.14.2 步骤二:被监测节点的安装 144
11.1.14.3 步骤三:Ganglia配置 144
11.1.14.4 步骤四:Ganglia启动 146
11.1.14.5 步骤五:界面访问 146
11.1.15 实验任务十六:操作系统调优 146
11.1.15.1 步骤一:避免使用swap分区 146
11.1.15.2 步骤二:调整内存分配策略 146
11.1.15.3 步骤三:修改net.core.somaxconn参数 147
11.1.15.4 步骤四:增大同时打开文件描述符的上限 147
11.1.15.5 步骤五:关闭THP 147
11.1.16 实验任务十七:JVM调优 147
11.1.16.1 步骤一:mapred-site.xml调优 147
11.1.16.2 步骤二:Hive调优 147
11.1.17 实验任务十八:HDFS调优 148
11.1.17.1 步骤一:设置dfs.replication 148
11.1.17.2 步骤二:设置dfs.block.size 148
11.1.17.3 步骤三:设置mapred.local.dir和dfs.data.dir 148
11.1.18 实验任务十九:MapReduce调优 148
11.1.18.1 步骤一:修改Reduce个数 148
11.1.18.2 步骤二:I/O相关 148
11.1.18.3 步骤三:reuduce shuffle阶段并行传输数据的数量 149
11.1.18.4 步骤四:一个tasktracker并发执行的reduce数 149
11.1.18.5 步骤五:可并发处理来自tasktracker的RPC请求数 149
11.1.19 实验任务二十:Yarn调优 149
11.1.19.1 步骤一:内存调优 149
11.1.20 实验任务二十一:Hive性能调优 149
11.1.20.1 步骤一:并行执行 149
11.1.20.2 步骤二:设置执行引擎 150
11.1.20.3 步骤三:设置map reduce个数 150
11.1.21 实验任务二十二:HBASE调优 150
11.1.21.1 步骤一:垃圾回收器调优 150
11.1.21.2 步骤二:MemStore-Local Allocation Buffer 150

1 设定项目经理及项目组成员角色
项目经理
系统架构师
大数据工程师
可视化工程师
测试工程师
运维工程师

2 实验一:运行环境安装与配置
2.1 实验目的
完成本实验,您应该能够:
 掌握CentOS系统的安装和配置
 掌握JDK的安装和配置
2.2 实验要求
 熟悉CentOS系统的安装和基本配置
 熟悉常用Linux操作系统命令
 熟悉JDK的安装和环境变量配置
2.3 实验环境
本实验所需资源环境如表1-1所示。
表1-1 资源环境
服务器 最低配置:双核CPU、8GB内存、100G硬盘
操作系统 CentOS-7-x86_64-Everything-1810
服务和组件 JDK

2.4 试验过程
2.4.1 实验任务一:安装和配置CentOS操作系统
2.4.1.1 步骤一:安装CentOS操作系统
本实验采用CentOS 7部署各服务器环境。
选择“Install CentOS 7”:

选择语言:

设置时间:

设置root帐号密码、用户帐号密码及权限:

等待安装完成:

完成后重启,输入帐号密码进入系统:

2.4.1.2 步骤二:配置主机名

新开一个终端窗口可以看到主机名就更新了:

2.4.1.3 步骤三:配置系统IP及网关
在终端输入:

[root@bogon Desktop]# vi /etc/sysconfig/network-scripts/ifcfg-eno16777736

保存退出,使用service命令重启网卡:

[root@bogon Desktop]# service network restart
Restarting network (via systemctl): [ 确定 ]
这里可以使用图形化:

应用之后再关闭打开一次有线网络连接即可看到ip已经手动生效:

2.4.1.4 步骤四:配置存储空间

2.4.1.5 步骤五:配置防火墙
停止防火墙:
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]#

禁用防火墙:
[root@localhost ~]# 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@localhost ~]#

这里可以重启虚拟机,再使用status来查看验证

2.4.1.6 步骤六:创建账号及密码,修改账号权限
[root@bogon home]# useradd newuser
[root@bogon home]# passwd newuser

[root@bogon home]# usermod -g root newuser

也可以使用用户文件修改权限:
[root@bogon home]# vi /etc/sudoers
进入vi编辑后用斜杠查找关键词root,再使用“n”向下查找到指定的行:

在这行root ALL=(ALL) ALL的下方加入一行:(newuser root ALL=(ALL) ALL):

保存重启系统生效
2.4.2 实验任务二:安装和配置JDK
2.4.2.1 步骤一:上传JDK安装包
通过文件上传工具将安装文件jdk-8u201-linux-x64.tar.gz上传到/opt/hadoop目录
这里使用的图形化界面,直接将文件拖入到虚拟机的桌面上:

[root@zmzaxg Desktop]# mkdir -p /opt/hadoop
[root@zmzaxg Desktop]# cd /opt/hadoop/
[root@zmzaxg hadoop]# cp /opt/hadoop/jdk-8u77-linux-x64.tar.gz ./

2.4.2.2 步骤二:解压安装JDK
执行以下命令创建安装目录:
mkdir /usr/java

执行以下命令解压JDK安装包
tar -zxf /opt/hadoop/jdk-8u201-linux-x64.tar.gz -C /usr/java
[root@zmzaxg hadoop]# tar -zxvf ./jdk-8u77-linux-x64.tar.gz -C /usr/java/
[root@zmzaxg hadoop]# ls

执行以下命令创建链接
[root@zmzaxg java]# cd /usr/java && ln -s /usr/java/jdk1.8.0_77 /usr/java/latest

2.4.2.3 步骤三:配置环境变量
新增或编辑vi /etc/profile.d/java.sh 文件,添加以下内容:
export JAVA_HOME=/usr/java/latest
export PATH=JAVAHOME/bin:PATH

2.4.2.4 步骤四:激活环境变量
执行以下命令激活环境变量:
source /etc/profile.d/java.sh

2.4.2.5 步骤五:验证安装结果
执行以下命令检查java版本信息,验证是否安装成功:
java -version

3 实验二:基础中间件的安装和配置
3.1 实验目的
完成本实验,您应该能够:
 掌握MySQL的安装和基本配置
 掌握Redis的安装和基本配置
 掌握kafka的安装和基本配置
3.2 实验要求
 熟悉常用Linux操作系统命令
 熟悉MySQL的安装和基本操作
 熟悉Redis的安装和基本操作
 熟悉kafka的安装和基本操作
3.3 实验环境
本实验所需资源环境如下表所示:
服务器 最低配置:双核CPU、8GB内存、100G硬盘
操作系统 CentOS-7-x86_64-Everything-1810
组件 MySQL、redis、jdk、zookeeper、kafka、gcc及其依赖包

3.4 试验过程
3.4.1 实验任务一:安装和配置MySQL
3.4.1.1 步骤一:删除系统自带的MariaDB:
执行以下命令删除系统自带MariaDB:
yum remove mariadb

查询已安装的MariaDB组件:
rpm -qa | grep mariadb

根据查询结果依次执行以下命令删除查询到的组件:
rpm -e --nodeps (查询到的组件名)

3.4.1.2 步骤二:安装依赖的组件
在线安装net-tools:
yum install -y net-tools

或者离线安装net-tools,将net-tools-2.0-0.24.20131004git.el7.x86_64.rpm上传到/opt目录,然后执行以下命令:
rpm -Uvh net-tools-2.0-0.24.20131004git.el7.x86_64.rpm --nodeps --force

3.4.1.3 步骤三:上传MySQL安装包
通过文件上传工具将安装文件mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar上传到/opt目录:

[root@zmzaxg opt]# cp /root/Desktop/mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar /opt/
[root@zmzaxg java]# cd /opt/
[root@zmzaxg opt]# ls

3.4.1.4 步骤四:解压MySQL安装包
执行以下命令解压MySQL安装包
cd /opt
tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar

3.4.1.5 步骤五:安装MySQL组件
执行以下命令安装MySQL相关组件:
rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
这里使用“”一行命令完成全部安装:
[root@zmzaxg mysql]# rpm -ivh mysql-community-

3.4.1.6 步骤六:起停数据库
查看MySQL是否启动:
service mysqld status

启动MySQL:
service mysqld start

停止MySQL:
service mysqld stop

重启MySQL:
service mysqld restart

3.4.1.7 步骤七:初始化root帐号密码
查看临时密码:
grep password /var/log/mysqld.log

登录数据库:mysql -p ,然后根据提示符输入临时密码

执行命令修改密码:
mysql> set password = password("Gzdsj_1234");

mysql_upgrade -u root -p Gzdsj1234

3.4.1.8 步骤八:设置允许远程连接
登录MySQL,执行以下命令:
mysql> GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY 'Gzdsj_1234' WITH GRANT OPTION;

mysql> flush privileges;

3.4.2 实验任务二:简单操作MySQL
3.4.2.1 步骤一:连接数据库
克隆一台机器出来,克隆好的机器开起来,给ip修改一下:

将原来的虚拟机也开机:

在3.4.2的虚拟机上打开终端:
[root@zmzaxg 桌面]# mysql -h 172.168.0.10 -P 3306 -u root -pGzdsj_1234
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 964
Server version: 5.7.25 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

3.4.2.2 步骤二:查看当前登录用户
mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

3.4.2.3 步骤三:查看数据库清单
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hive |
| mysql |
| performance_schema |
| scrapy |
| sys |
+--------------------+
6 rows in set (0.00 sec)

mysql>

3.4.2.4 步骤四:创建数据库
创建数据库:
mysql> create database gzdsj;
Query OK, 1 row affected (0.00 sec)

mysql>

查看创建结果:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| gzdsj |
| hive |
| mysql |
| performance_schema |
| scrapy |
| sys |
+--------------------+
7 rows in set (0.00 sec)

mysql>

3.4.2.5 步骤五:使用数据库、查看当前数据库
使用数据库:
mysql> use gzdsj
Database changed
mysql>

查看当前数据库:
mysql> select database();
+------------+
| database() |
+------------+
| gzdsj |
+------------+
1 row in set (0.00 sec)

mysql>

3.4.2.6 步骤六:创建一张表
mysql> create table t_file_info (
-> id varchar(128),
-> name varchar(256)
-> );
Query OK, 0 rows affected (0.04 sec)

mysql>

3.4.2.7 步骤七:查看数据库的表清单
mysql> show tables;
+-----------------+
| Tables_in_gzdsj |
+-----------------+
| t_file_info |
+-----------------+
1 row in set (0.00 sec)

mysql>

3.4.2.8 步骤八:查看表结构
mysql> desc t_file_info;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | varchar(128) | YES | | NULL | |
| name | varchar(256) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

mysql>

3.4.2.9 步骤九:插入一条数据
mysql> insert into t_file_info(id, name) values ('abc', 'test_file');
Query OK, 1 row affected (0.00 sec)

mysql>

3.4.2.10 步骤十:查询表数据
mysql> select * from t_file_info;
+------+-----------+
| id | name |
+------+-----------+
| abc | test_file |
+------+-----------+
1 row in set (0.00 sec)

mysql>

3.4.3 实验任务二:使用MySQL常用工具集
3.4.3.1 步骤一:修改帐号密码
这里换回第一台虚拟机(JDK):
[root@localhost opt]# mysqladmin -u root -poldpassword password 'newpassword'

3.4.3.1 步骤二:检查MySQL Server是否可用
[root@localhost opt]# mysqladmin -uroot -pGzdsj_1234 ping
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
mysqld is alive
[root@localhost opt]#

3.4.3.2 步骤三:查询服务器版本
[root@localhost opt]# mysqladmin -uroot -pGzdsj_1234 version
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
mysqladmin Ver 8.42 Distrib 5.7.26, for Linux on x86_64
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Server version 5.7.26
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/lib/mysql/mysql.sock
Uptime: 3 hours 18 min 10 sec

Threads: 2 Questions: 2848 Slow queries: 0 Opens: 277 Flush tables: 1 Open tables: 42 Queries per second avg: 0.239
[root@localhost opt]#

3.4.3.3 步骤四:检查服务器的当前状态
每个两秒查看一次服务器的状态,总共重复5次:
[root@localhost opt]# mysqladmin -uroot -pGzdsj_1234 -i 2 -c 5 status
Enter password:
Uptime: 10913 Threads: 2 Questions: 2826 Slow queries: 0 Opens: 277 Flush tables: 1 Open tables: 42 Queries per second avg: 0.258
Uptime: 10915 Threads: 2 Questions: 2827 Slow queries: 0 Opens: 277 Flush tables: 1 Open tables: 42 Queries per second avg: 0.259
Uptime: 10917 Threads: 2 Questions: 2828 Slow queries: 0 Opens: 277 Flush tables: 1 Open tables: 42 Queries per second avg: 0.259
Uptime: 10919 Threads: 2 Questions: 2829 Slow queries: 0 Opens: 277 Flush tables: 1 Open tables: 42 Queries per second avg: 0.259
Uptime: 10921 Threads: 2 Questions: 2830 Slow queries: 0 Opens: 277 Flush tables: 1 Open tables: 42 Queries per second avg: 0.259
[root@localhost opt]#

3.4.3.1 步骤五:查看执行的SQL语句信息
[root@localhost opt]# mysqladmin -uroot -pGzdsj_1234 processlist
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
+----+------+-----------+----+---------+-------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+----+---------+-------+----------+------------------+
| 5 | root | localhost | | Sleep | 11810 | | |
| 18 | root | localhost | | Query | 0 | starting | show processlist |
+----+------+-----------+----+---------+-------+----------+------------------+
[root@localhost opt]#

3.4.3.2 步骤六:管理数据库
创建数据库:
[root@localhost opt]# mysqladmin -uroot -pGzdsj_1234 create dbname

显示服务器上所有数据库:
[root@localhost opt]# mysqlshow -uroot -pGzdsj_1234
mysqlshow: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Databases |
+--------------------+
| information_schema |
| gzdsj |
| mysql |
| performance_schema |
| sys |
+--------------------+
[root@localhost opt]#

显示数据库的表清单:
[root@localhost opt]# mysqlshow -uroot -pGzdsj_1234 mysql
mysqlshow: [Warning] Using a password on the command line interface can be insecure.
Database: mysql
+---------------------------+
| Tables |
+---------------------------+
| columns_priv |
| db |
| engine_cost |
| event |
| func |
| general_log |
| gtid_executed |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table_stats |
| ndb_binlog_index |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| server_cost |
| servers |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+---------------------------+
[root@localhost opt]#

统计数据库中各表的列数和行数:
[root@localhost opt]# mysqlshow -uroot -pGzdsj_1234 mysql -v -v
mysqlshow: [Warning] Using a password on the command line interface can be insecure.
Database: mysql
+---------------------------+----------+------------+
| Tables | Columns | Total Rows |
+---------------------------+----------+------------+
| columns_priv | 7 | 0 |
| db | 22 | 2 |
| engine_cost | 6 | 2 |
| event | 22 | 0 |
| func | 4 | 0 |
| general_log | 6 | 0 |
| gtid_executed | 3 | 0 |
| help_category | 4 | 41 |
| help_keyword | 2 | 699 |
| help_relation | 2 | 1413 |
| help_topic | 6 | 643 |
| innodb_index_stats | 8 | 7 |
| innodb_table_stats | 6 | 2 |
| ndb_binlog_index | 12 | 0 |
| plugin | 2 | 1 |
| proc | 20 | 48 |
| procs_priv | 8 | 0 |
| proxies_priv | 7 | 1 |
| server_cost | 4 | 6 |
| servers | 9 | 0 |
| slave_master_info | 25 | 0 |
| slave_relay_log_info | 9 | 0 |
| slave_worker_info | 13 | 0 |
| slow_log | 12 | 0 |
| tables_priv | 8 | 2 |
| time_zone | 2 | 0 |
| time_zone_leap_second | 2 | 0 |
| time_zone_name | 2 | 0 |
| time_zone_transition | 3 | 0 |
| time_zone_transition_type | 5 | 0 |
| user | 45 | 4 |
+---------------------------+----------+------------+
31 rows in set.

[root@localhost opt]#

3.4.3.3 步骤七:关闭MySQL服务
[root@localhost opt]# mysqladmin -uroot -pGzdsj_1234 shutdown

3.4.4 实验任务四:备份与恢复MySQL数据库
3.4.4.1 步骤一:备份数据库
备份数据库:
[root@master2 usr]# mysqldump -uroot -pGzdsj_1234 gzdsj > /usr/gzdsj.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@master2 usr]#

这里报错是因为前面已经关闭了mysql服务,再开启mysql服务即可:
[root@zmzaxg 桌面]# service mysqld start

查看备份文件:
[root@master2 usr]# more /usr/gzdsj.sql
-- MySQL dump 10.13 Distrib 5.7.25, for Linux (x86_64)

-- Host: localhost Database: gzdsj


-- Server version 5.7.25

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT /;
/
!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS /;
/
!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION /;
/
!40101 SET NAMES utf8 /;
/
!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE /;
/
!40103 SET TIME_ZONE='+00:00' /;
/
!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 /;
/
!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table t_file_info

DROP TABLE IF EXISTS t_file_info;
/*!40101 SET @saved_cs_client = @@character_set_client /;
/
!40101 SET character_set_client = utf8 */;
CREATE TABLE t_file_info (
id varchar(128) DEFAULT NULL,
name varchar(256) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table t_file_info

LOCK TABLES t_file_info WRITE;
/*!40000 ALTER TABLE t_file_info DISABLE KEYS /;
INSERT INTO t_file_info VALUES ('abc','test_file');
/
!40000 ALTER TABLE t_file_info ENABLE KEYS /;
UNLOCK TABLES;
/
!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE /;
/
!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS /;
/
!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS /;
/
!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT /;
/
!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS /;
/
!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION /;
/
!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2019-03-03 11:49:12
[root@master2 usr]#

3.4.4.2 步骤二:重建数据库
登录数据库:
[root@master2 usr]# mysql -u root -pGzdsj_1234
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 969
Server version: 5.7.25 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

删除并重建数据库:
mysql> drop database gzdsj;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hive |
| mysql |
| performance_schema |
| scrapy |
| sys |
+--------------------+
6 rows in set (0.00 sec)

mysql> create database gzdsj;
Query OK, 1 row affected (0.00 sec)

mysql>

检查数据库为空并退出:
mysql> use gzdsj;
Database changed

mysql> show tables;
Empty set (0.00 sec)

mysql> quit
Bye
[root@master2 usr]#

3.4.4.3 步骤三:从备份文件恢复数据库
恢复数据库:
[root@master2 usr]# mysql -uroot -pGzdsj_1234 gzdsj < /usr/gzdsj.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@master2 usr]#

检查恢复结果:
[root@master2 usr]# mysql -u root -pGzdsj_1234
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 971
Server version: 5.7.25 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use gzdsj;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> show tables;
+-----------------+
| Tables_in_gzdsj |
+-----------------+
| t_file_info |
+-----------------+
1 row in set (0.00 sec)

mysql> select * from t_file_info;
+------+-----------+
| id | name |
+------+-----------+
| abc | test_file |
+------+-----------+
1 row in set (0.01 sec)

mysql>

3.4.5 实验任务五:安装和配置Redis
3.4.5.1 步骤一:上传gcc安装包
通过文件上传工具将gcc离线安装文件gcc.tar.gz上传到/opt目录

[root@zmzaxg 桌面]# cd /opt/

3.4.5.2 步骤二:解压gcc安装包
[root@localhost mysql]# cd /opt
[root@localhost opt]# tar -zxvf gcc.tar.gz -C ./
gcc/
gcc/cpp-4.8.5-36.el7.x86_64.rpm
gcc/gcc-4.8.5-36.el7.x86_64.rpm
gcc/gcc-c++-4.8.5-36.el7.x86_64.rpm
gcc/glibc-2.17-222.el7.x86_64.rpm
gcc/glibc-common-2.17-222.el7.x86_64.rpm
gcc/glibc-devel-2.17-222.el7.x86_64.rpm
gcc/glibc-headers-2.17-222.el7.x86_64.rpm
gcc/kernel-3.10.0-862.11.6.el7.x86_64.rpm
gcc/kernel-devel-3.10.0-862.11.6.el7.x86_64.rpm
gcc/kernel-headers-3.10.0-862.11.6.el7.x86_64.rpm
gcc/kernel-tools-3.10.0-862.11.6.el7.x86_64.rpm
gcc/kernel-tools-libs-3.10.0-862.11.6.el7.x86_64.rpm
gcc/kexec-tools-2.0.15-13.el7.x86_64.rpm
gcc/libgcc-4.8.5-36.el7.x86_64.rpm
gcc/libgomp-4.8.5-36.el7.x86_64.rpm
gcc/libmpc-1.0.1-3.el7.x86_64.rpm
gcc/libstdc++-4.8.5-36.el7.x86_64.rpm
gcc/libstdc++-devel-4.8.5-36.el7.x86_64.rpm
gcc/mpfr-3.1.1-4.el7.x86_64.rpm
[root@localhost opt]#

3.4.5.3 步骤三:RPM离线安装gcc以及依赖的包:
[root@localhost opt]# cd /opt/gcc
[root@localhost gcc]# rpm -Uvh *.rpm --nodeps --force
Preparing... ################################# [100%]
Updating / installing...
1:libgcc-4.8.5-36.el7 ################################# [ 3%]
2:glibc-common-2.17-222.el7 ################################# [ 7%]
3:glibc-2.17-222.el7 ################################# [ 10%]
4:mpfr-3.1.1-4.el7 ################################# [ 14%]
5:libmpc-1.0.1-3.el7 ################################# [ 17%]
6:libstdc++-4.8.5-36.el7 ################################# [ 21%]
7:libstdc++-devel-4.8.5-36.el7 ################################# [ 24%]
8:cpp-4.8.5-36.el7 ################################# [ 28%]
9:kernel-tools-libs-3.10.0-862.11.6################################# [ 31%]
10:libgomp-4.8.5-36.el7 ################################# [ 34%]
11:kernel-headers-3.10.0-862.11.6.el################################# [ 38%]
12:glibc-headers-2.17-222.el7 ################################# [ 41%]
13:glibc-devel-2.17-222.el7 ################################# [ 45%]
14:gcc-4.8.5-36.el7 ################################# [ 48%]
15:gcc-c++-4.8.5-36.el7 ################################# [ 52%]
16:kernel-tools-3.10.0-862.11.6.el7 ################################# [ 55%]
17:kexec-tools-2.0.15-13.el7 ################################# [ 59%]
18:kernel-devel-3.10.0-862.11.6.el7 ################################# [ 62%]
19:kernel-3.10.0-862.11.6.el7 ################################# [ 66%]
Cleaning up / removing...
20:kernel-3.10.0-957.12.2.el7 ################################# [ 69%]
21:kernel-3.10.0-957.el7 ################################# [ 72%]
22:kernel-tools-3.10.0-957.12.2.el7 ################################# [ 76%]
23:libstdc++-4.8.5-36.el7_6.2 ################################# [ 79%]
24:kernel-tools-libs-3.10.0-957.12.2################################# [ 83%]
25:libgomp-4.8.5-36.el7_6.2 ################################# [ 86%]
26:kexec-tools-2.0.15-21.el7_6.3 ################################# [ 90%]
27:glibc-common-2.17-260.el7_6.5 ################################# [ 93%]
28:glibc-2.17-260.el7_6.5 ################################# [ 97%]
29:libgcc-4.8.5-36.el7_6.2 ################################# [100%]

[root@localhost gcc]#

3.4.5.4 步骤四:上传redis安装包
通过文件上传工具将安装文件redis-5.0.3.tar.gz上传到/opt目录

[root@zmzaxg gcc]# cd /opt
[root@zmzaxg opt]# cp /root/桌面/redis-4.0.8.tar.gz ./
3.4.5.5 步骤五:解压安装包并移动到redis目录
执行以下命令解压JDK安装包:
tar -zxvf /opt/redis-5.0.3.tar.gz -C /usr/local
[root@zmzaxg opt]# tar -zxvf redis-4.0.8.tar.gz -C /usr/local

执行以下命令移动到redis目录:
cd /usr/local/
mv redis-5.0.3 redis

3.4.5.6 步骤四:编译安装redis
进入redis解压目录:
cd /usr/local/redis
[root@zmzaxg opt]# cd redis-4.0.8/

执行以下命令编译redis:
make MALLOC=libc

执行以下命令安装redis:
cd src
[root@zmzaxg redis-4.0.8]# cd src

[root@zmzaxg src]# make install PREFIX=/usr/local/redis
[root@zmzaxg src]# make install

[root@zmzaxg redis]# cd /usr/local
[root@zmzaxg local]# mkdir -p /usr/local/redis/bin
[root@zmzaxg local]# cd /opt/redis-4.0.8/
[root@zmzaxg redis-4.0.8]# cd src
[root@zmzaxg src]# mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-aof redis-cli redis-server redis-sentinel /usr/local/redis/bin

3.4.5.7 步骤五:修改redis配置
将配置文件移动到etc目录
[root@zmzaxg local]# mkdir -p /usr/local/redis/etc
[root@zmzaxg local]# cd /opt/redis-4.0.8/
[root@zmzaxg redis-4.0.8]# mv ./redis.conf /usr/local/redis/etc

修改配置文件,以守护县城的形式运行:
vi /usr/local/redis/etc/redis.conf

将bind 127.0.0.1注释掉,表示允许通过所有接口地址访问

将文件中的daemonize 改为yes,表示允许在后台运行

将文件中requirepass配置开始,并将后面的字符串设置为需要设置的密码,这里我们设置卫gzdsj1234

3.4.5.8 步骤六:启动redis
执行以下命令启动redis:
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

3.4.6 实验任务六:使用Redis
3.4.6.1 步骤一:使用redis-cli连接redis
执行以下命令连接redis:
/usr/local/redis/bin/redis-cli

连接之后出现以下提示符,输入认证信息登录redis:
127.0.0.1:6379> auth gzdsj1234
OK

3.4.6.2 步骤二:简单使用redis数据结构
设置key的value:
127.0.0.1:6379> set key1 value1
OK

获取key的value:
127.0.0.1:6379> get key1
"value1"

删除key:
127.0.0.1:6379> del key1
(integer) 1

从List左边添加一个或多个元素:
127.0.0.1:6379> lpush listkey1 value1 value2
(integer) 2

从List左边出队一个元素:
127.0.0.1:6379> lpop listkey1
"value2"

设置hash里面的一个字段值:
127.0.0.1:6379> hset hashkey1 subkey1 value1
(integer) 1

获取hash里面字段值:
127.0.0.1:6379> hget hashkey1 subkey1
"value1"

添加一个或多个元素到集合:
127.0.0.1:6379> sadd setkey1 value1 value2
(integer) 2

获取集合的所有元素:
127.0.0.1:6379> smembers setkey1

  1. "value1"
  2. "value2"

从集合删除一个或多个元素:
127.0.0.1:6379> srem setkey1 value1
(integer) 1

3.4.7 实验任务七:维护Redis
3.4.7.1 步骤一:简单配置Redis
配置文件路径为:
/usr/local/redis/etc/redis.conf

基本配置说明:
bind 127.0.0.1 # 绑定一个外部访问的地址,如果注释掉则绑定所有地址
protected-mode yes # 是否开启保护模式
port 6379 # 端口号
daemonize yes # 是否以daemon的方式运行
requirepass gzdsj1234 # 需要密码访问
appendonly no #是否开启AOF持久化模式
appendfilename "appendonly.aof" # AOF存储文件名

3.4.7.2 步骤二:使用命令维护redis
查看服务器信息:
127.0.0.1:6379> info

Server

redis_version:5.0.3
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:73fb754199ecfef3
redis_mode:standalone
os:Linux 3.10.0-957.5.1.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:4.8.5
process_id:11946
run_id:cc3100e8dd4a83306c272572c9ce4e53f6637be9
tcp_port:6379
uptime_in_seconds:608
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:8136202
executable:/usr/local/redis/bin/redis-server
config_file:/usr/local/redis/etc/redis.conf

Clients

connected_clients:1
client_recent_max_input_buffer:2
client_recent_max_output_buffer:0
blocked_clients:0

Memory

used_memory:912088
used_memory_human:890.71K
used_memory_rss:2236416
used_memory_rss_human:2.13M
used_memory_peak:912088
used_memory_peak_human:890.71K
used_memory_peak_perc:100.00%
used_memory_overhead:911574
used_memory_startup:861880
used_memory_dataset:514
used_memory_dataset_perc:1.02%
allocator_allocated:878264
allocator_active:2198528
allocator_resident:2198528
total_system_memory:16657154048
total_system_memory_human:15.51G
used_memory_lua:37888
used_memory_lua_human:37.00K
used_memory_scripts:0
used_memory_scripts_human:0B
number_of_cached_scripts:0
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
allocator_frag_ratio:2.50
allocator_frag_bytes:1320264
allocator_rss_ratio:1.00
allocator_rss_bytes:0
rss_overhead_ratio:1.02
rss_overhead_bytes:37888
mem_fragmentation_ratio:2.55
mem_fragmentation_bytes:1358152
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_clients_slaves:0
mem_clients_normal:49694
mem_aof_buffer:0
mem_allocator:libc
active_defrag_running:0
lazyfree_pending_objects:0

Persistence

loading:0
rdb_changes_since_last_save:2
rdb_bgsave_in_progress:0
rdb_last_save_time:1551639696
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
rdb_last_cow_size:122880
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
aof_last_cow_size:0

Stats

total_connections_received:1
total_commands_processed:10
instantaneous_ops_per_sec:0
total_net_input_bytes:251
total_net_output_bytes:186
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
expired_stale_perc:0.00
expired_time_cap_reached_count:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:262
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0

Replication

role:master
connected_slaves:0
master_replid:b4034ad9b96bc748a4939d47b87aad782509114d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

CPU

used_cpu_sys:0.447211
used_cpu_user:0.274063
used_cpu_sys_children:0.001017
used_cpu_user_children:0.001017

Cluster

cluster_enabled:0

Keyspace

127.0.0.1:6379>

异步保存数据到磁盘:
127.0.0.1:6379> bgsave
Background saving started
127.0.0.1:6379>

获取上一次保存时间判断保存操作是否成功:
127.0.0.1:6379> lastsave
(integer) 1551639523
127.0.0.1:6379>

同步保存数据到磁盘:
127.0.0.1:6379> save
OK
127.0.0.1:6379>

查看keys数量:
127.0.0.1:6379> dbsize
(integer) 1
127.0.0.1:6379>

清空当前数据库:
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379>

清空所有数据库:
127.0.0.1:6379> flushall
OK
127.0.0.1:6379>

3.4.8 实验任务八:安装和配置zookeeper(伪集群模式)
3.4.8.1 步骤一:上传zookeeper安装包
通过文件上传工具将安装文件zookeeper-3.4.14.tar.gz上传到/opt目录

[root@zmzaxg src]# cd /opt
[root@zmzaxg opt]# cp /root/桌面/zookeeper-3.4.14.tar.gz ./
3.4.8.2 步骤二:解压安装三个节点
执行以下命令创建安装目录:
mkdir /usr/zookeeper

执行以下命令解压JDK安装包
tar -zxf /opt/zookeeper-3.4.14.tar.gz -C /usr/zookeeper

将/usr/zookeeper/zookeeper-3.4.14复制成三份:
cd /usr/zookeeper
cp -R ./zookeeper-3.4.14 ./zookeeper1
cp -R ./zookeeper-3.4.14 ./zookeeper2
cp -R ./zookeeper-3.4.14 ./zookeeper3

3.4.8.3 步骤三:修改zookeeper1节点的配置文件
编辑配置文件:
cd /usr/zookeeper/zookeeper1/conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg

修改dataDir配置:
dataDir=/usr/zookeeper/zookeeper1/data

添加集群配置:
server.1=172.168.0.10:2888:3888
server.2=172.168.0.10:4888:5888
server.3=172.168.0.10:6888:7888

3.4.8.4 步骤四:配置zookeeper1节点的server id
创建data目录:
mkdir /usr/zookeeper/zookeeper1/data

配置server id:
cd /usr/zookeeper/zookeeper1/data
echo '1' > myid

3.4.8.5 步骤三:修改zookeeper2节点的配置文件
编辑配置文件:
cd /usr/zookeeper/zookeeper2/conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg

修改clientPort配置:
clientPort=3181

修改dataDir配置:
dataDir=/usr/zookeeper/zookeeper2/data

添加集群配置:
server.1=172.168.0.10:2888:3888
server.2=172.168.0.10:4888:5888
server.3=172.168.0.10:6888:7888

3.4.8.6 步骤四:配置zookeeper2节点的server id
创建data目录:
mkdir /usr/zookeeper/zookeeper2/data

配置server id:
cd /usr/zookeeper/zookeeper2/data
echo '2' > myid

3.4.8.7 步骤三:修改zookeeper3节点的配置文件
编辑配置文件:
cd /usr/zookeeper/zookeeper3/conf
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg

修改clientPort配置:
clientPort=4181

修改dataDir配置:
dataDir=/usr/zookeeper/zookeeper3/data

添加集群配置:
server.1=172.168.0.10:2888:3888
server.2=172.168.0.10:4888:5888
server.3=172.168.0.10:6888:7888

3.4.8.8 步骤四:配置zookeeper3节点的server id
创建data目录:
mkdir /usr/zookeeper/zookeeper3/data

配置server id:
cd /usr/zookeeper/zookeeper3/data
echo '3' > myid

3.4.8.9 步骤五:启动zookeeper
执行以下命令启动zookeeper集群:
/usr/zookeeper/zookeeper1/bin/zkServer.sh start
/usr/zookeeper/zookeeper2/bin/zkServer.sh start
/usr/zookeeper/zookeeper3/bin/zkServer.sh start

3.4.8.10 步骤五:验证安装结果
连接zookeeper:
cd /usr/zookeeper/zookeeper1/bin
./zkCli.sh -server 172.168.0.10:2181

验证zookeeper基本操作:
[zk: 172.16.100.227:2181(CONNECTED) 1] create /zktest mydata
Created /zktest

[zk: 172.16.100.227:2181(CONNECTED) 3] get /zktest
mydata
cZxid = 0x1000000bd
ctime = Sat Mar 02 22:06:17 EST 2019
mZxid = 0x1000000bd
mtime = Sat Mar 02 22:06:17 EST 2019
pZxid = 0x1000000bd
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0

3.4.9 实验任务九:安装和配置kafka
3.4.9.1 步骤一:上传kafka安装包
通过文件上传工具将安装文件kafka_2.12-2.3.0.tgz上传到/opt目录

[root@zmzaxg opt]# cp /root/桌面/kafka_2.11-1.1.1.tgz ./
3.4.9.2 步骤二:解压安装kafka
执行以下命令解压JDK安装包
[root@master1 opt]# tar -zxf kafka_2.11-1.1.1.tgz -C /usr

cd /usr
[root@zmzaxg usr]# mv kafka_2.11-1.1.1 kafka

3.4.9.3 步骤三:修改节点1的配置
编辑配置文件:
cd /usr/kafka/config
vi server.properties

修改以下配置:
listeners=PLAINTEXT://172.168.0.10

zookeeper.connect=172.168.0.10:2181, 172.168.0.10:3181, 172.168.0.10:4181

3.4.9.4 步骤四:新增并修改节点2的配置
新增节点2配置:
cd /usr/kafka/config
cp server.properties server-1.properties

编辑配置文件:
vi server-1.properties

修改以下配置:
broker.id=1

listeners=PLAINTEXT://172.168.0.10

log.dirs=/tmp/kafka-logs-1

zookeeper.connect=172.168.0.10:2181,172.168.0.10:3181,172.168.0.10:4181

3.4.9.5 步骤五:新增并修改节点3的配置
新增节点3配置:
cd /usr/kafka/config
cp server.properties server-2.properties

编辑配置文件:
vi server-2.properties

修改以下配置:
broker.id=2

listeners=PLAINTEXT://172.168.0.10

log.dirs=/tmp/kafka-logs-2

zookeeper.connect=172.168.0.10:2181,172.168.0.10:3181,172.168.0.10:4181

3.4.9.6 步骤六:启动kafka
分别执行以下命令启动各个节点:
cd /usr/kafka/bin
sh ./kafka-server-start.sh -daemon ../config/server.properties &
sh ./kafka-server-start.sh -daemon ../config/server-1.properties &
sh ./kafka-server-start.sh -daemon ../config/server-2.properties &

3.4.9.7 步骤七:验证安装结果
创建一个topic:
cd /usr/kafka/bin
./kafka-topics.sh --create --bootstrap-server 10.20.1.245:9092,10.20.1.245:9093,10.20.1.245:9094 --replication-factor 3 --partitions 1 --topic gzdjs-topic
[root@zmzaxg bin]# ./kafka-topics.sh --create --zookeeper 172.168.0.10:2181,172.168.0.10:3181,172.168.0.10:4181 --replication-factor 3 --partitions 1 --topic gzdjs-topic-1
查看topic信息:
./kafka-topics.sh --describe --bootstrap-server 10.20.1.245:9092,10.20.1.245:9093,10.20.1.245:9094 --topic gzdjs-topic
[root@zmzaxg bin]# ./kafka-topics.sh --describe --zookeeper 172.168.0.10:2181 --topic gzdjs-topic-1

3.4.9.8 步骤八:验证发送消息
执行以下发送消息:
cd /usr/kafka/bin
./kafka-console-producer.sh --broker-list 172.168.0.10:9092, 172.168.0.10:9093, 172.168.0.10:9094 --topic gzdsj-topic
[root@zmzaxg bin]# ./kafka-console-producer.sh --broker-list 172.168.0.10:9092, 172.168.0.10:9093, .168.0.10:9094 --topic gzdsj-topic-1
执行完进入发送消息命令行,输入需要发送的消息即可。

3.4.9.9 步骤八:验证接收消息
执行以下发送消息:
cd /usr/kafka/bin
./kafka-console-consumer.sh --bootstrap-server 172.168.0.10:9092, 172.168.0.10:9093, 172.168.0.10:9094 --from-beginning --topic gzdsj-topic
[root@zmzaxg bin]# ./kafka-console-consumer.sh --bootstrap-server 172.168.0.10:9092, 172.168.0.10:9093, 172.168.0.10:9094 --from-beginning --topic gzdsj-topic-1
执行完可以看到控制台接收到之前发送的消息。

4 实验三:大数据集群环境安装、配置与基本管理
4.1 实验目的
完成本实验,您应该能够:
 掌握Hadoop的安装部署
 掌握Hive的安装部署
4.2 实验要求
 熟悉常用Linux操作系统命令
4.3 实验环境
本实验所需资源环境如表1-1所示。
表1-1 资源环境
服务器 最低配置:双核CPU、8GB内存、100G硬盘
操作系统 CentOS-7-x86_64-Everything-1810
大数据平台 hadoop-2.7.7、Hive-2.3.4
服务和组件 jdk1.8.0_201、Hadoop-2.7.7、Hive-2.3.4、MySQL 5.7.25

4.4 试验过程
4.4.1 实验任务一:部署前准备
4.4.1.1 步骤一:禁用防火墙
停止防火墙:
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]#

禁用防火墙:
[root@localhost ~]# 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@localhost ~]#

4.4.1.2 步骤二:禁用SELinux
禁用SELinux:
[root@localhost ~]# setenforce 0
[root@localhost ~]# sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

4.4.1.3 步骤三:安装辅助工具
安装同步工具:
[root@localhost ~]# yum install -y rsync
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile

  • base: mirror.jdcloud.com
  • extras: mirrors.163.com
  • updates: mirrors.aliyun.com
    base | 3.6 kB 00:00:00
    extras | 3.4 kB 00:00:00
    updates | 3.4 kB 00:00:00
    Resolving Dependencies
    --> Running transaction check
    ---> Package rsync.x86_64 0:3.1.2-4.el7 will be installed
    --> Finished Dependency Resolution

Dependencies Resolved

===========================================================================================================
Package Arch Version Repository Size

Installing:
rsync x86_64 3.1.2-4.el7 base 403 k

Transaction Summary

Install 1 Package

Total download size: 403 k
Installed size: 815 k
Downloading packages:
rsync-3.1.2-4.el7.x86_64.rpm | 403 kB 00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : rsync-3.1.2-4.el7.x86_64 1/1
Verifying : rsync-3.1.2-4.el7.x86_64 1/1

Installed:
rsync.x86_64 0:3.1.2-4.el7

Complete!
[root@localhost ~]#

4.4.1.4 步骤四:安装节点及目录规划
节点规划:
节点类型 IP地址 主机名
控制节点 172.16.100.226 master1
172.16.100.227 master2
数据节点 172.16.100.228 slave1
172.16.100.229 slave2
客户端节点 172.16.100.230 client
将主虚拟机的主机名改为master1:

修改完成后关闭虚拟机:

克隆虚拟机(4台),一共5台

第二台开始可以选择现有快照创建克隆:

最终的5台虚拟机:
可以从后面往上逐台开机依据hosts文件设置每台虚拟机的ip
为每台虚拟机设置好独立的hostname和ip,并确保同时能够ping通外部网络后,到windows主机上打开目录“C:\Windows\System32\drivers\etc”,将hosts文件复制到桌面,打开编辑:

在最后面添加:

保存文件,将这hosts文件再拉回etc目录里面替换掉原来的文件
然后打开xshell,在创建会话,只需要填写一个名称就可以直接确定连接(更快速方便):

目录规划:
 安装包上传目录:/opt/hadoop
 Java安装目录:/usr/java/latest(前面已安装)
 Hadoop安装目录:/usr/hadoop/latest
 Hive安装目录:/usr/hive/latest
 Spark安装目录:/usr/spark/latest

4.4.1.5 步骤五:安装包及同步环境准备
将已下载安装包上传到master1节点的/opt/hadoop目录中;

配置并启动master1节点上的rsync服务:
vi /etc/rsyncd.conf

添加以下配置:
[packages]
path = /opt/hadoop/
comment = hadoop install packages
[hadoop-config]
path = /usr/hadoop/latest/etc/hadoop/
comment = hadoop config files

启动rsync服务:
rsync --daemon
echo “/usr/sbin/rsync --daemon” >> /etc/rc.local #开机自动启动

在除master1以外的节点上执行rsync同步命令,完成安装包的拷贝
mkdir /opt/hadoop
rsync -r master1::packages /opt/hadoop/

4.4.1.6 步骤六:配置主节点到其它节点的免认证登陆
在master1节点上生成相关密钥及证书
ssh-keygen -t rsa // 连续三次回车,即默认即可生成有效的证书及密钥

复杂公钥及授权,以下命令在除master1以外的其它节点上执行
scp root@master1:~/.ssh/id_rsa.pub ~

cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

4.4.2 实验任务二:安装和配置Hadoop
4.4.2.1 步骤一:解压安装Hadoop
执行以下命令创建安装目录:
mkdir /usr/hadoop

执行以下命令解压Hadoop安装包
[root@master1 hadoop]# tar -zxf /opt/hadoop/hadoop-2.7.1.tar.gz -C /usr/hadoop

执行以下命令创建链接
cd /usr/hadoop/
[root@master1 hadoop]# ln -s hadoop-2.7.1 /usr/hadoop/latest

4.4.2.2 步骤二:配置环境变量
新增或编辑vi /etc/profile.d/hadoop.sh 文件,添加以下内容:
export HADOOP_HOME=/usr/hadoop/latest
export PATH=HADOOPHOME/bin:HADOOP_HOME/sbin:$PATH
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_PID_DIR=/var/hadoop
export HADOOP_LOG_DIR=/var/hadoop/logs

4.4.2.3 步骤三:激活环境变量
执行以下命令激活环境变量:
source /etc/profile.d/hadoop.sh

4.4.2.4 步骤四:准备数据目录
执行以下命令,准备数据目录:
mkdir /var/hadoop
mkdir /var/hadoop/namenode
mkdir /var/hadoop/disk1
mkdir /var/hadoop/disk2
mkdir /var/hadoop/tmp
mkdir /var/hadoop/logs

4.4.2.5 步骤五:修改master1的配置文件
执行以下命令新建/编辑core-site.xml文件:
vi /usr/hadoop/latest/etc/hadoop/core-site.xml

文件之间添加以下配置:

fs.defaultFS
hdfs://master1


hadoop.tmp.dir
/var/hadoop/tmp


hadoop.proxyuser.root.groups



hadoop.proxyuser.root.hosts

执行以下命令新建/编辑hdfs-site.xml文件:
vi /usr/hadoop/latest/etc/hadoop/hdfs-site.xml

文件中添加以下配置:

dfs.namenode.name.dir
/var/hadoop/namenode


dfs.namenode.handler.count
20


dfs.datanode.data.dir
/var/hadoop/disk1,/var/hadoop/disk2

执行以下命令新建/编辑yarn-site.xml文件:
vi /usr/hadoop/latest/etc/hadoop/yarn-site.xml

文件中添加以下配置:

yarn.resourcemanager.hostname
master1


yarn.nodemanager.aux-services
mapreduce_shuffle

执行以下命令编辑mapred-site.xml文件:
cd /usr/hadoop/latest/etc/hadoop
cp mapred-site.xml.template mapred-site.xml
vi mapred-site.xml

文件中添加以下配置:

mapreduce.framework.name
yarn

4.4.2.6 步骤六:将配置同步到其他节点
登录除master1以外的节点,执行以下命令同步配置文件:
rsync -r master1::hadoop-config /usr/hadoop/latest/etc/hadoop/
上面使用了xshell给每台虚拟机同步输入和修改了配置,就不用同步,如果是只在master1虚拟机上操作就需要分发同步一下
4.4.2.7 步骤七:格式化NameNode
在master1上执行格式化命令:
hdfs namenode -format

4.4.2.8 步骤八:起停Hadoop
在master1上启动NameNode及ResourceManager和WebAppProxy
hadoop-daemon.sh --config $HADOOP_CONF_DIR start namenode
yarn-daemon.sh --config $HADOOP_CONF_DIR start resourcemanager
yarn-daemon.sh --config $HADOOP_CONF_DIR start proxyserver

在master1上停止NameNode及ResourceManager和WebAppProxy
hadoop-daemon.sh --config $HADOOP_CONF_DIR stop namenode
yarn-daemon.sh --config $HADOOP_CONF_DIR stop resourcemanager
yarn-daemon.sh --config $HADOOP_CONF_DIR stop proxyserver

在master2上启动MapReduce History Server
mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR start historyserver

在master2上停止MapReduce History Server
mr-jobhistory-daemon.sh --config $HADOOP_CONF_DIR stop historyserver

在除client以外的节点上启动DataNode及NodeManager
hadoop-daemon.sh --config $HADOOP_CONF_DIR start datanode
yarn-daemon.sh --config $HADOOP_CONF_DIR start nodemanager

在除client以外的节点上停止DataNode及NodeManager
hadoop-daemon.sh --config $HADOOP_CONF_DIR stop datanode
yarn-daemon.sh --config $HADOOP_CONF_DIR stop nodemanager

4.4.2.9 步骤九:验证安装结果

验证HDFS管理界面:http://master1:50070

验证RM管理界面:http://master1:8088

验证HistoryServer:http://master2:19888

验证MapReduce
hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/root
hdfs dfs -put $HADOOP_CONF_DIR input
yarn jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar grep input output 'dfs[a-z.]+'

查看运行结果(http://master1:50070/explorer.html#/user/root/output):

查看任务执行过程(http://master1:8088)

4.4.3 实验任务三:安装和配置Hive
4.4.3.1 步骤一:解压安装Hive
执行以下命令创建安装目录:
mkdir /usr/hive

执行以下命令解压Hive安装包

[root@master1 hive]# tar -zxf /opt/hadoop/apache-hive-2.3.4-bin.tar.gz -C /usr/hive

执行以下命令创建链接
[root@master1 hadoop]# cd /usr/hive/
[root@master1 hive]# ln -s apache-hive-2.3.4-bin latest

4.4.3.2 步骤二:配置环境变量
新增vi /etc/profile.d/hive.sh 文件,添加以下内容:
export HIVE_HOME=/usr/hive/latest
export PATH=HIVEHOME/bin:PATH
export HCAT_LOG_DIR=/var/hadoop/logs
export HCAT_PID_DIR=/var/hadoop
alias beeline="/usr/hive/latest/bin/beeline -u jdbc:hive2://master1 -n root"

4.4.3.3 步骤三:激活环境变量
执行以下命令激活环境变量:
source /etc/profile.d/hive.sh

4.4.3.4 步骤四:修改master1的配置文件
执行以下命令编辑rsyncd.conf文件:
vi /etc/rsyncd.conf

在文件中添加以下配置:
[hive-config]
path = /usr/hive/latest/conf
comment = hive config files

进入mysql,创建数据库:
mysql> create database hive;

执行以下命令编辑hive-site.xml文件:
vi /usr/hive/latest/conf/hive-site.xml

在文件中添加以下配置:


hive.server2.thrift.bind.host
0.0.0.0>


hive.metastore.schema.verification
false


hive.server2.thrift.client.user
root


javax.jdo.option.ConnectionURL
jdbc:mysql://localhost/hive?useUnicode=true&characterEncoding=UTF8


javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver


javax.jdo.option.ConnectionUserName
root


javax.jdo.option.ConnectionPassword
Gzdsj_1234

4.4.3.5 步骤五:将配置同步到其他节点
登录除master1以外的节点,执行以下命令同步配置文件:
[root@master2 hadoop]# rsync -r master1:/usr/hive/apache-hive-2.3.4-bin/* /usr/hive/apache-hive-2.3.4-bin
root@master1's password: [master1的密码]

[root@slave2 bin]# rsync -r master1:/etc/profile.d/hive.sh /etc/profile.d/hive.sh
root@master1's password:
[root@slave2 bin]# source /etc/profile.d/hive.sh

[root@slave2 latest]# cd /usr/hive/
[root@slave2 hive]# rm -rf latest
[root@slave2 hive]# ls

[root@slave2 hive]# ln -s apache-hive-2.3.4-bin latest

[root@slave2 hive]# rsync -r master1:/usr/hive/latest/conf/* /usr/hive/latest/conf

4.4.3.6 步骤六:初始化Hive仓库
创建必要的目录并设置权限:
这里记得要先将hadoop集群启动

这边直接在每台虚拟机上都安装操作
hdfs dfs -mkdir /tmp
文件存在就忽略

hdfs dfs -chmod a+x /tmp

hdfs dfs -mkdir -p /user/hive/warehouse

hdfs dfs -chmod a+x /user/hive/warehouse

将MySQL驱动包防止到Hive的lib目录:
[root@master1 hive]# cd /opt/hadoop/

上传mysql的JDB连接的jar包:

然后在其他虚拟机(除了master1)输入:
[root@master2 hadoop]# rsync -r master1:/opt/hadoop/* /opt/hadoop/
root@master1's password:[输入master1虚拟机的密码]

然后再全部虚拟机上输入:
[root@master1 hadoop]# cp /opt/hadoop/mysql-connector-java-5.1.45-bin.jar $HIVE_HOME/lib

在每台虚拟机初始化元数据
这里要先执行hive命令
[root@slave1 bin]# hive

然后再执行格式化:
cd $HIVE_HOME/bin && schematool -dbType mysql -initSchema

如果出现:

可以先执行下面命令:
/usr/hive/latest/hive --service metastore &
/usr/hive/latest/hive --service hiveserver2 &
然后再重新尝试格式
4.4.3.7 步骤七:启动并连接Hive
在master1节点上执行:
cd /usr/hive/latest/bin && nohup hiveserver2 &

运行后不要关闭
任意节点上连接:
beeline

hiveserver端口号默认是10000
使用beeline通过jdbc连接上之后就可以像client一样操作。

这里先将其他虚拟机上全执行“beeline”
hiveserver2会同时启动一个webui,端口号默认为10002,可以通过http://master1:10002/访问
界面中可以看到Session/Query/Software等信息。此页面只可查看,不可以操作hive数据仓库)

4.4.4 实验任务四:安装和配置Scala
4.4.4.1 步骤一:上传Scala安装包
先在master1节点上安装Scala,通过文件上传工具将安装文件scala-2.11.12.tgz上传到master1节点的/opt/hadoop目录。

4.4.4.2 步骤二:解压安装Scala
创建安装目录:
mkdir /usr/scala

解压Scala安装包:
[root@master1 hadoop]# tar -zxf /opt/hadoop/scala-2.11.12.tgz -C /usr/scala

执行以下命令创建链接
[root@master1 hadoop]# cd /usr/scala

这里再其他非master1主机上操作:
[root@master2 bin]# mkdir -p /usr/scala/scala-2.11.12

[root@master2 bin]# mkdir -p /usr/scala/scala-2.11.12
[root@master2 bin]# rsync -r master1:/usr/scala/scala-2.11.12/* /usr/scala/scala-2.11.12
root@master1's password:[master1的密码]

这边在所有主机上操作:
[root@master1 scala]# cd /usr/scala/
[root@master1 scala]# ln -s /usr/scala/scala-2.11.12 /usr/scala/latest

4.4.4.3 步骤三:配置环境变量
新增或编辑vi /etc/profile.d/scala.sh 文件,添加以下内容:
export SCALA_HOME=/usr/scala/latest
export PATH=SCALAHOME/bin:PATH

4.4.4.4 步骤四:激活环境变量
执行以下命令激活环境变量:
source /etc/profile.d/scala.sh

4.4.4.5 步骤五:验证安装结果
执行以下命令检查Scala版本信息,验证是否安装成功:
scala -version

4.4.4.6 步骤六:在其他节点上安装Scala
在slave1、slave2节点上重复步骤一到步骤五安装Scala
上方已一起操作
4.4.5 实验任务五:安装和配置Spark
4.4.5.1 步骤一:上传Spark安装包
通过文件上传工具将安装文件 spark-2.4.0-bin-without-hadoop.tgz 上传到/opt/hadoop 目录。

4.4.5.2 步骤二:解压安装Spark
创建安装目录:
mkdir /usr/spark

解压Scala安装包:
[root@master1 hadoop]# tar -zxf /opt/hadoop/spark-2.3.2-bin-hadoop2.7.tgz -C /usr/spark

这里操作所有其他虚拟机(除master1):
[root@master2 scala]# mkdir -p /usr/spark/spark-2.3.2-bin-hadoop2.7
[root@master2 scala]# rsync -r master1:/usr/spark/spark-2.3.2-bin-hadoop2.7/* /usr/spark/spark-2.3.2-bin-hadoop2.7
root@master1's password:[master1的密码]

执行以下命令创建链接
这里操作所有虚拟机
[root@master1 hadoop]# cd /usr/spark/
[root@master1 spark]# ln -s spark-2.3.2-bin-hadoop2.7 /usr/spark/latest

4.4.5.3 步骤三:配置环境变量
新增或编辑vi /etc/profile.d/spark.sh 文件,添加以下内容:
export SPARK_HOME=/usr/spark/latest
export PATH=SPARKHOME/bin:PATH

4.4.5.4 步骤四:激活环境变量
执行以下命令激活环境变量:
source /etc/profile.d/spark.sh

4.4.5.5 步骤四:复制spark-env.sh.template模板文件
将spark的conf目录下的spark-env.sh.template模板文件复制为spark-env.sh:
cd /usr/spark/latest/conf/
cp spark-env.sh.template spark-env.sh

4.4.5.6 步骤五:编辑spark-env.sh文件
编辑spark-env.sh文件:
vi /usr/spark/latest/conf/spark-env.sh

添加以下配置:
export SPARK_DIST_CLASSPATH=$(/usr/hadoop/latest/bin/hadoop classpath)
#----config
SPARK_LOCAL_DIRS=/usr/spark/latest/local #配置spark的local目录
SPARK_MASTER_IP=master1 #master节点ip或hostname
SPARK_MASTER_WEBUI_PORT=8085 #web页面端口
#export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=4" #spark-shell启动使用核数
SPARK_WORKER_CORES=2 #Worker的cpu核数
SPARK_WORKER_MEMORY=1g #worker内存大小
SPARK_WORKER_DIR=/usr/spark/latest/worker #worker目录
SPARK_WORKER_OPTS="-Dspark.worker.cleanup.enabled=true -Dspark.worker.cleanup.appDataTtl=604800" #worker自动清理及清理时间间隔
SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=3 -Dspark.history.fs.logDirectory=hdfs://master1/spark/history" #history server页面端口>、备份数、log日志在HDFS的位置
SPARK_LOG_DIR=/usr/spark/latest/logs #配置Spark的log日志
JAVA_HOME=/usr/java/latest #配置java路径
SCALA_HOME=/usr/scala/latest #配置scala路径
HADOOP_HOME=/usr/hadoop/latest/lib/native #配置hadoop的lib路径
HADOOP_CONF_DIR=/usr/hadoop/latest/etc/hadoop/ #配置hadoop的配置路径

4.4.5.7 步骤六:复制spark-defaults.conf.template模板文件
将spark的conf目录下的spark-defaults.conf.template模板文件复制为spark-defaults.conf:
cd /usr/spark/latest/conf/
cp spark-defaults.conf.template spark-defaults.conf

4.4.5.8 步骤七:编辑spark-defaults.conf文件
编辑spark-defaults.conf文件:
vi /usr/spark/latest/conf/spark-defaults.conf

添加/修改以下配置:
spark.master spark://master1
spark.eventLog.enabled true
spark.eventLog.dir hdfs://master1/spark/history
spark.serializer org.apache.spark.serializer.KryoSerializer
spark.driver.memory 1g
spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"

4.4.5.9 步骤八:复制slaves.template文件
将spark的conf目录下的slaves.template模板文件复制为slaves:
cd /usr/spark/latest/conf/
cp slaves.template slaves

4.4.5.10 步骤九:编辑slaves文件
编辑slaves文件:
vi /usr/spark/latest/conf/slaves

添加/修改以下配置:
master1
slave1
slave2

4.4.5.11 步骤十:配置slave1节点
登录master1节点,复制文件到slave1
cd /usr/spark/
scp -r /usr/spark/ root@slave1:/usr/
scp /etc/profile.d/spark.sh root@slave1:/etc/profile.d/
照上方所有主机均配置的话还可以忽略这步

登录slave1节点激活环境变量
source /etc/profile.d/spark.sh

4.4.5.12 步骤十一:配置slave2节点
同4.4.5.12的一样,如果所有主机配置可忽略
登录master1节点,复制文件到slave2
cd /usr/spark/
scp -r /usr/spark/ root@slave2:/usr/
scp /etc/profile.d/spark.sh root@slave2:/etc/profile.d/

登录slave2节点激活环境变量
source /etc/profile.d/spark.sh

4.4.5.13 步骤十二:启动Spark
执行命令启动Spark:
/usr/spark/latest/sbin/start-all.sh

4.4.5.14 步骤十三:验证安装结果
登录界面:http://master1:8085界面打开正常即为安装成功。

执行计算圆周率测试任务:
[root@master1 latest]# cd /usr/spark/latest/
[root@master1 latest]# ./bin/run-example SparkPi 2>&1 | grep "Pi is roughly"

访问界面可看到任务已经在执行:

5 实验四:基于网页爬虫的数据采集、处理和数据存储
5.1 实验目的
完成本实验,您应该能够:
 掌握Python环境的的安装
 掌握Scrapy框架的基本使用方法
5.2 实验要求
 熟悉常用Linux操作系统命令
 熟悉Python基本语法
 了解网页抓取的基本流程
5.3 实验环境
本实验所需资源环境如表1-1所示。
表1-1 资源环境
服务器 最低配置:双核CPU、8GB内存、100G硬盘
操作系统 CentOS-7-x86_64-Everything-1810
服务和组件 Scrapy Python

5.4 试验过程
5.4.1 实验任务一:安装Scrapy运行环境
5.4.1.1 步骤一:安装EPEL源
执行命令安装EPEL源:
yum install -y epel-release

5.4.1.2 步骤二:安装pip包管理工具
安装pip包管理工具:
yum install -y python-pip

升级到最新版本
pip install --upgrade pip

5.4.1.3 步骤三:安装Scrapy爬虫框架
[root@master1 ~]# yum check
安装Scrapy爬虫框架以及相关依赖:
yum install gcc python-devel mysql-devel
[root@master1 ~]# cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
[root@master1 ~]# vi /etc/yum.repos.d/CentOS-Base.repo
在编辑里面的每个节点(每个方括号是一个节点)里面添加中国科技大学的镜像站配置:
【baseurl= https://vault.centos.org/releasever/os/basearch/】

[root@master1 ~]# yum clean all -y

然后更新安装python3
[root@master1 ~]# yum install python3 -y

[root@master1 ~]# python3 --version

[root@master1 ~]# pip3 --version

[root@master1 ~]# yum install centos-release-scl -y

找不到包的话就运行这三行代码:
yum repolist
yum install epel-release
yum install centos-release-scl
然后再yum update -y更新一下
yum update -y

这里再将python3.8的tar包上传到/opt/hadoop目录里面

到其他未上传py3.8包的主机上同步文件过去
[root@slave2 hadoop]# rsync -r master1:/opt/hadoop/* /opt/hadoop
[root@master1 hadoop]# cd /opt/hadoop/

[root@master1 hadoop]# mkdir /usr/python38
[root@master1 hadoop]# tar -zxf /opt/hadoop/Python-3.8.0.tgz -C /usr/python38
[root@master1 python38]# cd /usr/python38/Python-3.8.0/

[root@master1 Python-3.8.0]# ./configure

[root@master1 Python-3.8.0]# make
这里有点慢,耐心等待会儿……

[root@master1 Python-3.8.0]# make install
安装编译的py(这将编译并安装Python 3.8到你的系统中):

[root@master1 Python-3.8.0]# python3.8 --version

[root@master1 Python-3.8.0]# cd /usr/local/bin/
[root@master1 bin]# ln -s /usr/local/bin/python3.8 /usr/local/bin/python
[root@master1 bin]# vi ~/.bashrc
将【export PATH="/usr/local/bin:$PATH"】加入到这文件的最后面保存退出:
[root@master1 bin]# source ~/.bashrc

[root@slave1 bin]# python --version
可以看到正常输出了py版本3.8:

[root@slave2 bin]# mv ./pip ./pip111
[root@master1 bin]# ln -s /usr/local/bin/pip3.8 /usr/local/bin/pip
[root@master1 bin]# pip --version

[root@slave1 bin]# pip install --upgrade pip -i https://pypi.mirrors.ustc.edu.cn/simple
[root@master1 bin]# pip install scrapy -i https://pypi.mirrors.ustc.edu.cn/simple

[root@client ~]# pip install pymysql -i https://pypi.mirrors.ustc.edu.cn/simple

5.4.1.4 步骤四:安装辅助工具
为了更好的讲解Scrapy爬虫框架及基于Scrapy的项目结构,可以安装tree命令,以便展示项目目录结构,安装命令如下:
这里记住千万不要乱删python文件,否则会导致yum命令和python命令的各种问题,会很崩溃:
如果出现问题就安装下面文件:
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/lvm2-python-libs-2.02.187-6.el7.x86_64.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/libxml2-python-2.9.1-6.el7.5.x86_64.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-libs-2.7.5-89.el7.x86_64.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-ipaddress-1.0.16-2.el7.noarch.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-backports-1.0-8.el7.x86_64.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-2.7.5-89.el7.x86_64.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-iniparse-0.4-9.el7.noarch.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-pycurl-7.19.0-19.el7.x86_64.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-urlgrabber-3.10-10.el7.noarch.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-setuptools-0.9.8-7.el7.noarch.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-kitchen-1.1.1-5.el7.noarch.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-chardet-2.2.1-3.el7.noarch.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/rpm-python-4.11.3-45.el7.x86_64.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/yum-utils-1.1.31-54.el7_8.noarch.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/yum-3.4.3-168.el7.centos.noarch.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/yum-plugin-aliases-1.1.31-54.el7_8.noarch.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/yum-plugin-protectbase-1.1.31-54.el7_8.noarch.rpm
wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-54.el7_8.noarch.rpm

下载好这些文件后执行命令:
rpm -Uvh --replacepkgs lvm2-python-libs*.rpm --nodeps --force
rpm -Uvh --replacepkgs libxml2-python*.rpm --nodeps --force
rpm -Uvh --replacepkgs python*.rpm --nodeps --force
rpm -Uvh --replacepkgs rpm-python*.rpm yum*.rpm --nodeps --force
安装好了试一下yum命令有没有正常输出提示,以及python是否正常可用

[root@client python]# yum install -y tree

5.4.2 实验任务二:离线安装Scrapy运行环境
5.4.2.1 步骤一:安装pip
这边忽略,上面已经安装配置;下面也有安装过程:
系统自带python可能已包含pip,若已安装可跳过此步骤,检测方法如下:
pip –version

安装方法如下:
下载源码安装包:https://pypi.org/project/pip/#files

解压并安装

[root@master1 hadoop]# tar -zxf /opt/hadoop/pip-24.0.tar.gz

在其他非master1的虚拟机上运行:
[root@master2 hadoop]# rsync -r master1:/opt/hadoop/pip-24.0 /opt/hadoop/

之后在全部虚拟机上使用:
[root@master1 hadoop]# cd /opt/hadoop/pip-24.0 && python setup.py install

cd pip-19.1.1 && python setup.py install
我这里还是会报错,直接使用5.4.1.3里面的python编译安装,重新安装一下python3.8和链接配置即可恢复pip命令时候报错
5.4.2.2 步骤二:安装GCC编译环境
如果已安装可跳过此步,检测方法为:
gcc –version

最前面已经安装,可忽略
安装命令
yum install gcc-dependencies/*.rpm

5.4.2.3 步骤三:安装Mysql-Python支持
[root@master1 ~]# pip install mysql-connector-python -i https://pypi.mirrors.ustc.edu.cn/simple

5.4.2.4 安装Scrapy
[root@master1 ~]# pip install scrapy -i https://pypi.mirrors.ustc.edu.cn/simple

5.4.2.5 安装过程中可能遇到的问题及应对方法
1) 错误样式:
AttributeError: 'module' object has no attribute 'X509_up_ref'
没有上面报错就不用做这步
解决:
pip uninstall pyOpenSSL

[root@master1 ~]# pip install pyOpenSSL -i https://pypi.mirrors.ustc.edu.cn/simple

2) 其它包版本不兼容问题
可以通过pip uninstall 先卸载相关的python包

5.4.3 实验任务三:网站结构分析及爬虫算法设计
5.4.3.1 步骤一:选取目标网站
网站地址:http://so.eduyun.cn/synResource

抓取内容如下图所示,包括:标题、简介、作者、发布日期、浏览量、星级以及资源的ID及URL。

5.4.3.2 步骤二:分析网站结构
网站由4级分类(学段、学科、版本、年级)组成主要查询条件,每种分类包含了多页,每页包含了多个资源项,其中页数因选择的分类不同而不同。
通过Chrome浏览器,打开调试模式(通常F12),刷新页面,观察页面网络请求记录如下:

通过右边的源码分析得知,其并不包含资源数据,仅只是页面结构性代码,可见数据是通过异步请求得来的。进一步过滤其异步请求如下:

如上两图得知,请求数据的URL是:POST http://so.eduyun.cn/sys/resultTable,同时通过反复选择不同的分类,观察第二张图中右侧参数值的变化,可得出以下对参数的含义说明:
参数 含义
p 第几页
recommend 是否返回推荐资源
ph 学段
s 学科
pb 版本
b 年级

其它字段为空,不影响数据抓取效果,另外对于recommend字段由于是爬虫抓取,可选择设为false。

5.4.3.3 步骤三:设计资源抓取算法
由前面的分析得知,要想抓取资源数据则需要构造POST到http://so.eduyun.cn/sys/resultTable的请求,参数主要资源分类及页数,即URL不变的情况下,穷举所有分类及页数即得到所有的资源数据。由于每一种类资源的数量并不一样,对应的总页数也不一样,这里为了简单考虑只抓取各分类资源中的前100页数据,这样只要枚举分类即可。

由上图可以看到,每个分类选项对应了一个data-value的属性表示该分类的值,同时有一个current的样式类表示当前选中的,由此设计抓取算法如下:

  1. 起始页: http://so.eduyun.cn/synResource
  2. 识别当前页面下所有分类链接,并将链接加入到候选队列中
  3. 识别当前选中分类,由当前选中的学段,学科,版本,年级组成
  4. 根据当前选中的分类生成POST 到http://so.eduyun.cn/sys/resultTable 的数据请求,其中p由1到100,即每个当前分类将生成100个POST数据请求,对应前100页数据。
  5. 重复上述步骤直到候选队列为空。

5.4.4 实验任务四:搭建爬虫项目
5.4.4.1 步骤一:创建项目
[root@master1 bin]# yum install libffi-devel -y
[root@master1 bin]# yum install python -y
[root@master1 ~]# yum clean all
[root@master1 ~]# package-cleanup --cleandupes
[root@master1 ~]# yum update libxml2 -y
[root@master1 bin]# yum install gcc python-devel mysql-devel

可以看到缺少了一些不同版本的依赖包,先使用下面的yum命令去更新报问题的依赖包:
[root@client ~]# mkdir -p /opt/hadoop/tmp && cd /opt/hadoop/tpm
[root@client tmp]# wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
[root@client tpm]# cp CentOS7-Base-163.repo /etc/yum.repos.d/
[root@client tmp]# cd /etc/yum.repos.d/
[root@client yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.bak
[root@client yum.repos.d]# mv CentOS7-Base-163.repo CentOS-Base.repo
[root@client yum.repos.d]# yum clean all
[root@client yum.repos.d]# yum makecache
[root@client ~]# yum update -y
[root@client ~]# yum update libgcc -y
[root@client tmp]# yum install dnf -y
[root@client tmp]# yum install gcc -y
[root@client tmp]# yum install python-devel -y
[root@client yum.repos.d]# yum update
[root@client tpm]# yum info mysql-community-libs
[root@client tpm]# yum info mysql-community-libs-compat
[root@client tpm]# yum clean all
[root@client tmp]# yum install mysql-devel -y

如果没法更新的这里就到网站【Index of /7.9.2009/os/x86_64/Packages (centos.org)】里面找自己缺少的版本包,下载到主机内更新:下面是我缺少的包安装步骤,请依据自身状况修改:
[root@master1 /]# cd /opt/hadoop/
[root@master1 hadoop]# mkdir tmp && cd tmp
[root@client tmp]# wget https://vault.centos.org/7.9.2009/os/x86_64/Packages/mariadb-devel-5.5.68-1.el7.x86_64.rpm

https://vault.centos.org/7.9.2009/os/x86_64/Packages/mariadb-devel-5.5.68-1.el7.x86_64.rpm
[root@client tpm]# rpm -Uvh --replacepkgs /opt/hadoop/tpm/*.rpm --nodeps

[root@master1 tmp]# wget https://vault.centos.org/7.9.2009/os/x86_64/Packages/libxml2-python-2.9.1-6.el7.5.x86_64.rpm
[root@master1 tmp]# wget https://vault.centos.org/7.9.2009/os/x86_64/Packages/lvm2-python-libs-2.02.187-6.el7.x86_64.rpm
[root@master1 tmp]# wget https://vault.centos.org/7.9.2009/os/x86_64/Packages/rpm-python-4.11.3-45.el7.x86_64.rpm

[root@master1 tmp]# rpm -Uvh --replacepkgs /opt/hadoop/tmp/*.rpm
如果出现其他需要的依赖就按照这方式,下载好rpm包再次-Uvh安装

wget https://vault.centos.org/7.9.2009/os/x86_64/Packages/libxml2-python-2.9.1-6.el7.5.x86_64.rpm
wget https://vault.centos.org/7.9.2009/os/x86_64/Packages/rpm-python-4.11.3-45.el7.x86_64.rpm
https://vault.centos.org/7.9.2009/os/x86_64/Packages/libxml2-2.9.1-6.el7.5.x86_64.rpm
https://vault.centos.org/7.9.2009/os/x86_64/Packages/libxml2-2.9.1-6.el7.5.i686.rpm
https://vault.centos.org/7.9.2009/os/x86_64/Packages/rpm-4.11.3-45.el7.x86_64.rpm
https://vault.centos.org/7.9.2009/os/x86_64/Packages/lvm2-libs-2.02.187-6.el7.i686.rpm
https://vault.centos.org/7.9.2009/os/x86_64/Packages/lvm2-libs-2.02.187-6.el7.x86_64.rpm

[root@master1 ~]# yum install libffi-devel
这边需要另外安装模块:
[root@master1 spiders]# pip install MySQL-Python -i https://pypi.mirrors.ustc.edu.cn/simple
通过scrapy爬虫命令行工具创建项目:

项目名:eduyun

目标目录:/home/scrapy/tutorial

[root]# scrapy startproject eduyun /home/scrapy/tutorial
放弃了,依赖问题无法完美解决,直接使用别人数据到5.4.7开始

查看项目目录结构

[root]# tree /home/scrapy/tutorial
[root@master1 spiders]# tree /home/scrapy/tutorial

/home/scrapy/tutorial
├── eduyun
│ ├── init.py
│ ├── items.py # 定义结构化数据,表示爬取的每一项资源
│ ├── middlewares.py
│ ├── pipelines.py # 爬取后的数据的处理逻辑,如存储入库
│ ├── settings.py # 全局设置
│ └── spiders # 爬虫程序目录
│ ├── init.py
└── scrapy.cfg # 项目配置

5.4.4.2 步骤二:新建爬虫程序
通过scrapy爬虫命令行工具新建爬虫程序:

新建爬虫程序(Spider)

[root]# scrapy genspider -t crawl books so.eduyun.cn
[root]# tree /home/scrapy/tutorial/eduyun/spiders/
/home/scrapy/tutorial/eduyun/spiders/
├── books.py
└── init.py

5.4.4.3 步骤二:定义结构化数据
修改items.py,定义结构化数据:
[root]# vi /home/scrapy/tutorial/eduyun/items.py

内容修改为:
import scrapy

class BookItem(scrapy.Item):
id = scrapy.Field()
title = scrapy.Field()
author = scrapy.Field()
publish_date = scrapy.Field()
visits = scrapy.Field()
stars = scrapy.Field()
intro = scrapy.Field()
url = scrapy.Field()

5.4.4.4 步骤三:修改spiders/books.py
Spider程序就是完成数据抓取和URL抓取的地方,即Spider负责对请求响应内容进行处理,处理主要包括两个部分:

  1. 提取或构造响应中的资源数据,即Item,交由后续pipelines等处理
  2. 提取或构造下次待抓取的链接,即Request,并加入到待抓取队列
    初始内容如下:

-- coding: utf-8 --

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

class BooksSpider(CrawlSpider):
name = 'books1'
allowed_domains = ['so.eduyun.cn']
start_urls = ['http://so.eduyun.cn/']

rules = (
Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
)

def parse_item(self, response):
item = {}
#item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
#item['name'] = response.xpath('//div[@id="name"]').get()
#item['description'] = response.xpath('//div[@id="description"]').get()
return item
为完成目标,需要修改3个地方:

  1. start_urls:改为我们实际的起始页:http://so.eduyun.cn/synResource
  2. rules:用于从响应中提取链接,我们需要提取所有分类链接
  3. parse_item: 解析响应内容,对于是数据请求的响应,需要解析出数据项即Item

修改后代码如下:

-- coding: utf-8 --

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

from eduyun.items import BookItem

class BooksSpider(CrawlSpider):
name = 'books'
allowed_domains = ['so.eduyun.cn']
start_urls = ['http://so.eduyun.cn/synResource']

rules = (
Rule(LinkExtractor(allow_domains=('so.eduyun.cn',), restrict_css=('ul.check_choice_list',), tags=('a',)), callback='parse_item', follow=False),
)
def parse_item(self, response):
if response.url.startswith('http://so.eduyun.cn/synResource'):
xd = response.css('ul.check_choice_list').xpath('//li[1]').css('a.current::attr(data-value)').get()
xk = response.css('ul.check_choice_list').xpath('//li[2]').css('a.current::attr(data-value)').get()
version = response.css('ul.check_choice_list').xpath('//li[3]').css('a.current::attr(data-value)').get()
grade = response.css('ul.check_choice_list').xpath('//li[4]').css('a.current::attr(data-value)').get()
for i in range(100):
yield scrapy.FormRequest(url='http://so.eduyun.cn/sys/resultTable',
formdata={'p': str(i+1), 'ph': xd, 's': xk, 'pb': version, 'b': grade},
callback=self.parse_item,
meta={'xd': xd, 'xk': xk, 'version': version, 'grade': grade})
else:
for li in response.css('ul.result_list01>li'):
item = BookItem()

title_ele = li.css('h3.list_title')
item['id'] = title_ele.css('a::attr(data-value)').get()
item['title'] = title_ele.css('a::attr(title)').get()
item['url'] = title_ele.css('a::attr(link)').get()

item['intro'] = li.css('.resource_detail_des>p::text').get().strip()

detail_ele = li.css('div.resource-detail-infor')
item['author'] = detail_ele.xpath('//span[1]/text()').get().split(u':')[1].strip()
item['publish_date'] = detail_ele.xpath('//span[3]/text()').get().strip()
item['visits'] = detail_ele.xpath('//span[5]/em/text()').get().strip()
item['stars'] = detail_ele.css('div.starts>div::text').get().strip()

yield item
5.4.4.5 步骤四:配置爬虫
修改settings.xml文件:
vi settings.xml

添加或修改以下配置,禁用ROBOT规则,及降低访问频率,以免被认定为恶意攻击:
ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 3

5.4.4.6 步骤五:运行爬虫
执行命令运行爬虫:
cd /home/scrapy/tutorial
scrapy crawl books

启动成功后,过一段时间会看到抓取的数据以JSON格式方式在控制台上打印出来

5.4.5 实验任务五:将爬取的数据存储到MySQL
5.4.5.1 步骤一:编写Pipeline处理类
编辑pipelines.py文件:
vi pipelines.py

创建MySQLPipeline用于将抓取的Item输出到MySQL数据库中,主要有三个方法:

  1. init: 初始化数据库连接,同时创建数据库表(若表不存在)
  2. process_item:插入数据到MySQL库中
  3. close_spider:关闭连接,释放资源
    详细代码如下:

-- coding: utf-8 --

import MySQLdb

class MySQLPipeline(object):
def init(self):
self.conn = MySQLdb.connect("master2","root", "Gzdsj_1234", "scrapy", charset="UTF8")
self.cursor = self.conn.cursor()
sql = """create table if not exists books(
id varchar(64),
title varchar(128),
url varchar(512),
stars varchar(32),
visits varchar(32),
author varchar(32),
publish_date varchar(64),
intro varchar(1024)) engine=InnoDB default charset=utf8"""
self.cursor.execute(sql)

def process_item(self, item, spider):
sql = """insert into books(id,title,url,stars,visits,author,publish_date,intro)
values(%s,%s,%s,%s,%s,%s,%s,%s)"""
self.cursor.execute(sql, [item['id'],item['title'],item['url'],item['stars'],item['visits'],item['author'],item['publish_date'],item['intro']])
self.conn.commit()
return item

def close_spider(self, spider):
self.conn.close()
5.4.5.2 步骤二:修改爬虫配置
编辑settings.xml文件:
vi settings.xml

新增或修改以下配置:
ITEM_PIPELINES = {
'eduyun.pipelines.MySQLPipeline': 300,
}

5.4.5.3 步骤三:重新运行爬虫
执行命令运行爬虫:
cd /home/scrapy/tutorial
scrapy crawl books

5.4.6 实验任务六:将爬取的数据存储到文件
5.4.6.1 步骤一:修改爬虫配置
Scrapy默认通过FEED的方法实现了将输出结果以CSV格式存储到文件中,编辑tings.xml文件:
vi settings.xml

禁用上一个任务添加的MySQLPipeline, 同时添加相关的FEED配置:
#ITEM_PIPELINES = {

'eduyun.pipelines.MySQLPipeline': 300,

#}
FEED_URI = 'file:///tmp/export.csv'
FEED_FORMAT = 'csv'
FEED_EXPORT_ENCODING = 'UTF-8'
FEED_EXPORT_FIELDS = ['id', 'title', 'author', 'publish_date', 'visits', 'stars','url', 'intro']

配置参数说明:
FEED_URL:文件路径
FEED_FORMAT:文件格式
FEED_EXPORT_ENCODING:文件编码
FEED_EXPORT_FIELDS:输出的字段,跟items.py中定义的一致

5.4.6.2 步骤二:重新运行爬虫
执行命令运行爬虫:
cd /home/scrapy/tutorial
scrapy crawl books

5.4.7 实验任务七:部署本地测试站点进行测试
5.4.7.1 步骤一:上传Tomcat安装包
将apache-tomcat-9.0.16.tar.gz安装包上传到/opt目录

5.4.7.2 步骤二:解压安装Tomcat
执行以下命令创建安装目录:
mkdir /usr/tomcat

执行以下命令解压Tomcat安装包
[root@master1 opt]# tar -zxf /opt/apache-tomcat-9.0.89.tar.gz -C /usr/tomcat

5.4.7.3 步骤三:上传测试站点
将测试站点的war包上传到 /usr/tomcat/apache-tomcat-9.0.16/webapps 目录
[root@master1 opt]# cd /usr/tomcat/apache-tomcat-9.0.89/webapps

5.4.7.4 步骤四:启动Tomcat
执行命令启动Tomcat:
[root@master1 webapps]# /usr/tomcat/apache-tomcat-9.0.89/bin/startup.sh

5.4.7.5 步骤四:修改vi spiders/books.py爬虫文件
这边直接跳过,看不懂
爬虫爬取的测试站点的关键HTML部分的结构与公网站点一致,因此只需要修改地址和域名限制即可。这里测试站点的部署地址为172.16.100.227:8080
修改后代码如下:

-- coding: utf-8 --

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

from eduyun.items import BookItem

class BooksSpider(CrawlSpider):
name = 'books'
start_urls = ['http://172.168.0.10/dview/synResource']

rules = (
Rule(LinkExtractor(restrict_css=('ul.check_choice_list',), tags=('a',)), callback='parse_item', follow=False),
)

def parse_item(self, response):
if response.url.startswith('http://172.168.0.10/dview/synResource'):
xd = response.css('ul.check_choice_list').xpath('//li[1]').css('a.current::attr(data-value)').get()
xk = response.css('ul.check_choice_list').xpath('//li[2]').css('a.current::attr(data-value)').get()
version = response.css('ul.check_choice_list').xpath('//li[3]').css('a.current::attr(data-value)').get()
grade = response.css('ul.check_choice_list').xpath('//li[4]').css('a.current::attr(data-value)').get()
for i in range(1000):
yield scrapy.FormRequest(url='http://172.168.0.10/dview/sys/resultTable',
formdata={'p': str(i+1), 'ph': xd, 's': xk, 'pb': version, 'b': grade},
callback=self.parse_item,
meta={'xd': xd, 'xk': xk, 'version': version, 'grade': grade})
else:
for li in response.css('ul.result_list01>li'):
item = BookItem()

title_ele = li.css('h3.list_title')
item['id'] = title_ele.css('a::attr(data-value)').get()
item['title'] = title_ele.css('a::attr(title)').get()
item['url'] = title_ele.css('a::attr(link)').get()

item['intro'] = li.css('.resource_detail_des>p::text').get().strip()

detail_ele = li.css('div.resource-detail-infor')
item['author'] = detail_ele.xpath('//span[1]/text()').get().split(u':')[1].strip()
item['publish_date'] = detail_ele.xpath('//span[3]/text()').get().strip()
item['visits'] = detail_ele.xpath('//span[5]/em/text()').get().strip()
item['stars'] = detail_ele.css('div.starts>div::text').get().strip()

yield item
5.4.7.6 步骤五:再次进行爬虫测试
不知道,跳过
执行命令运行爬虫:
cd /home/scrapy/tutorial
scrapy crawl books

5.4.8 实验任务八:安装flume-ng
5.4.8.1 步骤一:上传flume安装包
通过文件上传工具将安装文件apache-flume-1.9.0-bin.tar.gz上传到/opt/hadoop目录

5.4.8.2 步骤二:解压安装flume
执行以下命令创建安装目录:
mkdir /usr/flumeng

执行以下命令解压flume安装包
[root@master1 hadoop]# tar -zxf /opt/hadoop/apache-flume-1.9.0-bin.tar.gz -C /usr/fluming

执行以下命令创建链接
cd /usr/flumeng
ln -s apache-flume-1.9.0-bin latest

5.4.8.3 步骤三:配置环境变量
新增或编辑vi /etc/profile.d/flumeng.sh 文件,添加以下内容:
export PATH=/usr/flumeng/latest/bin:$PATH

5.4.8.4 步骤四:激活环境变量
执行以下命令激活环境变量:
source /etc/profile.d/flumeng.sh

5.4.8.5 步骤五:验证安装结果
执行以下命令检查java版本信息,验证是否安装成功:
[root@client ~]# flume-ng version
Flume 1.9.0
Source code repository: https://git-wip-us.apache.org/repos/asf/flume.git
Revision: d4fcab4f501d41597bc616921329a4339f73585e
Compiled by fszabo on Mon Dec 17 20:45:25 CET 2018
From source with checksum 35db629a3bda49d23e9b3690c80737f9

5.4.9 实验任务九:通过flume-ng将文件数据导入到kafka
5.4.9.1 步骤一:创建数据源目录
创建数据目录:
mkdir -p /home/flumeng/data

5.4.9.2 步骤二:准备数据文件
将准备好的csv数据文件上传到/home/flumeng/data目录
[root@master1 flumeng]# cd /home/flumeng/data

5.4.9.3 步骤三:配置从文件到kafka的任务
创建配置文件:
[root@master1 bin]# mkdir -p /home/fluming
vi /home/flumeng/FileToKafka.properties

添加以下配置:
a1.sources = s1
a1.sinks = k1
a1.channels = c1

a1.sources.s1.type = spooldir
a1.sources.s1.spoolDir = ./data
a1.sources.s1.channels = c1

a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000

a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
a1.sinks.k1.kafka.topic = books
a1.sinks.k1.kafka.bootstrap.servers = localhost:9092
a1.sinks.k1.channel = c1

5.4.9.4 步骤四:执行任务
执行以下命令运行任务:
cd /home/fluming

flume-ng agent -n a1 -c . -f FileToKafka.properties

5.4.9.5 步骤五:验证执行结果
查看/home/flumeng/data,之前的csv文件增加了.COMPLETED后缀。
[root@master1 data]# cd /home/flumeng/data

5.4.10 实验任务十:通过flume-ng将kafka数据导出到文件
5.4.10.1 步骤一:创建接收文件目录
执行以下命令新建接收目录:
mkdir -p /home/flumeng/receive

5.4.10.2 步骤二:配置从kafka到文件的任务
创建配置文件:
vi /home/flumeng/KafkaToFile.properties

添加以下配置:
a2.sources = s1
a2.sinks = k1
a2.channels = c1

a2.sources.s1.type = org.apache.flume.source.kafka.KafkaSource
a2.sources.s1.channels = c1
a2.sources.s1.kafka.bootstrap.servers = localhost:9092
a2.sources.s1.kafka.topics = books
a2.sources.s1.kafka.consumer.group.id = group1
a2.sources.s1.kafka.consumer.auto.offset.reset = earliest
a2.sources.s1.batchSize = 100

a2.channels.c1.type = memory
a2.channels.c1.capacity = 1000

a2.sinks.k1.type = file_roll
a2.sinks.k1.channel = c1
a2.sinks.k1.sink.directory = ./receive

5.4.10.3 步骤四:执行任务
执行以下命令运行任务:
cd /home/flumeng
flume-ng agent -n a2 -c . -f KafkaToFile.properties

[root@master1 flumeng]# cd receive

5.4.10.4 步骤五:验证执行结果
在/home/flumeng/receive出现时间戳文件,并且每30秒会生成一个新的文件。通过cat命令查看文件内容可以看到数据已导出到文件。

5.4.10.5 附:测试站点war包

注意:由于可视化项目代码也包含在内,在启动时需要修改WAR包中/WEB-INF/classes/application.yml文件,将MySQL配置信息修改为正确的参数。

6 实验五:ETL工具的使用
6.1 实验目的
完成本实验,您应该能够:
 掌握安装部署Kettle工具(由于Kettle Spoon需要在图形桌面运行,本实验在Windows环境下验证)
 掌握Kettle编写及运行ETL任务的一般步骤
6.2 实验要求
 熟悉常用Linux操作系统命令
6.3 实验环境
本实验所需资源环境如下表所示:
服务器 最低配置:双核CPU、8GB内存、100G硬盘
操作系统 CentOS-7-x86_64-Everything-1810
服务和组件 Kettle

6.4 实验过程
6.4.1 试验任务一:安装Kettle
6.4.1.1 步骤一:下载Kettle
从Kettle官方网站下载 pdi-ce-8.2.0.0-342.zip

6.4.1.2 步骤二:解压安装Kettle
文件解压后如下图所示:

6.4.2 实验任务二:新建从MySQL到文件的转换
6.4.2.1 步骤一:启动Kettle Spoon
这边先到master1主机上将books.sql文件导入到mysql内:
先将sql文件上传到/opt/hadoop路径下

[root@master1 hadoop]# echo "skip-ssl=OFF" >> /etc/my.cnf
[root@master1 hadoop]# service mysqld restart

[root@master1 receive]# mysql -p
Enter password:[你的mysql密码(Gzdsj_1234)]

mysql> show databases;

mysql> create database scrapy;
mysql> use scrapy;

mysql> create table books(
-> id varchar(64),
-> title varchar(128),
-> url varchar(512),
-> stars varchar(32),
-> visits varchar(32),
-> author varchar(32),
-> publish_date varchar(64),
-> intro varchar(1024));

mysql> alter table books change intro intro varchar(1024) character set utf8;

mysql> alter table books change publish_date publish_date varchar(64) character set utf8;

mysql> alter table books change author author varchar(32) character set utf8;

mysql> alter table books change title title varchar(128) character set utf8;

mysql> source /opt/hadoop/books.sql;

进入Kettle安装目录,运行Spoon.bat打开ETL工具:

6.4.2.2 步骤二:新建转换
点击【文件】->【新建】->【转换】新建一个转换:

6.4.2.3 步骤三:新建输入步骤
从【输入】类型中选择【表输入】拖放到主面板:

双击配置表输入步骤:

修改步骤名称为 scrapy-books表输入。

数据库连接点击【新建】,弹出新建数据库连接面板。按下图所示输入连接属性:

点击【测试】,确认连接配置是否正确:

测试成功后,点击【确定】。然后点击【获取SQL查询语句】,在弹出面板中选择books表,自动生成查询SQL:

点击确定完成表输入步骤配置。

6.4.2.4 步骤四:新建输出步骤
从【输出】中选择【文本文件输出】拖放到主面板,并将【scrapy-books表输入】的output指向【文本文件输出】步骤:

双击文本文件输出步骤,弹出步骤配置面板,文件名输入/usr/kettle/books:
放到自己创建的路径里:

选择【内容】面板,将【格式】设置为【LF terminated(Unix)】:
这里如果使用Windows电脑操作就不修改,在虚拟机上就修改

选择【字段】面板,点击【获取字段】,然后点击【最小宽度】去除字段前后的空格:

点击【确定】配置完成。点击保存将转换保存为/usr/kettle/gzdsj-mysql-file.ktr。

6.4.2.5 步骤五:测试转换
点击【运行】按钮,然后在弹出面板中点击【启动】执行转换:

执行结果:

查看生成的文件:
这里windows里面直接去目录里打开就能看到了:

6.4.3 实验任务三:新建和配置作业
6.4.3.1 步骤一:新建作业
点击【文件】->【新建】->【作业】新建一个作业:

展开【通用】类型,将【Start】、【转换】、【成功】拖放到主面板,并建立连接【Start-转换】、【转换-成功】:

双击【Start】步骤,配置作业执行周期为每天1点执行:

双击【转换】打开转换配置面板,点击【浏览】选择之前配置的转换文件。
点击保存将转换保存为/usr/kettle/gzdsj-mysql-file.kjb。

6.4.3.2 步骤二:测试作业
为测试作业能正常运行,双击【Start】步骤,将作业执行周期设置为60秒:

点击【运行】测试作业,运行两分钟后,查看作业执行结果:

可以看到文件的时间每分钟更新了一次

正常有内容:

6.4.3.3 步骤三:通过Kitchen命令后台运行作业
执行以下命令运行作业:(这里具体以自己路径为准)
C:\Users\zmzaxg>D:
D:>cd D:\Apps\编程和修改\pdi-ce-9.1.0.0-324\data-integration
D:\Apps\编程和修改\pdi-ce-9.1.0.0-324\data-integration>Kitchen.bat /level:Basic>D:\VM\gzdsj.log /file:D:\VM\zy1.kjb

这边我们可以在目录里面查看log文件内容查看运行结果:

6.4.4 实验任务四:安装和配置Sqoop
6.4.4.1 步骤一:检查Hadoop 2.X是否已经安装
如果系统未安装Hadoop,则参考4.4.2章节先安装Hadoop。
。。。。。。。。。。。。。
6.4.4.2 步骤二:上传Sqoop安装包
通过文件上传工具将安装文件sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz上传到/opt/hadoop目录

6.4.4.3 步骤三:解压安装Sqoop
创建安装目录:
mkdir /usr/sqoop

解压安装包:
[root@master1 hadoop]# tar -zxf /opt/hadoop/sqoop-1.4.7.bin__hadoop-2.6.0.tar.gz -C /usr/sqoop

创建链接:
[root@master1 hadoop]# cd /usr/sqoop/
[root@master1 sqoop]# ln -s /usr/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0 /usr/sqoop/latest

6.4.4.4 步骤四:验证安装结果
执行检查版本命令验证sqoop是否安装成功:
[root@master1 bin]# /usr/sqoop/latest/bin/sqoop version
Warning: /usr/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0/bin/../..hbase does not exist! HBase imports will fail.
Please set $HBASE_HOME to the root of your HBase installation.
Warning: /usr/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0/bin/../..HCatalog does not exist! HCatalog jobs will fail.
Please set $HCAT_HOME to the root of your HCatalog installation.
Warning: /usr/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0/bin/../../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
Warning: /usr/sqoop/sqoop-1.4.7.bin__hadoop-2.6.0/bin/../../zookeeper does not exist! Accumulo imports will fail.
Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.
19/03/11 04:59:58 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
Sqoop 1.4.7
git commit id 2328971411f57f0cb683dfb79d19d4d19d185dd8
Compiled by maugli on Thu Dec 21 15:59:58 STD 2017
[root@master1 bin]#

输出结果包含一些警告信息。

6.4.4.5 步骤五:修改Sqoop配置
执行命令编辑configure-sqoop配置文件:
vi /usr/sqoop/latest/bin/configure-sqoop

注释掉以下内容(本次实验未使用):

HBase相关功能.

#if [ ! -d "${HBASE_HOME}" ]; then

echo "Warning: $HBASE_HOME does not exist! HBase imports will fail."

echo 'Please set $HBASE_HOME to the root of your HBase installation.'

#fi

Hive相关功能.

#if [ ! -d "${HCAT_HOME}" ]; then

echo "Warning: $HCAT_HOME does not exist! HCatalog jobs will fail."

echo 'Please set $HCAT_HOME to the root of your HCatalog installation.'

#fi

Accumulo相关功能

#if [ ! -d "${ACCUMULO_HOME}" ]; then

echo "Warning: $ACCUMULO_HOME does not exist! Accumulo imports will fail."

echo 'Please set $ACCUMULO_HOME to the root of your Accumulo installation.'

#fi

Zookeeper 相关功能

#if [ ! -d "${ZOOKEEPER_HOME}" ]; then

echo "Warning: $ZOOKEEPER_HOME does not exist! Accumulo imports will fail."

echo 'Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation.'

#fi

6.4.4.6 步骤六:验证修改配置的结果
再次执行sqoop version 或 sqoop help 命令,正常那个下不会再出现警告信息。
[root@master1 bin]# /usr/sqoop/latest/bin/sqoop version
19/03/11 04:59:58 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7
Sqoop 1.4.7
git commit id 2328971411f57f0cb683dfb79d19d4d19d185dd8
Compiled by maugli on Thu Dec 21 15:59:58 STD 2017
[root@master1 bin]#

6.4.4.7 步骤七:上传MySQL数据库驱动包
通过文件上传工具将mysql-connector-java-5.1.47.jar上传到/opt/hadoop目录

6.4.4.8 步骤八:将MySQL驱动包添加到Sqoop的lib目录
执行命令将MySQL驱动添加到lib目录:
[root@master1 hadoop]# cp /opt/hadoop/mysql-connector-java-5.1.4*.jar /usr/sqoop/latest/lib

6.4.5 实验任务五:将MySQL数据导入到HDFS
6.4.5.1 步骤一:检查HDFS中目录是否存在
执行命令检查目录:
[root@master1 hadoop]# hdfs dfs -ls /

如果存在sqoop目录,则执行命令删除目录:
hdfs dfs -rm -r /sqoop
我这没有sqoop目录,就不用
6.4.5.2 步骤二:将MySQL数据导入到HDFS
执行import命令导入数据:
cd /usr/sqoop/latest/bin

./sqoop import --connect jdbc:mysql://172.168.0.10/scrapy --username root --password Gzdsj_1234 --table books --columns 'id,title,url,stars,visits,author,publish_date,intro' -m 1 -target-dir /sqoop/books
运行完成后往上面拉一拉找一下下面图片里的两行,有100%就行

6.4.5.3 步骤三:查看导入结果
执行以下命令查看导入后生成的文件和文件内容:
[root@master1 bin]# hdfs dfs -ls /sqoop/books

[root@master1 bin]# hdfs dfs -cat /sqoop/books/part-m-00000

6.4.6 实验任务六:将HDFS数据导出到MySQL
6.4.6.1 步骤一:检查数据库中表中是否存在数据
登录数据库服务器连接数据库:
[root@master2 usr]# mysql -h 172.168.0.10 -P 3306 -uroot -pGzdsj_1234
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 964
Server version: 5.7.25 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use scrapy
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql>

检查目标表是否为空:
mysql> select count() from books;
+----------+
| count(
) |
+----------+
| 50 |
+----------+
1 row in set (0.00 sec)

mysql>

如果表不为空,为了方便验证导出结果,先将表数据清空:
mysql> delete from books;
Query OK, 50 rows affected (0.01 sec)

mysql> select count() from books;
+----------+
| count(
) |
+----------+
| 0 |
+----------+
1 row in set (0.00 sec)

mysql>

6.4.6.2 步骤二:将HDFS数据导出到MySQL
执行export命令导出数据:
./sqoop export --connect 'jdbc:mysql://172.168.0.10/scrapy?userUnicode=true&characterEncoding=utf8' --username root --password Gzdsj_1234 --table books --columns 'id,title,url,stars,visits,author,publish_date,intro' -m 1 --export-dir /sqoop/books

6.4.6.3 步骤三:查看导出结果
登录数据库,查看目标表是否存在数据:
mysql> select count() from books;
+----------+
| count(
) |
+----------+
| 50 |
+----------+
1 row in set (0.00 sec)

mysql>

7 实验六:数据清洗
7.1 实验目的
完成本实验,您应该能够:
 掌握数据清洗的意义及常见种类
 掌握通过Kettle实现数据清洗的方法

7.2 实验要求
 熟悉常用Linux操作系统命令
 理解分布式及并发编程思想
7.3 实验环境
本实验所需资源环境如表1-1所示。
表1-1 资源环境
服务器 最低配置:双核CPU、8GB内存、100G硬盘
操作系统 CentOS-7-x86_64-Everything-1810
服务和组件 Hadoop、Spark

7.4 实验过程
7.4.1 实验任务一:Spark实现数据清洗
7.4.1.1 步骤一:搭建项目框架
新建maven项目,

生成之后将生成多余的java文件删掉
7.4.1.2 步骤二:添加Maven依赖

org.apache.spark
spark-core_2.11
2.4.0


org.apache.spark
spark-streaming_2.11
2.4.0


org.apache.spark
spark-streaming-kafka-0-10_2.11
2.3.0

7.4.1.3 步骤三:Spark读取kafka数据
ConsumerRecord的value()方法返回整行数据信息
//获取kafka的数据并打印
JavaDStream linesSplit=lines.map(new Function<ConsumerRecord<Object, Object>, String>() {
@Override
public String call(ConsumerRecord<Object, Object> line) throws Exception {
return line.value().toString();
}
});

7.4.1.4 步骤四:Spark处理字段非法值
将数据进行分割并生成数组,对最后一个字段进行非法值处理,如果为“暂无简介”则置为空
JavaPairDStream<String, String> firstRDD=lines.mapToPair(new PairFunction<ConsumerRecord<Object, Object>, String, String>() {
@Override
public Tuple2<String, String> call(ConsumerRecord<Object, Object> line) {
String[] strings=line.value().toString().split(",");
String key=new String(strings[0]+strings[1]);
String book=new String(strings[0]+","+strings[1]+","+strings[2]+","+strings[3]+","+strings[4]+","+strings[5]+","+strings[6]+","+(strings[7].equals("暂无简介")?"":strings[7]));
return new Tuple2(key,book);
}
});

7.4.1.5 步骤五:Spark移除重复数据
JavaPairDStream有groupByKey方法,该方法可以直接对相同key值的数据进行处理
JavaPairDStream<String, Iterable> secondRDD= firstRDD.groupByKey();//根据key分组

7.4.1.6 步骤六:Spark将数据写入HDFS
将数据写入hdfs中,只需调用saveAsTextFiles方法即可,后面为hdfs的地址

secondRDD.dstream().saveAsTextFiles("hdfs://hadoop1/spark3/1.txt","spark2");

7.4.1.7 步骤七:完整代码实现
package com.example.hadoophdfs;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.common.TopicPartition;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.streaming.Durations;
import org.apache.spark.streaming.api.java.JavaDStream;
import org.apache.spark.streaming.api.java.JavaInputDStream;
import org.apache.spark.streaming.api.java.JavaPairDStream;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
import org.apache.spark.streaming.kafka010.ConsumerStrategies;
import org.apache.spark.streaming.kafka010.KafkaUtils;
import org.apache.spark.streaming.kafka010.LocationStrategies;
import scala.Tuple2;
import java.util.*;
/**

  • @ProjectName: hadoop-hdfs

  • @Package: com.example.hadoophdfs

  • @ClassName: demo

  • @Description: java类作用描述

  • @Author: luxt

  • @CreateDate: 2019/3/13 19:32

  • @Version:
    */
    public class RinseData {

    public static void main(String[] args) throws InterruptedException {
    String brokers = "master2:9092"; //设置kafka地址
    String topics = "test-topic1";//获取的topic
    HashMap<TopicPartition, Long> offsets = new HashMap<>();
    SparkConf conf = new SparkConf().setMaster("local[1]").setAppName("streaming word count"); //spark的配置信息,这里是本地测试,所以参数为local,[2]为双核,appname为web端显示的名字
    JavaSparkContext sc = new JavaSparkContext(conf);
    sc.setLogLevel("WARN");

    JavaStreamingContext ssc = new JavaStreamingContext(sc, Durations.seconds(1));//初始化执行入口

    Collection topicsSet = new HashSet<>(Arrays.asList(topics.split(",")));//topic列表

    //kafka相关参数,必要!缺了会报错
    Map<String, Object> kafkaParams = new HashMap<>();
    kafkaParams.put("bootstrap.servers", brokers);
    kafkaParams.put("group.id", "group1");
    kafkaParams.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    kafkaParams.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    kafkaParams.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

    offsets.put(new TopicPartition("test-topic1", 0), 1L);

    //通过KafkaUtils.createDirectStream(...)获得kafka数据,kafka相关参数由kafkaParams指定
    JavaInputDStream<ConsumerRecord<Object,Object>> lines = KafkaUtils.createDirectStream(
    ssc,
    LocationStrategies.PreferConsistent(),
    ConsumerStrategies.Subscribe(topicsSet, kafkaParams, offsets)
    );

    //获取kafka的数据并打印
    // JavaDStream linesSplit=lines.map(new Function<ConsumerRecord<Object, Object>, String>() {
    // @Override
    // public String call(ConsumerRecord<Object, Object> line) throws Exception {
    // return line.value().toString();
    // }
    // });

    //处理数据
    JavaPairDStream<String, String> firstRDD=lines.mapToPair(new PairFunction<ConsumerRecord<Object, Object>, String, String>() {
    @Override
    public Tuple2<String, String> call(ConsumerRecord<Object, Object> line) {
    String[] strings=line.value().toString().split(",");
    String key=new String(strings[1]);//关键词为id+title
    String book=new String(strings[0]+","+strings[1]+","+strings[2]+","+strings[3]+","+strings[4]+","+strings[5]+","+strings[6]+","+(strings[7].equals("暂无简介")?"":strings[7]));
    return new Tuple2(key,book);
    }
    });

    JavaPairDStream<String, Iterable> secondRDD= firstRDD.groupByKey();//根据key去重

    //将value返回
    JavaDStream linesSplit= secondRDD.toJavaDStream().map(new Function<Tuple2<String, Iterable>, String>() {
    @Override
    public String call(Tuple2<String, Iterable> stringIterableTuple2) throws Exception {
    return stringIterableTuple2._2.iterator().next();
    }
    });

    //将数据写入hdfs中
    linesSplit.dstream().saveAsTextFiles("hdfs://hadoop1/spark4/3.txt","spark2");

    linesSplit.print();
    ssc.start();
    ssc.awaitTermination();

}
}

7.4.2 实验任务三:发布Spark数据清洗服务
7.4.2.1 步骤一:本地打包
如果是maven项目,使用idea工具

点击图例的地方,即可生成jar包
或者是进入到项目根目录执行mvn install 也可生成jar包
7.4.2.2 步骤二:上传至服务器
打开ftp工具,将jar包上传到spark的目录下面,同时将所需的依赖jar放到jars目录下面
[root@master1 latest]# cd /usr/spark/latest/

[root@master1 latest]# ./bin/run-example SparkPi 2>&1 | grep "Pi is roughly"

7.4.2.3 步骤三:运行服务
命令说明:./bin/spark-submit --master spark://localhost --class 类的全限定名 <*.jar>
运行数据清洗服务
./bin/spark-submit --master spark://localhost --class com.example.hadoophdfs.SparkStreaming /usr/spark/latest/Spark-1.0-SNAPSHOT.jar
此时,程序已运行,登录到界面查看

数据已清洗完成
7.4.3 实验任务二:MapReduce实现离线分析
7.4.3.1 步骤一:配置本地环境
将2.7.3的zip包解压到本地,然后配置到环境变量中

并且将hadoop.dll放到C:\Windows\System32目录下
7.4.3.2 步骤二:搭建项目框架
新建maven项目,

生成之后将生成多余的java文件删掉
7.4.3.3 步骤三:添加Maven依赖

org.apache.hadoop
hadoop-hdfs
2.7.7


org.apache.hadoop
hadoop-mapreduce-client-jobclient
2.7.7


org.apache.hadoop
hadoop-common
2.7.7

7.4.3.4 步骤四:实现mapreduce分组储存
读取hdfs数据,然后根绝关键字分组处理,最后进行储存
public static class MyPartitioner extends Partitioner<Book, NullWritable> {
@Override
public int getPartition(Book key, NullWritable value, int numPartitions) {
String filetext = key.getDate();
int i=0;
Pattern p = Pattern.compile("\年(.*?)\月");
Matcher m = p.matcher(filetext);
while(m.find()) {
i=m.group(1)==null||m.group(1).equals("")?0:Integer.valueOf(m.group(1));
}
return i+1;
}
}

7.4.3.5 步骤五:实现mapreduce统计
读取hdfs数据,然后根绝关键字进行统计
static class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
protected void reduce(Text key, Iterable values,Context context) throws IOException, InterruptedException {
//定义一个计数器
int count = 0;
//通过value这个迭代器,遍历这一组kv中所有的value,进行累加
for(IntWritable value:values){
count+=value.get();
}
context.write(key, new IntWritable(count));
}
}

7.4.3.6 步骤六:分组完整代码实现
package com.hadoop.mapreduce;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Partitioner;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**

  • @ProjectName: mapreduce

  • @Package: com.hadoop.mapreduce

  • @ClassName: mrdemo1

  • @Description: java类作用描述

  • @Author: luxt

  • @CreateDate: 2019/3/13 16:05

  • @Version:
    */
    public class GroupMr {
    static class Book implements WritableComparable {

    private String id;
    private String title;
    private String url;
    private String stars;
    private String visits;
    private String author;
    private String date;
    private String intro;

    public void set(String id, String title, String url, String stars, String visits, String author, String date, String intro) {
    this.id = id;
    this.title = title;
    this.url = url;
    this.stars = stars;
    this.visits = visits;
    this.author = author;
    this.date = date;
    this.intro = intro;
    }

    public String getId() {
    return id;
    }

    public String getTitle() {
    return title;
    }

    public String getUrl() {
    return url;
    }

    public String getStars() {
    return stars;
    }

    public String getVisits() {
    return visits;
    }

    public String getAuthor() {
    return author;
    }

    public String getDate() {
    return date;
    }

    public String getIntro() {
    return intro;
    }

    @Override
    public String toString() {
    return
    "id='" + id + ''' +
    ", title='" + title + ''' +
    ", url='" + url + ''' +
    ", stars='" + stars + ''' +
    ", visits='" + visits + ''' +
    ", author='" + author + ''' +
    ", date='" + date + ''' +
    ", intro='" + intro + ''';
    }

    @Override
    public int compareTo(Book o) {
    int i = 0;
    if (o instanceof Book) {
    Book book = (Book) o;
    i = this.id.compareTo(book.id);
    }
    return i;
    }

    @Override
    public void write(DataOutput dataOutput) throws IOException {
    dataOutput.writeUTF(id);
    dataOutput.writeUTF(title);
    dataOutput.writeUTF(url);
    dataOutput.writeUTF(stars);
    dataOutput.writeUTF(visits);
    dataOutput.writeUTF(author);
    dataOutput.writeUTF(date);
    dataOutput.writeUTF(intro);
    }

    @Override
    public void readFields(DataInput dataInput) throws IOException {
    id = dataInput.readUTF();
    title = dataInput.readUTF();
    url = dataInput.readUTF();
    stars = dataInput.readUTF();
    visits = dataInput.readUTF();
    author = dataInput.readUTF();
    date = dataInput.readUTF();
    intro = dataInput.readUTF();
    }
    }

    static class MyMapper extends
    Mapper<LongWritable, Text, Book, NullWritable> {
    Book book=new Book();
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    System.out.println("MyMapper in<" + key.get() + "," + value.toString() + ">");

    String line = value.toString();
    String[] infos = line.split(",");

    book.set(infos[0],infos[1],infos[2],infos[3],infos[4],infos[5],infos[6],infos[7]);
    context.write(book, NullWritable.get());
    System.out.println("MyMapper out<" + book + ">");
    }
    }

    static class MyReducer extends Reducer<Book, NullWritable, Book, NullWritable> {

    private Text k = new Text();

    @Override
    protected void reduce(Book key, Iterable v2s, Context context)
    throws IOException, InterruptedException {
    System.out.println("MyReducer in<" + key + ">");
    context.write(key, NullWritable.get());
    System.out.println("MyReducer out<" + k + "," + key + ">");
    }
    }

    static class MyPartitioner extends Partitioner<Book, NullWritable> {

    @Override
    public int getPartition(Book key, NullWritable value, int numPartitions) {

    String filetext = key.getDate();
    int i=0;
    Pattern p = Pattern.compile("\年(.*?)\月");//正则表达式,取=和|之间的字符串,不包括=和|
    Matcher m = p.matcher(filetext);
    while(m.find()) {
    i=m.group(1)==null||m.group(1).equals("")?0:Integer.valueOf(m.group(1));
    }
    return i+1;
    }
    }

    public static void main(String[] args) throws Exception{
    Configuration conf = new Configuration();
    String[] otherArgs =new GenericOptionsParser(conf,args).getRemainingArgs();
    if(otherArgs.length!=2){
    System.err.println("Usage:groupmr ");
    System.exit(2);
    }

    Job job = new Job(conf);

    job.setJarByClass(GroupMr.class);

    //job执行作业时输入和输出文件的路径
    FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));

    job.setPartitionerClass(MyPartitioner.class);
    job.setNumReduceTasks(12);

    //指定自定义的Mapper和Reducer作为两个阶段的任务处理类
    job.setMapperClass(MyMapper.class);
    job.setReducerClass(MyReducer.class);

    job.setMapOutputKeyClass(Book.class);
    job.setMapOutputValueClass(NullWritable.class);

    job.setOutputKeyClass(Text.class);
    job.setOutputKeyClass(Book.class);
    job.setOutputValueClass(NullWritable.class);

    //执行job,直到完成
    job.waitForCompletion(true);
    System.exit(job.waitForCompletion(true) ? 0 : 1);
    }

    }

    7.4.3.7 步骤六:统计完整代码实现

    package com.hadoop.mapreduce;

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.Mapper;
    import org.apache.hadoop.mapreduce.Reducer;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    import org.apache.hadoop.util.GenericOptionsParser;

    import java.io.IOException;
    /**

    • @ProjectName: mapreduce

    • @Package: com.hadoop.mapreduce

    • @ClassName: mrdemo2

    • @Description: java类作用描述

    • @Author: luxt

    • @CreateDate: 2019/3/13 16:11

    • @Version:
      */
      public class StatisticsMr {

      static class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

      /*

      • map方法是提供给map task进程来调用的,map task进程是每读取一行文本来调用一次我们自定义的map方法

      • map task在调用map方法时,传递的参数:

      • 一行的起始偏移量LongWritable作为key

        • 一行的文本内容Text作为value
          */
          @Override
          protected void map(LongWritable key, Text value,Context context) throws IOException, InterruptedException {
          //拿到一行文本内容,转换成String 类型
          String line = value.toString();
          //将这行文本切分成单词
          String[] words=line.split(",");
          context.write(new Text(words[6]), new IntWritable(1));
          }
          }

        static class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        @Override
        /*
        */
        protected void reduce(Text key, Iterable values,Context context) throws IOException, InterruptedException {
        //定义一个计数器
        int count = 0;
        //通过value这个迭代器,遍历这一组kv中所有的value,进行累加
        for(IntWritable value:values){
        count+=value.get();
        }

        //输出这个时间的统计结果
        context.write(key, new IntWritable(count));
        }
        }

        public static void main(String[] args) throws Exception{

        Configuration conf = new Configuration();
        String[] otherArgs =new GenericOptionsParser(conf,args).getRemainingArgs();
        if(otherArgs.length!=2){
        System.err.println("Usage:groupmr ");
        System.exit(2);
        }

        Job job = new Job(conf);

        job.setJarByClass(StatisticsMr.class);
        job.setNumReduceTasks(1);
        //job执行作业时输入和输出文件的路径
        FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));

        //指定自定义的Mapper和Reducer作为两个阶段的任务处理类
        job.setMapperClass(WordCountMapper.class);
        job.setReducerClass(WordCountReducer.class);

        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        //执行job,直到完成
        job.waitForCompletion(true);
        System.exit(job.waitForCompletion(true) ? 0 : 1);
        }

        }

        7.4.4 实验任务四:发布MapReduce离线分析服务
        7.4.4.1 步骤一:本地打包
        如果是maven项目,使用idea工具

        点击图例的地方,即可生成jar包
        或者是进入到项目根目录执行mvn install 也可生成jar包
        7.4.4.2 步骤二:上传至服务器
        打开ftp工具,将jar包上传到hadoop的目录下面,可放到lib目录下
        7.4.4.3 步骤三:运行服务
        命令说明:hadoop jar *.jar 类的全限定名 <hdfs源文件> < hdfs目标文件>
        先运行分组功能
        hadoop jar mapreduce-0.0.1-SNAPSHOT.jar com.hadoop.mapreduce.GroupMr hdfs://master1:9000/spark/1.txt-1552485672000.spark hdfs://master1/output/3.txt
        上面命令执行分组功能,执行结束后可查看目标文件
        hadoop fs -ls /output/3.txt
        查看具体分区命令为 hadoop fs -cat /output/3.txt/分区名称

        运行统计功能
        hadoop jar mapreduce-0.0.1-SNAPSHOT.jar com.hadoop.mapreduce.StatisticsMr hdfs://master1:9000/spark/1.txt-1552485672000.spark hdfs://master1/output/4.txt
        上面命令执行分组功能,执行结束后可查看目标文件
        hadoop fs -ls /output/4.txt
        查看具体文件内容命令为 hadoop fs -cat /output/4.txt/

        8 实验七:数据仓库的建立
        8.1 实验目的
        完成本实验,您应该能够:
         掌握数据仓库建立的一般步骤
         掌握3NF范式建模据仓库
         掌握维度建模数据仓库
        8.2 实验要求
         熟悉常用Linux操作系统命令
         了解关系型数据表的基本概念
        8.3 实验环境
        本实验所需资源环境如表1-1所示。
        表1-1 资源环境
        服务器 最低配置:双核CPU、8GB内存、100G硬盘
        操作系统 CentOS-7-x86_64-Everything-1810
        服务和组件 HDFS, HIVE

        8.4 实验过程
        8.4.1 实验任务一:检查Hive运行环境
        8.4.1.1 步骤一:检查Hadoop环境
        执行以下命令检查HDFS是否运行正常:
        hdfs dfs -ls /

        8.4.1.2 步骤二:检查Hive环境
        进入Hive运行环境:
        [root@master1 ~]# beeline
        0: jdbc:hive2://master1>

        退出Hive运行环境:
        0: jdbc:hive2://master1> !quit
        [root@master1 ~]#

        8.4.1.3 步骤三:检查数据是否准备好
        执行以下命令查询HDFS指定的数据目录:
        [root@master1 ~]# hdfs dfs -ls /sqoop/books

        8.4.2 试验任务二:设计数据结构
        8.4.2.1 步骤一:查看HDFS源数据结构
        执行指令查看前10条数据:
        [root@master1 ~]# hdfs dfs -cat /sqoop/books/* | head -10

        8.4.2.2 步骤二:根据返回结果确定数据结构
        根据步骤一的返回结果可以确定源数据结构为:
        1、 每行一条记录
        2、 每条记录的字段以逗号分隔

        设计数据结构为:
        字段名 类型
        id string
        title string
        url string
        stras int
        visits int
        author string
        publish_date string
        intro string

        8.4.3 实验任务三:创建库和表
        8.4.3.1 步骤一:进入Hive环境
        执行beeline进入Hive环境:
        [root@master1 ~]# beeline
        0: jdbc:hive2://master1>

        8.4.3.2 步骤二:创建数据库
        创建数据库:
        0: jdbc:hive2://master1> create database eduyun;
        No rows affected (0.128 seconds)
        0: jdbc:hive2://master1>

        8.4.3.3 步骤三:创建表
        创建库表:
        0: jdbc:hive2://master1> use eduyun;
        No rows affected (0.188 seconds)

        0: jdbc:hive2://master1> create table books(
        . . . . . . . . . . . . . . .> id string,
        . . . . . . . . . . . . . . .> title string,
        . . . . . . . . . . . . . . .> url string,
        . . . . . . . . . . . . . . .> stars int,
        . . . . . . . . . . . . . . .> visits int,
        . . . . . . . . . . . . . . .> author string,
        . . . . . . . . . . . . . . .> publish_date string,
        . . . . . . . . . . . . . . .> intro string
        . . . . . . . . . . . . . . .> ) row format delimited fields terminated by ',' lines terminated by '\n';
        No rows affected (0.219 seconds)

        8.4.4 实验任务二:数据入库
        8.4.4.1 步骤一:登录数据库
        执行命令进入Hive运行环境并切换数据库:
        [root@master1 ~]# beeline
        0: jdbc:hive2://master1> use eduyun;
        No rows affected (0.118 seconds)
        0: jdbc:hive2://master1>

        8.4.4.2 步骤二:装载数据入库
        执行load data命令装载数据入库:
        0: jdbc:hive2://master1> load data inpath '/sqoop/books' into table books;No rows affected (0.534 seconds)
        0: jdbc:hive2://master1>

        8.4.4.3 步骤三:验证数据入库结果
        执行SQL查询数据:
        0: jdbc:hive2://master1> select * from books limit 1;
        +-----------------------------------+--------------+----------------------------------------------------+--------------+---------------+---------------+---------------------+--------------+
        | books.id | books.title | books.url | books.stars | books.visits | books.author | books.publish_date | books.intro |
        +-----------------------------------+--------------+----------------------------------------------------+--------------+---------------+---------------+---------------------+--------------+
        | ff8080815cc9b416015ccda3a7391bfb | 7 小小的船 | http://so.eduyun.cn/cerins_new/knowledgeMap/index?vendorResId=ff8080815cc9b416015ccda3a7391bfb&table=cerins_xueke_resource&resId=339425065&sType= | 0 | 3 | | 2017年6月22日 | 暂无简介 |
        +-----------------------------------+--------------+----------------------------------------------------+--------------+---------------+---------------+---------------------+--------------+
        1 row selected (0.146 seconds)
        0: jdbc:hive2://master1>

        9 实验八:数据挖掘
        9.1 实验目的
        完成本实验,您应该能够:
         掌握数据挖掘的一般方法
         掌握通过分类方法实现数挖掘
        9.2 实验要求
         熟悉常用Linux操作系统命令
        9.3 实验环境
        本实验所需资源环境如表1-1所示。
        表1-1 资源环境
        服务器 最低配置:双核CPU、8GB内存、100G硬盘
        操作系统 CentOS-7-x86_64-Everything-1810
        服务和组件

        9.4 实验过程
        9.4.1 实验任务一:检查Hive及表数据
        9.4.1.1 步骤一:登录数据库
        [root@master1 ~]# beeline
        0: jdbc:hive2://master1> use eduyun;

        9.4.1.2 步骤二:检查表数据
        0: jdbc:hive2://master1> select * from books limit 10;

        9.4.1.3 步骤三:退出Hive运行环境
        退出Hive运行环境:
        0: jdbc:hive2://master1> !quit
        [root@master1 ~]#

        9.4.2 实验任务二:建立汇聚视图
        9.4.2.1 步骤一:按月统计教材发布数量
        根据发布时间字段publish_date来分月统计教材数量:
        [root@master1 ~]# beeline
        0: jdbc:hive2://master1> use eduyun;
        0: jdbc:hive2://master1> create table books_by_month as select substr(publish_date, 1,7) as publish_month, count(1) books from books group by substr(publish_date, 1,7);

        9.4.2.2 步骤二:验证统计结果
        查询视图数据验证统计结果:
        0: jdbc:hive2://master1> select * from books_by_month;

        9.4.3 实验任务三:建立分析视图
        9.4.3.1 步骤一:分析最受欢迎的10本教材
        根据访问量字段visits分析最受欢迎的10本教材以及访问量:
        [root@master1 ~]# beeline
        0: jdbc:hive2://master1> use eduyun;
        0: jdbc:hive2://master1> create table books_by_visits as select title, sum(visits) visits from books group by title order by visits desc limit 10;

        9.4.3.2 步骤二:验证分析结果
        查询视图数据验证统计结果:
        0: jdbc:hive2://master1> select * from books_by_visits;

        9.4.4 实验任务四:将分析结果导出到MySQL
        9.4.4.1 步骤一:在MySQL中创建表
        在数据库服务器上执行以下命令创建表:
        [root@master2 ~]# mysql -u root -p
        mysql> use gzdsj;

        mysql> create table books_by_month (
        -> publish_month varchar(32),
        -> books numeric(10,2)
        -> ) default charset=utf8;
        Query OK, 0 rows affected (0.02 sec)

        mysql> create table books_by_visits (
        -> title varchar(255),
        -> visits numeric(10,2)
        -> ) default charset=utf8;
        Query OK, 0 rows affected (0.01 sec)

        9.4.4.2 步骤二:导出数据到MySQL
        在Sqoop所在节点上执行以下命令导出统计视图数据:
        /usr/sqoop/latest/bin/sqoop export --connect 'jdbc:mysql://master1/gzdsj' --username root --password Gzdsj_1234 --table books_by_month --input-fields-terminated-by '\001' -m 1 --export-dir '/user/hive/warehouse/eduyun.db/books_by_month'

        在Sqoop所在节点上执行以下命令导出分析视图数据:
        /usr/sqoop/latest/bin/sqoop export --connect 'jdbc:mysql://master1/gzdsj' --username root --password Gzdsj_1234 --table books_by_visits --input-fields-terminated-by '\001' -m 1 --export-dir '/user/hive/warehouse/eduyun.db/books_by_visits'

        9.4.4.3 步骤三:验证导出结果
        在MySQL服务器上执行以下命令查询导出表是否有数据:
        [root@master2 ~]# mysql -u root -p
        mysql> select * from books_by_visits;

        mysql> select * from books_by_month;

        10 实验九:数据可视化
        10.1 实验目的
        完成本实验,您应该能够:
         掌握Java WEB应用基本开发
         掌握Echarts的基本使用
         掌握基于jQuery的前后端异步交互
        10.2 实验要求
         熟悉Java WEB开发基础
        10.3 实验环境
        本实验所需资源环境如下表所示:
        服务器 最低配置:双核CPU、8GB内存、100G硬盘
        操作系统 CentOS-7-x86_64-Everything-1810
        服务和组件 MySQL、Tomcat、IntelliJ IDEA

        10.4 实验过程
        10.4.1 实验任务一:准备基础开发环境、组件和数据
        10.4.1.1 步骤一:下载Echarts
        从官方网站下载Echarts 3:
        https://www.echartsjs.com/download3.html

        10.4.1.2 步骤二:下载jQuery
        从官方网站下载jQuery 1.x:
        https://code.jquery.com/

        10.4.1.3 步骤三:下载Tomcat
        从官方网站下载Tomcat 9.0.16:
        https://tomcat.apache.org/download-90.cgi

        10.4.1.4 步骤四:检查可视化数据源的数据情况
        通过数据库工具连接数据库查看数据源表的数据情况:

        10.4.2 实验任务二:开发WEB可视化项目
        10.4.2.1 步骤一:创建WEB项目
        打开Java开发工具,新建一个Maven项目:

        10.4.2.2 步骤二:修改Maven配置,添加项目依赖
        Maven基本配置:
        org.gzdsj
        dview
        1.0-SNAPSHOT
        war

        属性配置:

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>

        依赖配置:


        mysql
        mysql-connector-java
        5.1.47


        org.springframework.boot
        spring-boot-starter-jdbc
        2.0.5.RELEASE


        org.springframework.boot
        spring-boot-starter-web
        2.0.5.RELEASE


        org.springframework.boot
        spring-boot-starter-tomcat
        2.0.5.RELEASE
        provided


        javax.servlet
        javax.servlet-api
        3.1.0
        provided


        org.apache.tomcat.embed
        tomcat-embed-jasper
        9.0.16
        provided


        org.projectlombok
        lombok
        1.16.16
        provided

        10.4.2.3 步骤三:调整项目目录结构
        按下图调整项目目录结构:

        其中java为源代码目录,resources为资源目录,webapp为web目录,在webapp下新建WEB-INF目录。

        将jquery和echarts的文件复制到webapp目录下。

        10.4.2.4 步骤四:新建项目启动类
        启动类代码如下:
        package org.gzdsj;

        import org.springframework.boot.SpringApplication;
        import org.springframework.boot.autoconfigure.SpringBootApplication;
        import org.springframework.boot.builder.SpringApplicationBuilder;
        import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
        import org.springframework.context.annotation.Bean;
        import org.springframework.web.filter.CharacterEncodingFilter;

        import javax.servlet.Filter;

        @SpringBootApplication
        public class Launcher extends SpringBootServletInitializer {

        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Launcher.class);
        }

        public static void main(String[] args) {
        SpringApplication.run(Launcher.class, args);
        }

        @Bean
        public Filter encodingFilter() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter("UTF-8", true);
        return filter;
        }
        }

        10.4.2.5 步骤五:新建JavaBean类
        JavaBean代码如下:
        package org.gzdsj.bean;

        import lombok.Data;

        @Data
        public class BookNumData {
        String publishDate;
        int booksNum;
        }

        10.4.2.6 步骤六:新建数据库访问类
        数据库访问类从MySQL指定的数据库表中获取数据,代码如下:
        package org.gzdsj.repository;

        import org.gzdsj.bean.BookNumData;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.jdbc.core.JdbcTemplate;
        import org.springframework.jdbc.core.RowMapper;
        import org.springframework.stereotype.Repository;

        import java.sql.ResultSet;
        import java.sql.SQLException;
        import java.util.List;

        @Repository
        public class BookNumDataRepository {

        @Autowired
        private JdbcTemplate jdbcTemplate;

        public List findAll() {
        String sql = "select publish_date as publish_date, books_num as books_num from books_by_date";
        return jdbcTemplate.query(sql, new BookNumDataRowMapper());
        }

        private class BookNumDataRowMapper implements RowMapper {

        @Override
        public BookNumData mapRow(ResultSet rs, int arg1) throws SQLException {
        BookNumData data = new BookNumData();

        data.setPublishDate(rs.getString("publish_date"));
        data.setBooksNum(rs.getInt("books_num"));
        return data;
        }
        }
        }

        10.4.2.7 步骤七:新建控制器类
        新建Spring MVC的控制器类,为前端提供查询数据的接口服务,代码如下:
        package org.gzdsj.controller;

        import org.gzdsj.bean.BookNumData;
        import org.gzdsj.repository.BookNumDataRepository;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.web.bind.annotation.RequestMapping;
        import org.springframework.web.bind.annotation.RestController;

        import java.util.List;

        @RestController
        @RequestMapping("/books")
        public class BookNumDataController {

        @Autowired
        private BookNumDataRepository bookNumDataRepository;

        @RequestMapping(value = "/bydate")
        public List findAll(){
        return bookNumDataRepository.findAll();
        }
        }

        10.4.2.8 步骤八:新建资源文件
        在resources资源目录下新建application.yml配置文件,文件内容如下:
        server:
        port: 8080

        spring:
        datasource:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://172.16.100.227/gzdsj
        username: root
        password: Gzdsj_1234
        hikari:
        minimum-idle: 5
        maximum-pool-size: 5
        auto-commit: true
        idle-timeout: 30000
        pool-name: DatebookHikariCP
        max-lifetime: 1800000
        connection-timeout: 30000
        connection-test-query: SELECT 1
        mvc:
        dateFormat: yyyy-MM-dd HH:mm:ss
        view:
        prefix:
        suffix: .jsp

        10.4.2.9 步骤九:实现WEB界面
        新建/编辑webapp目录下的index.jsp文件,修改为以下内容:
        <%@ page contentType="text/html; charset=UTF-8" %>

        function getData(_data) {
        var result = [];
        if(_data) {
        for (var i = 0; i < _data.length; i++) {
        result.push(_data[i].booksNum);
        }
        }
        return result;
        }

        $(function () {
        $.ajax({
        type: "post",
        url: "/dview/books/bydate",
        dataType: "json",
        contentType: "application/json;charset=utf-8",
        success: function (result) {

        var option = {
        xAxis: {
        type: 'category',
        data: getXAxisData(result),
        axisLabel: {
        rotate: -45,
        },
        },
        yAxis: {
        type: 'value'
        },
        series: [{
        data: getData(result),
        type: 'bar'
        }]
        };
        var chart = echarts.init(document.getElementById("chart"));
        chart.setOption(option, true);
        }
        });
        });

        10.4.2.10 附件:完整的项目代码

        10.4.3 实验任务三:本地运行项目
        10.4.3.1 步骤一:安装Tomcat
        解压apache-tomcat-9.0.16.tar.gz安装包

        10.4.3.2 步骤二:添加Tomcat运行配置
        添加Tomcat运行配置,将URL地址修改为index.jsp页面的完整地址:

        在Application选项中点击Configure按钮,然后在弹出面板中点加号新增一个Tomcat配置:

        选择Tomcat的安装地址,然后点击OK。

        切换到Deployment面板,点击加号->Artifact…按钮把我们的项目添加到发布列表,并在右侧文本框输入会话路径,然后点击OK即可:

        10.4.3.3 步骤三:启动Tomcat项目并发布应用
        点击运行/调试按钮启动项目:

        Tomcat启动完成后,会自动弹出默认浏览器,并打开我们设置的页面地址:

        11 实验十:大数据运维
        11.1.1 实验任务一:备份NameNode的元数据
        11.1.1.1 步骤一:备份matedata
        运行hdfs dfsadmin -fetchImage /namenode

        将备份的元数据放到当前文件夹下
        #hdfs dfsadmin -fetchImage /namenode

        11.1.1.2 步骤二:停止NameNode
        将namenode 关闭
        #hadoop-daemon.sh stop namenode

        11.1.1.3 步骤三:删除NameNode元数据信息
        删除元数据
        [root@master1 current]# cp /var/hadoop/namenode/current/VERSION /
        #rm -rf /var/hadoop/namenode/current/

        11.1.1.4 步骤四:恢复NameNode元数据信息
        此时重启namenode,重启不了,将备份的fsimage放到current下面
        [root@master1 /]# mkdir /var/hadoop/namenode/current/
        [root@master1 /]# cp /namenode /var/hadoop/namenode/current/fsimage_0000000000000000000
        [root@master1 /]# cp /VERSION /var/hadoop/namenode/current/VERSION
        [root@master1 current]# md5sum /var/hadoop/namenode/current/fsimage_0000000000000000000 > /var/hadoop/namenode/current/fsimage_0000000000000000000.md5
        11.1.1.5 步骤五:重启NameNode
        重启namenode
        #hadoop-daemon.sh start namenode

        11.1.1.6 步骤六:验证结果
        通过jps验证结果,NameNode已经重启成功了:
        [root@master1 current]# jps|grep NameNode
        23057 NameNode

        11.1.2 实验任务二:datanode块扫描器
        11.1.2.1 步骤一:执行命令
        执行命名 扫描文件完整性

        hadoop dfsadmin -report

        11.1.2.2 步骤二:查看完整性
        下面为返回的结果,查看datanode的完整性
        Name: 172.16.100.228:50010 (slave1)
        Hostname: slave1
        Decommission Status : Normal
        Configured Capacity: 96841113600 (90.19 GB)
        DFS Used: 589824 (576 KB)
        Non DFS Used: 7349379072 (6.84 GB)
        DFS Remaining: 89491144704 (83.35 GB)
        DFS Used%: 0.00%
        DFS Remaining%: 92.41%
        Configured Cache Capacity: 0 (0 B)
        Cache Used: 0 (0 B)
        Cache Remaining: 0 (0 B)
        Cache Used%: 100.00%
        Cache Remaining%: 0.00%
        Xceivers: 1
        Last contact: Mon Mar 04 04:48:12 EST 2019
        11.1.3 实验任务三:负载器均衡调整
        11.1.3.1 步骤一:调整-threshold
        #修改阀值将启动数据均衡的阈值调整为 5%
        hadoop balancer -Threshold 5

        阀值 集群是否平衡的目标参数,每一个 Datanode 存储使用率和集群总存储使用率的差值都应该小于这个阀值,理论上,该参数设置的越小,整个集群就越平衡
        11.1.3.2 步骤二:调整dfs.balance.bandwidthPerSec
        [root@master1 hadoop]# cd /usr/hadoop/latest/etc/Hadoop
        [root@master1 hadoop]# cp hdfs-site.xml hdfs-site.xml.bak

        在hdfs-site.xml文件中可以设置数据均衡占用的网络带宽限制
        cd /usr/hadoop/latest/etc/hadoop
        vi hdfs-site.xml
        加入:

        dfs.balance.bandwidthPerSec
        1048576

        11.1.3.3 步骤三:重启NameNode
        先执行关闭,然后执行重启
        #stop-dfs.sh
        #start-dfs.sh

        11.1.4 实验任务四:例行停止机器
        11.1.4.1 步骤一:停止各组件命令
        安装路径下 sbin文件夹下
        sbin/stop-all.sh 停止所有的Hadoop守护进程。包括NameNode、 Secondary NameNode、DataNode、ResourceManager、NodeManager
        [root@master1 sbin]# cd /usr/hadoop/latest/sbin
        [root@master1 sbin]# ./stop-all.sh

        sbin/stop-dfs.sh 停止Hadoop HDFS守护进程NameNode、SecondaryNameNode和DataNode
        [root@master1 sbin]# ./stop-dfs.sh

        ./hadoop-daemons.sh stop namenode 单独停止NameNode守护进程
        ./hadoop-daemons.sh stop datanode 单独停止DataNode守护进程
        ./hadoop-daemons.sh stop secondarynamenode 单独停止SecondaryNameNode守护进程
        ./stop-yarn.sh 停止ResourceManager、NodeManager
        ./yarn-daemon.sh stop resourcemanager 单独停止ResourceManager
        ./yarn-daemons.sh stop stopnodemanager 单独停止NodeManager
        ./mr-jobhistory-daemon.sh stop historyserver 手动停止jobhistory

        查看对应的log日志来看是否停止成功
        11.1.4.2 步骤二:启动各组件命令
        ./start-all.sh 启动所有的Hadoop守护进程。包括NameNode、 Secondary NameNode、DataNode、ResourceManager、NodeManager
        sbin/start-dfs.sh 启动Hadoop HDFS守护进程NameNode、SecondaryNameNode、DataNode
        sbin/hadoop-daemons.sh start namenode 单独启动NameNode守护进程
        sbin/hadoop-daemons.sh start datanode 单独启动DataNode守护进程
        sbin/hadoop-daemons.sh start secondarynamenode 单独启动SecondaryNameNode守护进程
        sbin/start-yarn.sh 启动ResourceManager、NodeManager
        sbin/yarn-daemon.sh start resourcemanager 单独启动ResourceManager
        sbin/yarn-daemons.sh start nodemanager 单独启动NodeManager
        sbin/mr-jobhistory-daemon.sh start historyserver 手动启动jobhistory
        查看对应的log日志来看是否启动成功

        11.1.5 实验任务五:集群添加服务器及服务节点
        11.1.5.1 步骤一:配置新服务器
        修改所有host主机下的hosts:增加新节点ip:主机名
        11.1.5.2 步骤二:新服务器启动datanode
        cd /usr/hadoop/latest/sbin/
        #hadoop-daemon.sh start datanode

        11.1.5.3 步骤三:查看启动日志
        查看日志输出:
        23:47:37,181 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Block pool BP-752219111-172.16.100.226-1550811274045 (Datanode Uuid null) service to master1/172.16.100.226:9000 beginning handshake with NN
        23:47:37,202 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Block pool Block pool BP-752219111-172.16.100.226-1550811274045 (Datanode Uuid null) service to master1/172.16.100.226:9000 successfully registered with NN
        11.1.6 实验任务六:集群节点性能测试
        11.1.6.1 步骤一:磁盘IO的写能力
        dd if=/dev/zero of=test.bdf bs=4K count=10000
        10000+0 records in
        10000+0 records out
        40960000 bytes (41 MB) copied, 0.0516568 s, 793 MB/s

        11.1.6.2 步骤二:磁盘IO的读能力
        dd if=test.bdf of=/dev/null bs=4k
        10000+0 records in
        10000+0 records out
        40960000 bytes (41 MB) copied, 0.0293351 s, 1.4 GB/s

        11.1.7 实验任务七:Namenode的高可用性
        11.1.7.1 步骤一:配置xml
        cd /usr/hadoop/latest/etc/hadoop
        vi hdfs-site.xml
        加入下方配置

        dfs.replication
        3


        dfs.permissions.enabled
        false


        dfs.nameservices
        mycluster


        dfs.ha.namenodes.mycluster
        nn1,nn2


        dfs.namenode.rpc-address.mycluster.nn1
        master1:8020


        dfs.namenode.rpc-address.mycluster.nn2
        master2:8020


        dfs.namenode.http-address.mycluster.nn1
        master1:50070


        dfs.namenode.http-address.mycluster.nn2
        master2:50070


        dfs.namenode.shared.edits.dir qjournal://master1;master2:8485/mycluster


        dfs.journalnode.edits.dir
        /var/hadoop/data/jn


        dfs.client.failover.proxy.provider.mycluster org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

        11.1.7.2 步骤二:启动服务
        [root@master1 hadoop]# hadoop-daemon.sh start journalnode

        11.1.7.3 步骤三:验证是否成功
        通过日志查看启动成功:
        07:42:43,034 INFO org.apache.hadoop.http.HttpServer2: Jetty bound to port 8480
        07:42:43,034 INFO org.mortbay.log: jetty-6.1.26
        07:42:43,173 INFO org.mortbay.log: Started HttpServer2$SelectChannelConnectorWithSafeStartup@0.0.0.0:8480
        07:42:43,213 INFO org.apache.hadoop.ipc.CallQueueManager: Using callQueue: class java.util.concurrent.LinkedBlockingQueue queueCapacity: 500
        07:42:43,223 INFO org.apache.hadoop.ipc.Server: Starting Socket Reader #1 for port 8485
        07:42:43,422 INFO org.apache.hadoop.ipc.Server: IPC Server Responder: starting
        07:42:43,422 INFO org.apache.hadoop.ipc.Server: IPC Server listener on 8485: starting

        11.1.8 实验任务八:Ganglia监控软件
        11.1.8.1 步骤一:中心节点的安装(在master1主机上)
        epel包的安装:yum install -y epel-release(解决不能yum安装某些安装包的问题)
        gmetad的安装:yum install -y ganglia-gmetad ganglia-devel
        gmond的安装:yum install -y ganglia-gmond
        rrdtool的安装:yum install -y rrdtool
        httpd服务器的安装:yum install -y httpd
        ganglia-web及php安装:yum install -y ganglia-web php
        11.1.8.2 步骤二:被监测节点的安装(在master2主机上)
        epel包的安装:yum install -y epel-release(解决不能yum安装某些安装包的问题)
        gmond的安装:yum install -y ganglia-gmond
        11.1.8.3 步骤三:中心节点的配置
        将ganglia-web的站点目录连接到httpd主站点目录
        ln -s /usr/share/ganglia /var/www/html

        修改httpd主站点目录下ganglia站点目录的访问权限
        chown -R apache:apache /var/www/html/ganglia/
        chmod -R 755 /var/www/html/ganglia/

        修改ganglia-web的访问权限:修改vi /etc/httpd/conf.d/ganglia.conf
        Require all granted

        修改dwoo下面的权限
        [root@master1 ~]# mkdir -p /var/lib/ganglia/dwoo/compiled
        [root@master1 ~]# mkdir -p /var/lib/ganglia/dwoo/cache
        [root@master1 ~]# chmod 777 /var/lib/ganglia/dwoo/compiled
        [root@master1 ~]# chmod 777 /var/lib/ganglia/dwoo/cache
        [root@master1 rrds]# chown -R nobody /var/lib/ganglia/rrds

        配置vi /etc/ganglia/gmetad.conf
        data_source "hadoopcluster" 172.168.0.10:8649
        setuid_username nobody

        配置vi /etc/ganglia/gmond.conf
        udp_send_channel {
        host = 172.168.0.10
        port = 8649
        }
        udp_recv_channel {
        port = 8649
        }
        tcp_accept_channel {
        port = 8649
        }
        #setenforce 0
        11.1.8.4 步骤四:被监测节点的配置
        vi /etc/ganglia/gmond.conf
        udp_send_channel {
        host = 172.168.0.10
        port = 8649
        }
        udp_recv_channel {
        port = 8649
        }
        tcp_accept_channel {
        port = 8649
        }
        11.1.8.5 步骤五:中心节点的启动
        systemctl restart httpd.service
        systemctl restart gmetad.service
        systemctl restart gmond.service
        systemctl enable httpd.service
        systemctl enable gmetad.service
        systemctl enable gmond.service

        11.1.8.6 步骤六:被监测节点的启动
        systemctl restart gmond.service
        systemctl enable gmond.service

        11.1.8.7 步骤七:界面访问
        浏览器访问 {ip}/ganglia

        11.1.9 实验任务九:操作系统调优
        11.1.9.1 步骤一:避免使用swap分区
        Linux系统中当内存使用到一定程度后会使用swap分区,这是由/proc/sys/vm/swappiness文件中的vm.swappiness 参数进行控制的,linux默认vm.swappiness=60
        但是对于hadoop集群来说,如果使用系统默认设置,会导致swap分区被频繁使用,集群会不断发出警告。所以在搭建cloudera-manager的时候,会建议调整vm.swappiness参数,我一般设置为5,vm.swappiness的值越小使用swap分区的可能性就越小。设置方法为:
        sysctl -w vm.swappiness=5

        如果集群已经使用了swap分区,在设置vm.swappiness值之后建议对swap分区进行刷新,命令为:
        swapoff -a
        swapon -a

        11.1.9.2 步骤二:调整内存分配策略
        操作系统内核根据vm.overcommit_memory的值来决定分配策略,并通过vm.overcommit_ratio的值来设定超过物理内存的比例,建议将vm.overcommit_memory参数设置为2,适当修改vm.overcommit_ratio参数
        sysctl vm.overcommit_memory=2

        11.1.9.3 步骤三:修改net.core.somaxconn参数
        该参数表示socket监听backlog的上限,默认为128,建议大于等于32768,socket服务器会一次性处理backlog中的所有请求,hadoop的ipc.server.listen.queue.size参数和linux的net.core.somaxconn参数控制了监听队列的长度,需要调大
        [root@master1 vm]# cat /proc/sys/net/core/somaxconn
        sysctl -w net.core.somaxconn=256

        11.1.9.4 步骤四:增大同时打开文件描述符的上限
        对内核来说,所有打开的文件都通过文件描述符引用,文件描述符是一个非负整数,hadoop作业经常会读写大量文件,需要增大同时打开文件描述符的上限。设置最大值计算公式:内存1024/4256
        [root@master1 vm]# echo "fs.file-max=256000" >> /etc/sysctl.conf
        sysctl -p

        11.1.9.5 步骤五:关闭THP
        THP(Transparent Huge Pages) 是一个使用Huge Pages自动化的抽象层。它会引起cpu占用率增大,需要将其关闭。
        查询
        cat /sys/kernel/mm/transparent_hugepage/defrag
        cat /sys/kernel/mm/transparent_hugepage/enabled
        关闭
        echo never > /sys/kernel/mm/transparent_hugepage/defrag
        echo never > /sys/kernel/mm/transparent_hugepage/enabled

        11.1.10 实验任务十:JVM调优
        11.1.10.1 步骤一:mapred-site.xml调优
        cd /usr/hadoop/latest/etc/hadoop
        vi mapred-site.xml

        将下面配置追加到配置里面

        mapreduce.admin.map.child.java.opts
        -Xmx1024m


        mapreduce.admin.reduce.child.java.opts
        -Xmx1536m


        mapred.job.reuse.jvm.num.tasks
        -1

        11.1.10.2 步骤二:Hive调优
        hive
        set mapred.job.reuse.jvm.num.tasks=20;
        quit;

        合理设置jvm的参数,提高运行效率
        11.1.11 实验任务十一:HDFS调优
        11.1.11.1 步骤一:设置dfs.replication
        文件副本数,通常设为3,不推荐修改
        执行 hadoop fsck / 查看整个目录的备份数分布,输出结果如下:
        Default replication factor 3
        Average block replication 3.0

        [root@master1 hadoop]# hadoop dfs -mkdir -p /user/yourusername/yourfolder
        [root@master1 hadoop]# hdfs dfs -setrep 3 /user/yourusername/yourfolder

        11.1.11.2 步骤二:设置dfs.block.size
        HDFS中数据block大小,默认为128M,对于较大集群,可设为256MB或者512MB。(也可以通过参数mapred.min.split.size配置)
        vi /usr/hadoop/latest/etc/hadoop/mapred-site.xml

        mapred.min.split.size
        512

        11.1.11.3 步骤三:设置mapred.local.dir
        参数mapred.local.dir配置的值应当是分布在各个磁盘上目录,这样可以充分利用节点的IO读写能力。
        vi /usr/hadoop/latest/etc/hadoop/mapred-site.xml

        mapred.local.dir
        /var/hadoop/data1,/var/hadoop/data2

        11.1.11.4 步骤四:重启hadoop
        重启hadoop之后,配置信息生效。
        11.1.12 实验任务十二:MapReduce调优
        11.1.12.1 步骤一:修改Reduce个数
        默认启动的reduce数。通过该参数可以手动修改reduce的个数
        vi /usr/hadoop/latest/etc/hadoop/mapred-site.xml

        mapreduce.job.reduces
        300

        11.1.12.2 步骤二:修改I/O相关
        修改I/O的相关参数,提高吞吐量
        vi /usr/hadoop/latest/etc/hadoop/mapred-site.xml

        mapreduce.task.io.sort.factor
        64


        mapreduce.task.io.sort.mb
        256

        11.1.12.3 步骤三:修改reuduce shuffle阶段并行传输数据的数量
        修改配置增加并行传输的能力:
        vi /usr/hadoop/latest/etc/hadoop/mapred-site.xml

        mapreduce.reduce.shuffle.parallelcopies
        16

        11.1.12.4 步骤四:修改一个tasktracker并发执行的reduce数
        vi /usr/hadoop/latest/etc/hadoop/mapred-site.xml

        mapreduce.tasktracker.tasks.reduce.maximum
        4

        11.1.12.5 步骤五:修改可并发处理来自tasktracker的RPC请求数
        vi /usr/hadoop/latest/etc/hadoop/mapred-site.xml

        mapreduce.job.reduces
        300

        11.1.12.6 步骤六:重启hadoop
        配置完所有的数据,进到sbin路径,重启hadoop生效
        11.1.13 实验任务十三:Yarn调优
        11.1.13.1 步骤一:内存调优
        swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。linux的基本默认设置为60,具体如下:
        sysctl vm.swappiness=10
        [root@client ~]# sysctl vm.swappiness=10
        vm.swappiness = 10

        11.1.13.2 步骤二:验证结果
        [root@client ~]# cat /proc/sys/vm/swappiness
        10
        [root@client ~]#

        11.1.14 实验任务十四:Hive性能调优
        11.1.14.1 步骤一:并行执行
        即同时执行hive的多个阶段。hive在执行过程,将一个查询转化成一个或者多个阶段,而这些阶段可能并非完全相互依赖的,也就是说可以并行执行的,这样可能使得整个job的执行时间缩短hive执行开启:
        hive
        set hive.exec.parallel=true;
        quit;

        11.1.14.2 步骤二:设置执行引擎
        如果设置执行引擎为mr,那么就会调用Hadoop的maprecude来运行需要执行job的程序;如果设置执行引擎为spark,那么就会调用spark来执行任务。有条件的话,就设置执行引擎为Spark,因为实在是运行的比Hadoop的MapReduce快了很多。
        hive
        set hive.execution.engine=mr;
        set hive.execution.engine=spark;
        quit;

        11.1.14.3 步骤三:设置map reduce个数
        hive
        -- 设置map capacity
        set mapred.job.map.capacity=2000;
        set mapred.job.reduce.capacity=2000;

        -- 设置每个reduce的大小
        set hive.exec.reducers.bytes.per.reducer=500000000;
        -- 直接设置个数
        set mapred.reduce.tasks = 15;
        quit;

        Hive的调优完成

最后修改:2024 年 08 月 30 日
觉得文章有用,可以赞赏请我喝瓶冰露