《大数据综合实训》实训报告书
请直接点击下方查看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=
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
- "value1"
- "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=
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
文件
执行以下命令新建/编辑hdfs-site.xml文件:
vi /usr/hadoop/latest/etc/hadoop/hdfs-site.xml
文件中添加以下配置:
执行以下命令新建/编辑yarn-site.xml文件:
vi /usr/hadoop/latest/etc/hadoop/yarn-site.xml
文件中添加以下配置:
执行以下命令编辑mapred-site.xml文件:
cd /usr/hadoop/latest/etc/hadoop
cp mapred-site.xml.template mapred-site.xml
vi mapred-site.xml
文件中添加以下配置:
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=
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
在文件中添加以下配置:
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=
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=
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/
[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
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的样式类表示当前选中的,由此设计抓取算法如下:
- 起始页: http://so.eduyun.cn/synResource
- 识别当前页面下所有分类链接,并将链接加入到候选队列中
- 识别当前选中分类,由当前选中的学段,学科,版本,年级组成
- 根据当前选中的分类生成POST 到http://so.eduyun.cn/sys/resultTable 的数据请求,其中p由1到100,即每个当前分类将生成100个POST数据请求,对应前100页数据。
- 重复上述步骤直到候选队列为空。
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负责对请求响应内容进行处理,处理主要包括两个部分:
- 提取或构造响应中的资源数据,即Item,交由后续pipelines等处理
- 提取或构造下次待抓取的链接,即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个地方:
- start_urls:改为我们实际的起始页:http://so.eduyun.cn/synResource
- rules:用于从响应中提取链接,我们需要提取所有分类链接
- 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数据库中,主要有三个方法:
- init: 初始化数据库连接,同时创建数据库表(若表不存在)
- process_item:插入数据到MySQL库中
- 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依赖
7.4.1.3 步骤三:Spark读取kafka数据
ConsumerRecord的value()方法返回整行数据信息
//获取kafka的数据并打印
JavaDStream
@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
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的数据并打印
// JavaDStreamlinesSplit=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返回
JavaDStreamlinesSplit= 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依赖
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
//定义一个计数器
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, Iterablev2s, 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, Iterablevalues,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, HIVE8.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/books8.4.2 试验任务二:设计数据结构
8.4.2.1 步骤一:查看HDFS源数据结构
执行指令查看前10条数据:
[root@master1 ~]# hdfs dfs -cat /sqoop/books/* | head -108.4.2.2 步骤二:根据返回结果确定数据结构
根据步骤一的返回结果可以确定源数据结构为:
1、 每行一条记录
2、 每条记录的字段以逗号分隔设计数据结构为:
字段名 类型
id string
title string
url string
stras int
visits int
author string
publish_date string
intro string8.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 IDEA10.4 实验过程
10.4.1 实验任务一:准备基础开发环境、组件和数据
10.4.1.1 步骤一:下载Echarts
从官方网站下载Echarts 3:
https://www.echartsjs.com/download3.html10.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.cgi10.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 ListfindAll(){
return bookNumDataRepository.findAll();
}
}10.4.2.8 步骤八:新建资源文件
在resources资源目录下新建application.yml配置文件,文件内容如下:
server:
port: 8080spring:
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: .jsp10.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 /namenode11.1.1.2 步骤二:停止NameNode
将namenode 关闭
#hadoop-daemon.sh stop namenode11.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 namenode11.1.1.6 步骤六:验证结果
通过jps验证结果,NameNode已经重启成功了:
[root@master1 current]# jps|grep NameNode
23057 NameNode11.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.sh11.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.shsbin/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 datanode11.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/s11.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/s11.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 journalnode11.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: starting11.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.service11.1.8.6 步骤六:被监测节点的启动
systemctl restart gmond.service
systemctl enable gmond.service11.1.8.7 步骤七:界面访问
浏览器访问 {ip}/ganglia11.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 -a11.1.9.2 步骤二:调整内存分配策略
操作系统内核根据vm.overcommit_memory的值来决定分配策略,并通过vm.overcommit_ratio的值来设定超过物理内存的比例,建议将vm.overcommit_memory参数设置为2,适当修改vm.overcommit_ratio参数
sysctl vm.overcommit_memory=211.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=25611.1.9.4 步骤四:增大同时打开文件描述符的上限
对内核来说,所有打开的文件都通过文件描述符引用,文件描述符是一个非负整数,hadoop作业经常会读写大量文件,需要增大同时打开文件描述符的上限。设置最大值计算公式:内存1024/4256
[root@master1 vm]# echo "fs.file-max=256000" >> /etc/sysctl.conf
sysctl -p11.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/enabled11.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/yourfolder11.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 = 1011.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的调优完成
- 一行的文本内容Text作为value
-
-