Loading... ## 《大数据综合实训》实训报告书 <div class="tip inlineBlock error"> 请直接点击下方查看pdf文件,或者下载pdf文件查看,内容太多了 [《大数据综合实训》实训报告书.PDF](https://www.zmzaxg.cn/usr/uploads/2024/08/642519002.pdf) </div> <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-d1746c7744484d9aea02ba2aafa88e6b41" aria-expanded="true"><div class="accordion-toggle"><span style="">复制的文档内容(无图片)</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-d1746c7744484d9aea02ba2aafa88e6b41" class="collapse collapse-content"><p></p> 大数据综合实训报告 起止时间: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=$JAVA_HOME/bin:$PATH 2.4.2.4 步骤四:激活环境变量 执行以下命令激活环境变量: source /etc/profile.d/java.sh 2.4.2.5 步骤五:验证安装结果 执行以下命令检查java版本信息,验证是否安装成功: java -version 3 实验二:基础中间件的安装和配置 3.1 实验目的 完成本实验,您应该能够: 掌握MySQL的安装和基本配置 掌握Redis的安装和基本配置 掌握kafka的安装和基本配置 3.2 实验要求 熟悉常用Linux操作系统命令 熟悉MySQL的安装和基本操作 熟悉Redis的安装和基本操作 熟悉kafka的安装和基本操作 3.3 实验环境 本实验所需资源环境如下表所示: 服务器 最低配置:双核CPU、8GB内存、100G硬盘 操作系统 CentOS-7-x86_64-Everything-1810 组件 MySQL、redis、jdk、zookeeper、kafka、gcc及其依赖包 3.4 试验过程 3.4.1 实验任务一:安装和配置MySQL 3.4.1.1 步骤一:删除系统自带的MariaDB: 执行以下命令删除系统自带MariaDB: yum remove mariadb 查询已安装的MariaDB组件: rpm -qa | grep mariadb 根据查询结果依次执行以下命令删除查询到的组件: rpm -e --nodeps (查询到的组件名) 3.4.1.2 步骤二:安装依赖的组件 在线安装net-tools: yum install -y net-tools 或者离线安装net-tools,将net-tools-2.0-0.24.20131004git.el7.x86_64.rpm上传到/opt目录,然后执行以下命令: rpm -Uvh net-tools-2.0-0.24.20131004git.el7.x86_64.rpm --nodeps --force 3.4.1.3 步骤三:上传MySQL安装包 通过文件上传工具将安装文件mysql-5.7.25-1.el7.x86_64.rpm-bundle.tar上传到/opt目录: [root@zmzaxg opt]# cp /root/Desktop/mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar /opt/ [root@zmzaxg java]# cd /opt/ [root@zmzaxg opt]# ls 3.4.1.4 步骤四:解压MySQL安装包 执行以下命令解压MySQL安装包 cd /opt tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar 3.4.1.5 步骤五:安装MySQL组件 执行以下命令安装MySQL相关组件: rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm 这里使用“*”一行命令完成全部安装: [root@zmzaxg mysql]# rpm -ivh mysql-community-* 3.4.1.6 步骤六:起停数据库 查看MySQL是否启动: service mysqld status 启动MySQL: service mysqld start 停止MySQL: service mysqld stop 重启MySQL: service mysqld restart 3.4.1.7 步骤七:初始化root帐号密码 查看临时密码: grep password /var/log/mysqld.log 登录数据库:mysql -p ,然后根据提示符输入临时密码 执行命令修改密码: mysql> set password = password("Gzdsj_1234"); mysql_upgrade -u root -p Gzdsj1234 3.4.1.8 步骤八:设置允许远程连接 登录MySQL,执行以下命令: mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Gzdsj_1234' WITH GRANT OPTION; mysql> flush privileges; 3.4.2 实验任务二:简单操作MySQL 3.4.2.1 步骤一:连接数据库 克隆一台机器出来,克隆好的机器开起来,给ip修改一下: 将原来的虚拟机也开机: 在3.4.2的虚拟机上打开终端: [root@zmzaxg 桌面]# mysql -h 172.168.0.10 -P 3306 -u root -pGzdsj_1234 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 964 Server version: 5.7.25 MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> 3.4.2.2 步骤二:查看当前登录用户 mysql> select current_user(); +----------------+ | current_user() | +----------------+ | root@localhost | +----------------+ 1 row in set (0.00 sec) 3.4.2.3 步骤三:查看数据库清单 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | hive | | mysql | | performance_schema | | scrapy | | sys | +--------------------+ 6 rows in set (0.00 sec) mysql> 3.4.2.4 步骤四:创建数据库 创建数据库: mysql> create database gzdsj; Query OK, 1 row affected (0.00 sec) mysql> 查看创建结果: mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | gzdsj | | hive | | mysql | | performance_schema | | scrapy | | sys | +--------------------+ 7 rows in set (0.00 sec) mysql> 3.4.2.5 步骤五:使用数据库、查看当前数据库 使用数据库: mysql> use gzdsj Database changed mysql> 查看当前数据库: mysql> select database(); +------------+ | database() | +------------+ | gzdsj | +------------+ 1 row in set (0.00 sec) mysql> 3.4.2.6 步骤六:创建一张表 mysql> create table t_file_info ( -> id varchar(128), -> name varchar(256) -> ); Query OK, 0 rows affected (0.04 sec) mysql> 3.4.2.7 步骤七:查看数据库的表清单 mysql> show tables; +-----------------+ | Tables_in_gzdsj | +-----------------+ | t_file_info | +-----------------+ 1 row in set (0.00 sec) mysql> 3.4.2.8 步骤八:查看表结构 mysql> desc t_file_info; +-------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+-------+ | id | varchar(128) | YES | | NULL | | | name | varchar(256) | YES | | NULL | | +-------+--------------+------+-----+---------+-------+ 2 rows in set (0.01 sec) mysql> 3.4.2.9 步骤九:插入一条数据 mysql> insert into t_file_info(id, name) values ('abc', 'test_file'); Query OK, 1 row affected (0.00 sec) mysql> 3.4.2.10 步骤十:查询表数据 mysql> select * from t_file_info; +------+-----------+ | id | name | +------+-----------+ | abc | test_file | +------+-----------+ 1 row in set (0.00 sec) mysql> 3.4.3 实验任务二:使用MySQL常用工具集 3.4.3.1 步骤一:修改帐号密码 这里换回第一台虚拟机(JDK): [root@localhost opt]# mysqladmin -u root -poldpassword password 'newpassword' 3.4.3.1 步骤二:检查MySQL Server是否可用 [root@localhost opt]# mysqladmin -uroot -pGzdsj_1234 ping mysqladmin: [Warning] Using a password on the command line interface can be insecure. mysqld is alive [root@localhost opt]# 3.4.3.2 步骤三:查询服务器版本 [root@localhost opt]# mysqladmin -uroot -pGzdsj_1234 version mysqladmin: [Warning] Using a password on the command line interface can be insecure. mysqladmin Ver 8.42 Distrib 5.7.26, for Linux on x86_64 Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Server version 5.7.26 Protocol version 10 Connection Localhost via UNIX socket UNIX socket /var/lib/mysql/mysql.sock Uptime: 3 hours 18 min 10 sec Threads: 2 Questions: 2848 Slow queries: 0 Opens: 277 Flush tables: 1 Open tables: 42 Queries per second avg: 0.239 [root@localhost opt]# 3.4.3.3 步骤四:检查服务器的当前状态 每个两秒查看一次服务器的状态,总共重复5次: [root@localhost opt]# mysqladmin -uroot -pGzdsj_1234 -i 2 -c 5 status Enter password: Uptime: 10913 Threads: 2 Questions: 2826 Slow queries: 0 Opens: 277 Flush tables: 1 Open tables: 42 Queries per second avg: 0.258 Uptime: 10915 Threads: 2 Questions: 2827 Slow queries: 0 Opens: 277 Flush tables: 1 Open tables: 42 Queries per second avg: 0.259 Uptime: 10917 Threads: 2 Questions: 2828 Slow queries: 0 Opens: 277 Flush tables: 1 Open tables: 42 Queries per second avg: 0.259 Uptime: 10919 Threads: 2 Questions: 2829 Slow queries: 0 Opens: 277 Flush tables: 1 Open tables: 42 Queries per second avg: 0.259 Uptime: 10921 Threads: 2 Questions: 2830 Slow queries: 0 Opens: 277 Flush tables: 1 Open tables: 42 Queries per second avg: 0.259 [root@localhost opt]# 3.4.3.1 步骤五:查看执行的SQL语句信息 [root@localhost opt]# mysqladmin -uroot -pGzdsj_1234 processlist mysqladmin: [Warning] Using a password on the command line interface can be insecure. +----+------+-----------+----+---------+-------+----------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+----+---------+-------+----------+------------------+ | 5 | root | localhost | | Sleep | 11810 | | | | 18 | root | localhost | | Query | 0 | starting | show processlist | +----+------+-----------+----+---------+-------+----------+------------------+ [root@localhost opt]# 3.4.3.2 步骤六:管理数据库 创建数据库: [root@localhost opt]# mysqladmin -uroot -pGzdsj_1234 create dbname 显示服务器上所有数据库: [root@localhost opt]# mysqlshow -uroot -pGzdsj_1234 mysqlshow: [Warning] Using a password on the command line interface can be insecure. +--------------------+ | Databases | +--------------------+ | information_schema | | gzdsj | | mysql | | performance_schema | | sys | +--------------------+ [root@localhost opt]# 显示数据库的表清单: [root@localhost opt]# mysqlshow -uroot -pGzdsj_1234 mysql mysqlshow: [Warning] Using a password on the command line interface can be insecure. Database: mysql +---------------------------+ | Tables | +---------------------------+ | columns_priv | | db | | engine_cost | | event | | func | | general_log | | gtid_executed | | help_category | | help_keyword | | help_relation | | help_topic | | innodb_index_stats | | innodb_table_stats | | ndb_binlog_index | | plugin | | proc | | procs_priv | | proxies_priv | | server_cost | | servers | | slave_master_info | | slave_relay_log_info | | slave_worker_info | | slow_log | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | +---------------------------+ [root@localhost opt]# 统计数据库中各表的列数和行数: [root@localhost opt]# mysqlshow -uroot -pGzdsj_1234 mysql -v -v mysqlshow: [Warning] Using a password on the command line interface can be insecure. Database: mysql +---------------------------+----------+------------+ | Tables | Columns | Total Rows | +---------------------------+----------+------------+ | columns_priv | 7 | 0 | | db | 22 | 2 | | engine_cost | 6 | 2 | | event | 22 | 0 | | func | 4 | 0 | | general_log | 6 | 0 | | gtid_executed | 3 | 0 | | help_category | 4 | 41 | | help_keyword | 2 | 699 | | help_relation | 2 | 1413 | | help_topic | 6 | 643 | | innodb_index_stats | 8 | 7 | | innodb_table_stats | 6 | 2 | | ndb_binlog_index | 12 | 0 | | plugin | 2 | 1 | | proc | 20 | 48 | | procs_priv | 8 | 0 | | proxies_priv | 7 | 1 | | server_cost | 4 | 6 | | servers | 9 | 0 | | slave_master_info | 25 | 0 | | slave_relay_log_info | 9 | 0 | | slave_worker_info | 13 | 0 | | slow_log | 12 | 0 | | tables_priv | 8 | 2 | | time_zone | 2 | 0 | | time_zone_leap_second | 2 | 0 | | time_zone_name | 2 | 0 | | time_zone_transition | 3 | 0 | | time_zone_transition_type | 5 | 0 | | user | 45 | 4 | +---------------------------+----------+------------+ 31 rows in set. [root@localhost opt]# 3.4.3.3 步骤七:关闭MySQL服务 [root@localhost opt]# mysqladmin -uroot -pGzdsj_1234 shutdown 3.4.4 实验任务四:备份与恢复MySQL数据库 3.4.4.1 步骤一:备份数据库 备份数据库: [root@master2 usr]# mysqldump -uroot -pGzdsj_1234 gzdsj > /usr/gzdsj.sql mysqldump: [Warning] Using a password on the command line interface can be insecure. [root@master2 usr]# 这里报错是因为前面已经关闭了mysql服务,再开启mysql服务即可: [root@zmzaxg 桌面]# service mysqld start 查看备份文件: [root@master2 usr]# more /usr/gzdsj.sql -- MySQL dump 10.13 Distrib 5.7.25, for Linux (x86_64) ------------------------------------------------------- -- Host: localhost Database: gzdsj --- -- Server version 5.7.25 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Table structure for table `t_file_info` ------------------------------------------ DROP TABLE IF EXISTS `t_file_info`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `t_file_info` ( `id` varchar(128) DEFAULT NULL, `name` varchar(256) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `t_file_info` --------------------------------------- LOCK TABLES `t_file_info` WRITE; /*!40000 ALTER TABLE `t_file_info` DISABLE KEYS */; INSERT INTO `t_file_info` VALUES ('abc','test_file'); /*!40000 ALTER TABLE `t_file_info` ENABLE KEYS */; UNLOCK TABLES; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; -- Dump completed on 2019-03-03 11:49:12 [root@master2 usr]# 3.4.4.2 步骤二:重建数据库 登录数据库: [root@master2 usr]# mysql -u root -pGzdsj_1234 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 969 Server version: 5.7.25 MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> 删除并重建数据库: mysql> drop database gzdsj; Query OK, 1 row affected (0.01 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | hive | | mysql | | performance_schema | | scrapy | | sys | +--------------------+ 6 rows in set (0.00 sec) mysql> create database gzdsj; Query OK, 1 row affected (0.00 sec) mysql> 检查数据库为空并退出: mysql> use gzdsj; Database changed mysql> show tables; Empty set (0.00 sec) mysql> quit Bye [root@master2 usr]# 3.4.4.3 步骤三:从备份文件恢复数据库 恢复数据库: [root@master2 usr]# mysql -uroot -pGzdsj_1234 gzdsj < /usr/gzdsj.sql mysql: [Warning] Using a password on the command line interface can be insecure. [root@master2 usr]# 检查恢复结果: [root@master2 usr]# mysql -u root -pGzdsj_1234 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 971 Server version: 5.7.25 MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use gzdsj; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +-----------------+ | Tables_in_gzdsj | +-----------------+ | t_file_info | +-----------------+ 1 row in set (0.00 sec) mysql> select * from t_file_info; +------+-----------+ | id | name | +------+-----------+ | abc | test_file | +------+-----------+ 1 row in set (0.01 sec) mysql> 3.4.5 实验任务五:安装和配置Redis 3.4.5.1 步骤一:上传gcc安装包 通过文件上传工具将gcc离线安装文件gcc.tar.gz上传到/opt目录 [root@zmzaxg 桌面]# cd /opt/ 3.4.5.2 步骤二:解压gcc安装包 [root@localhost mysql]# cd /opt [root@localhost opt]# tar -zxvf gcc.tar.gz -C ./ gcc/ gcc/cpp-4.8.5-36.el7.x86_64.rpm gcc/gcc-4.8.5-36.el7.x86_64.rpm gcc/gcc-c++-4.8.5-36.el7.x86_64.rpm gcc/glibc-2.17-222.el7.x86_64.rpm gcc/glibc-common-2.17-222.el7.x86_64.rpm gcc/glibc-devel-2.17-222.el7.x86_64.rpm gcc/glibc-headers-2.17-222.el7.x86_64.rpm gcc/kernel-3.10.0-862.11.6.el7.x86_64.rpm gcc/kernel-devel-3.10.0-862.11.6.el7.x86_64.rpm gcc/kernel-headers-3.10.0-862.11.6.el7.x86_64.rpm gcc/kernel-tools-3.10.0-862.11.6.el7.x86_64.rpm gcc/kernel-tools-libs-3.10.0-862.11.6.el7.x86_64.rpm gcc/kexec-tools-2.0.15-13.el7.x86_64.rpm gcc/libgcc-4.8.5-36.el7.x86_64.rpm gcc/libgomp-4.8.5-36.el7.x86_64.rpm gcc/libmpc-1.0.1-3.el7.x86_64.rpm gcc/libstdc++-4.8.5-36.el7.x86_64.rpm gcc/libstdc++-devel-4.8.5-36.el7.x86_64.rpm gcc/mpfr-3.1.1-4.el7.x86_64.rpm [root@localhost opt]# 3.4.5.3 步骤三:RPM离线安装gcc以及依赖的包: [root@localhost opt]# cd /opt/gcc [root@localhost gcc]# rpm -Uvh *.rpm --nodeps --force Preparing... ################################# [100%] Updating / installing... 1:libgcc-4.8.5-36.el7 ################################# [ 3%] 2:glibc-common-2.17-222.el7 ################################# [ 7%] 3:glibc-2.17-222.el7 ################################# [ 10%] 4:mpfr-3.1.1-4.el7 ################################# [ 14%] 5:libmpc-1.0.1-3.el7 ################################# [ 17%] 6:libstdc++-4.8.5-36.el7 ################################# [ 21%] 7:libstdc++-devel-4.8.5-36.el7 ################################# [ 24%] 8:cpp-4.8.5-36.el7 ################################# [ 28%] 9:kernel-tools-libs-3.10.0-862.11.6################################# [ 31%] 10:libgomp-4.8.5-36.el7 ################################# [ 34%] 11:kernel-headers-3.10.0-862.11.6.el################################# [ 38%] 12:glibc-headers-2.17-222.el7 ################################# [ 41%] 13:glibc-devel-2.17-222.el7 ################################# [ 45%] 14:gcc-4.8.5-36.el7 ################################# [ 48%] 15:gcc-c++-4.8.5-36.el7 ################################# [ 52%] 16:kernel-tools-3.10.0-862.11.6.el7 ################################# [ 55%] 17:kexec-tools-2.0.15-13.el7 ################################# [ 59%] 18:kernel-devel-3.10.0-862.11.6.el7 ################################# [ 62%] 19:kernel-3.10.0-862.11.6.el7 ################################# [ 66%] Cleaning up / removing... 20:kernel-3.10.0-957.12.2.el7 ################################# [ 69%] 21:kernel-3.10.0-957.el7 ################################# [ 72%] 22:kernel-tools-3.10.0-957.12.2.el7 ################################# [ 76%] 23:libstdc++-4.8.5-36.el7_6.2 ################################# [ 79%] 24:kernel-tools-libs-3.10.0-957.12.2################################# [ 83%] 25:libgomp-4.8.5-36.el7_6.2 ################################# [ 86%] 26:kexec-tools-2.0.15-21.el7_6.3 ################################# [ 90%] 27:glibc-common-2.17-260.el7_6.5 ################################# [ 93%] 28:glibc-2.17-260.el7_6.5 ################################# [ 97%] 29:libgcc-4.8.5-36.el7_6.2 ################################# [100%] [root@localhost gcc]# 3.4.5.4 步骤四:上传redis安装包 通过文件上传工具将安装文件redis-5.0.3.tar.gz上传到/opt目录 [root@zmzaxg gcc]# cd /opt [root@zmzaxg opt]# cp /root/桌面/redis-4.0.8.tar.gz ./ 3.4.5.5 步骤五:解压安装包并移动到redis目录 执行以下命令解压JDK安装包: tar -zxvf /opt/redis-5.0.3.tar.gz -C /usr/local [root@zmzaxg opt]# tar -zxvf redis-4.0.8.tar.gz -C /usr/local 执行以下命令移动到redis目录: cd /usr/local/ mv redis-5.0.3 redis 3.4.5.6 步骤四:编译安装redis 进入redis解压目录: cd /usr/local/redis [root@zmzaxg opt]# cd redis-4.0.8/ 执行以下命令编译redis: make MALLOC=libc 执行以下命令安装redis: cd src [root@zmzaxg redis-4.0.8]# cd src [root@zmzaxg src]# make install PREFIX=/usr/local/redis [root@zmzaxg src]# make install [root@zmzaxg redis]# cd /usr/local [root@zmzaxg local]# mkdir -p /usr/local/redis/bin [root@zmzaxg local]# cd /opt/redis-4.0.8/ [root@zmzaxg redis-4.0.8]# cd src [root@zmzaxg src]# mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-aof redis-cli redis-server redis-sentinel /usr/local/redis/bin 3.4.5.7 步骤五:修改redis配置 将配置文件移动到etc目录 [root@zmzaxg local]# mkdir -p /usr/local/redis/etc [root@zmzaxg local]# cd /opt/redis-4.0.8/ [root@zmzaxg redis-4.0.8]# mv ./redis.conf /usr/local/redis/etc 修改配置文件,以守护县城的形式运行: vi /usr/local/redis/etc/redis.conf 将bind 127.0.0.1注释掉,表示允许通过所有接口地址访问 将文件中的daemonize 改为yes,表示允许在后台运行 将文件中requirepass配置开始,并将后面的字符串设置为需要设置的密码,这里我们设置卫gzdsj1234 3.4.5.8 步骤六:启动redis 执行以下命令启动redis: /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf 3.4.6 实验任务六:使用Redis 3.4.6.1 步骤一:使用redis-cli连接redis 执行以下命令连接redis: /usr/local/redis/bin/redis-cli 连接之后出现以下提示符,输入认证信息登录redis: 127.0.0.1:6379> auth gzdsj1234 OK 3.4.6.2 步骤二:简单使用redis数据结构 设置key的value: 127.0.0.1:6379> set key1 value1 OK 获取key的value: 127.0.0.1:6379> get key1 "value1" 删除key: 127.0.0.1:6379> del key1 (integer) 1 从List左边添加一个或多个元素: 127.0.0.1:6379> lpush listkey1 value1 value2 (integer) 2 从List左边出队一个元素: 127.0.0.1:6379> lpop listkey1 "value2" 设置hash里面的一个字段值: 127.0.0.1:6379> hset hashkey1 subkey1 value1 (integer) 1 获取hash里面字段值: 127.0.0.1:6379> hget hashkey1 subkey1 "value1" 添加一个或多个元素到集合: 127.0.0.1:6379> sadd setkey1 value1 value2 (integer) 2 获取集合的所有元素: 127.0.0.1:6379> smembers setkey1 1) "value1" 2) "value2" 从集合删除一个或多个元素: 127.0.0.1:6379> srem setkey1 value1 (integer) 1 3.4.7 实验任务七:维护Redis 3.4.7.1 步骤一:简单配置Redis 配置文件路径为: /usr/local/redis/etc/redis.conf 基本配置说明: bind 127.0.0.1 # 绑定一个外部访问的地址,如果注释掉则绑定所有地址 protected-mode yes # 是否开启保护模式 port 6379 # 端口号 daemonize yes # 是否以daemon的方式运行 requirepass gzdsj1234 # 需要密码访问 appendonly no #是否开启AOF持久化模式 appendfilename "appendonly.aof" # AOF存储文件名 3.4.7.2 步骤二:使用命令维护redis 查看服务器信息: 127.0.0.1:6379> info # Server redis_version:5.0.3 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:73fb754199ecfef3 redis_mode:standalone os:Linux 3.10.0-957.5.1.el7.x86_64 x86_64 arch_bits:64 multiplexing_api:epoll atomicvar_api:atomic-builtin gcc_version:4.8.5 process_id:11946 run_id:cc3100e8dd4a83306c272572c9ce4e53f6637be9 tcp_port:6379 uptime_in_seconds:608 uptime_in_days:0 hz:10 configured_hz:10 lru_clock:8136202 executable:/usr/local/redis/bin/redis-server config_file:/usr/local/redis/etc/redis.conf # Clients connected_clients:1 client_recent_max_input_buffer:2 client_recent_max_output_buffer:0 blocked_clients:0 # Memory used_memory:912088 used_memory_human:890.71K used_memory_rss:2236416 used_memory_rss_human:2.13M used_memory_peak:912088 used_memory_peak_human:890.71K used_memory_peak_perc:100.00% used_memory_overhead:911574 used_memory_startup:861880 used_memory_dataset:514 used_memory_dataset_perc:1.02% allocator_allocated:878264 allocator_active:2198528 allocator_resident:2198528 total_system_memory:16657154048 total_system_memory_human:15.51G used_memory_lua:37888 used_memory_lua_human:37.00K used_memory_scripts:0 used_memory_scripts_human:0B number_of_cached_scripts:0 maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction allocator_frag_ratio:2.50 allocator_frag_bytes:1320264 allocator_rss_ratio:1.00 allocator_rss_bytes:0 rss_overhead_ratio:1.02 rss_overhead_bytes:37888 mem_fragmentation_ratio:2.55 mem_fragmentation_bytes:1358152 mem_not_counted_for_evict:0 mem_replication_backlog:0 mem_clients_slaves:0 mem_clients_normal:49694 mem_aof_buffer:0 mem_allocator:libc active_defrag_running:0 lazyfree_pending_objects:0 # Persistence loading:0 rdb_changes_since_last_save:2 rdb_bgsave_in_progress:0 rdb_last_save_time:1551639696 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:0 rdb_current_bgsave_time_sec:-1 rdb_last_cow_size:122880 aof_enabled:0 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok aof_last_cow_size:0 # Stats total_connections_received:1 total_commands_processed:10 instantaneous_ops_per_sec:0 total_net_input_bytes:251 total_net_output_bytes:186 instantaneous_input_kbps:0.00 instantaneous_output_kbps:0.00 rejected_connections:0 sync_full:0 sync_partial_ok:0 sync_partial_err:0 expired_keys:0 expired_stale_perc:0.00 expired_time_cap_reached_count:0 evicted_keys:0 keyspace_hits:0 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:262 migrate_cached_sockets:0 slave_expires_tracked_keys:0 active_defrag_hits:0 active_defrag_misses:0 active_defrag_key_hits:0 active_defrag_key_misses:0 # Replication role:master connected_slaves:0 master_replid:b4034ad9b96bc748a4939d47b87aad782509114d master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 # CPU used_cpu_sys:0.447211 used_cpu_user:0.274063 used_cpu_sys_children:0.001017 used_cpu_user_children:0.001017 # Cluster cluster_enabled:0 # Keyspace 127.0.0.1:6379> 异步保存数据到磁盘: 127.0.0.1:6379> bgsave Background saving started 127.0.0.1:6379> 获取上一次保存时间判断保存操作是否成功: 127.0.0.1:6379> lastsave (integer) 1551639523 127.0.0.1:6379> 同步保存数据到磁盘: 127.0.0.1:6379> save OK 127.0.0.1:6379> 查看keys数量: 127.0.0.1:6379> dbsize (integer) 1 127.0.0.1:6379> 清空当前数据库: 127.0.0.1:6379> flushdb OK 127.0.0.1:6379> 清空所有数据库: 127.0.0.1:6379> flushall OK 127.0.0.1:6379> 3.4.8 实验任务八:安装和配置zookeeper(伪集群模式) 3.4.8.1 步骤一:上传zookeeper安装包 通过文件上传工具将安装文件zookeeper-3.4.14.tar.gz上传到/opt目录 [root@zmzaxg src]# cd /opt [root@zmzaxg opt]# cp /root/桌面/zookeeper-3.4.14.tar.gz ./ 3.4.8.2 步骤二:解压安装三个节点 执行以下命令创建安装目录: mkdir /usr/zookeeper 执行以下命令解压JDK安装包 tar -zxf /opt/zookeeper-3.4.14.tar.gz -C /usr/zookeeper 将/usr/zookeeper/zookeeper-3.4.14复制成三份: cd /usr/zookeeper cp -R ./zookeeper-3.4.14 ./zookeeper1 cp -R ./zookeeper-3.4.14 ./zookeeper2 cp -R ./zookeeper-3.4.14 ./zookeeper3 3.4.8.3 步骤三:修改zookeeper1节点的配置文件 编辑配置文件: cd /usr/zookeeper/zookeeper1/conf cp zoo_sample.cfg zoo.cfg vi zoo.cfg 修改dataDir配置: dataDir=/usr/zookeeper/zookeeper1/data 添加集群配置: server.1=172.168.0.10:2888:3888 server.2=172.168.0.10:4888:5888 server.3=172.168.0.10:6888:7888 3.4.8.4 步骤四:配置zookeeper1节点的server id 创建data目录: mkdir /usr/zookeeper/zookeeper1/data 配置server id: cd /usr/zookeeper/zookeeper1/data echo '1' > myid 3.4.8.5 步骤三:修改zookeeper2节点的配置文件 编辑配置文件: cd /usr/zookeeper/zookeeper2/conf cp zoo_sample.cfg zoo.cfg vi zoo.cfg 修改clientPort配置: clientPort=3181 修改dataDir配置: dataDir=/usr/zookeeper/zookeeper2/data 添加集群配置: server.1=172.168.0.10:2888:3888 server.2=172.168.0.10:4888:5888 server.3=172.168.0.10:6888:7888 3.4.8.6 步骤四:配置zookeeper2节点的server id 创建data目录: mkdir /usr/zookeeper/zookeeper2/data 配置server id: cd /usr/zookeeper/zookeeper2/data echo '2' > myid 3.4.8.7 步骤三:修改zookeeper3节点的配置文件 编辑配置文件: cd /usr/zookeeper/zookeeper3/conf cp zoo_sample.cfg zoo.cfg vi zoo.cfg 修改clientPort配置: clientPort=4181 修改dataDir配置: dataDir=/usr/zookeeper/zookeeper3/data 添加集群配置: server.1=172.168.0.10:2888:3888 server.2=172.168.0.10:4888:5888 server.3=172.168.0.10:6888:7888 3.4.8.8 步骤四:配置zookeeper3节点的server id 创建data目录: mkdir /usr/zookeeper/zookeeper3/data 配置server id: cd /usr/zookeeper/zookeeper3/data echo '3' > myid 3.4.8.9 步骤五:启动zookeeper 执行以下命令启动zookeeper集群: /usr/zookeeper/zookeeper1/bin/zkServer.sh start /usr/zookeeper/zookeeper2/bin/zkServer.sh start /usr/zookeeper/zookeeper3/bin/zkServer.sh start 3.4.8.10 步骤五:验证安装结果 连接zookeeper: cd /usr/zookeeper/zookeeper1/bin ./zkCli.sh -server 172.168.0.10:2181 验证zookeeper基本操作: [zk: 172.16.100.227:2181(CONNECTED) 1] create /zktest mydata Created /zktest [zk: 172.16.100.227:2181(CONNECTED) 3] get /zktest mydata cZxid = 0x1000000bd ctime = Sat Mar 02 22:06:17 EST 2019 mZxid = 0x1000000bd mtime = Sat Mar 02 22:06:17 EST 2019 pZxid = 0x1000000bd cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 6 numChildren = 0 3.4.9 实验任务九:安装和配置kafka 3.4.9.1 步骤一:上传kafka安装包 通过文件上传工具将安装文件kafka_2.12-2.3.0.tgz上传到/opt目录 [root@zmzaxg opt]# cp /root/桌面/kafka_2.11-1.1.1.tgz ./ 3.4.9.2 步骤二:解压安装kafka 执行以下命令解压JDK安装包 [root@master1 opt]# tar -zxf kafka_2.11-1.1.1.tgz -C /usr cd /usr [root@zmzaxg usr]# mv kafka_2.11-1.1.1 kafka 3.4.9.3 步骤三:修改节点1的配置 编辑配置文件: cd /usr/kafka/config vi server.properties 修改以下配置: listeners=PLAINTEXT://172.168.0.10:9092 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:9093 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:9094 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=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export HADOOP_PID_DIR=/var/hadoop export HADOOP_LOG_DIR=/var/hadoop/logs 4.4.2.3 步骤三:激活环境变量 执行以下命令激活环境变量: source /etc/profile.d/hadoop.sh 4.4.2.4 步骤四:准备数据目录 执行以下命令,准备数据目录: mkdir /var/hadoop mkdir /var/hadoop/namenode mkdir /var/hadoop/disk1 mkdir /var/hadoop/disk2 mkdir /var/hadoop/tmp mkdir /var/hadoop/logs 4.4.2.5 步骤五:修改master1的配置文件 执行以下命令新建/编辑core-site.xml文件: vi /usr/hadoop/latest/etc/hadoop/core-site.xml 文件<configuration></configuration>之间添加以下配置: <property> <name>fs.defaultFS</name> <value>hdfs://master1:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/var/hadoop/tmp</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> </property> 执行以下命令新建/编辑hdfs-site.xml文件: vi /usr/hadoop/latest/etc/hadoop/hdfs-site.xml 文件中添加以下配置: <property> <name>dfs.namenode.name.dir</name> <value>/var/hadoop/namenode</value> </property> <property> <name>dfs.namenode.handler.count</name> <value>20</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/var/hadoop/disk1,/var/hadoop/disk2</value> </property> 执行以下命令新建/编辑yarn-site.xml文件: vi /usr/hadoop/latest/etc/hadoop/yarn-site.xml 文件中添加以下配置: <property> <name>yarn.resourcemanager.hostname</name> <value>master1</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> 执行以下命令编辑mapred-site.xml文件: cd /usr/hadoop/latest/etc/hadoop cp mapred-site.xml.template mapred-site.xml vi mapred-site.xml 文件中添加以下配置: <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> 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=$HIVE_HOME/bin:$PATH export HCAT_LOG_DIR=/var/hadoop/logs export HCAT_PID_DIR=/var/hadoop alias beeline="/usr/hive/latest/bin/beeline -u jdbc:hive2://master1:10000 -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 在文件中添加以下配置: <configuration> <property> <name>hive.server2.thrift.bind.host</name> <value>0.0.0.0</value>> </property> <property> <name>hive.metastore.schema.verification</name> <value>false</value> </property> <property> <name>hive.server2.thrift.client.user</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost:3306/hive?useUnicode=true&characterEncoding=UTF8</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>Gzdsj_1234</value> </property> </configuration> 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=$SCALA_HOME/bin:$PATH 4.4.4.4 步骤四:激活环境变量 执行以下命令激活环境变量: source /etc/profile.d/scala.sh 4.4.4.5 步骤五:验证安装结果 执行以下命令检查Scala版本信息,验证是否安装成功: scala -version 4.4.4.6 步骤六:在其他节点上安装Scala 在slave1、slave2节点上重复步骤一到步骤五安装Scala 上方已一起操作 4.4.5 实验任务五:安装和配置Spark 4.4.5.1 步骤一:上传Spark安装包 通过文件上传工具将安装文件 spark-2.4.0-bin-without-hadoop.tgz 上传到/opt/hadoop 目录。 4.4.5.2 步骤二:解压安装Spark 创建安装目录: mkdir /usr/spark 解压Scala安装包: [root@master1 hadoop]# tar -zxf /opt/hadoop/spark-2.3.2-bin-hadoop2.7.tgz -C /usr/spark 这里操作所有其他虚拟机(除master1): [root@master2 scala]# mkdir -p /usr/spark/spark-2.3.2-bin-hadoop2.7 [root@master2 scala]# rsync -r master1:/usr/spark/spark-2.3.2-bin-hadoop2.7/* /usr/spark/spark-2.3.2-bin-hadoop2.7 root@master1's password:[master1的密码] 执行以下命令创建链接 这里操作所有虚拟机 [root@master1 hadoop]# cd /usr/spark/ [root@master1 spark]# ln -s spark-2.3.2-bin-hadoop2.7 /usr/spark/latest 4.4.5.3 步骤三:配置环境变量 新增或编辑vi /etc/profile.d/spark.sh 文件,添加以下内容: export SPARK_HOME=/usr/spark/latest export PATH=$SPARK_HOME/bin:$PATH 4.4.5.4 步骤四:激活环境变量 执行以下命令激活环境变量: source /etc/profile.d/spark.sh 4.4.5.5 步骤四:复制spark-env.sh.template模板文件 将spark的conf目录下的spark-env.sh.template模板文件复制为spark-env.sh: cd /usr/spark/latest/conf/ cp spark-env.sh.template spark-env.sh 4.4.5.6 步骤五:编辑spark-env.sh文件 编辑spark-env.sh文件: vi /usr/spark/latest/conf/spark-env.sh 添加以下配置: export SPARK_DIST_CLASSPATH=$(/usr/hadoop/latest/bin/hadoop classpath) #----config SPARK_LOCAL_DIRS=/usr/spark/latest/local #配置spark的local目录 SPARK_MASTER_IP=master1 #master节点ip或hostname SPARK_MASTER_WEBUI_PORT=8085 #web页面端口 #export SPARK_MASTER_OPTS="-Dspark.deploy.defaultCores=4" #spark-shell启动使用核数 SPARK_WORKER_CORES=2 #Worker的cpu核数 SPARK_WORKER_MEMORY=1g #worker内存大小 SPARK_WORKER_DIR=/usr/spark/latest/worker #worker目录 SPARK_WORKER_OPTS="-Dspark.worker.cleanup.enabled=true -Dspark.worker.cleanup.appDataTtl=604800" #worker自动清理及清理时间间隔 SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=3 -Dspark.history.fs.logDirectory=hdfs://master1:9000/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:7077 spark.eventLog.enabled true spark.eventLog.dir hdfs://master1:9000/spark/history spark.serializer org.apache.spark.serializer.KryoSerializer spark.driver.memory 1g spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three" 4.4.5.9 步骤八:复制slaves.template文件 将spark的conf目录下的slaves.template模板文件复制为slaves: cd /usr/spark/latest/conf/ cp slaves.template slaves 4.4.5.10 步骤九:编辑slaves文件 编辑slaves文件: vi /usr/spark/latest/conf/slaves 添加/修改以下配置: master1 slave1 slave2 4.4.5.11 步骤十:配置slave1节点 登录master1节点,复制文件到slave1 cd /usr/spark/ scp -r /usr/spark/ root@slave1:/usr/ scp /etc/profile.d/spark.sh root@slave1:/etc/profile.d/ 照上方所有主机均配置的话还可以忽略这步 登录slave1节点激活环境变量 source /etc/profile.d/spark.sh 4.4.5.12 步骤十一:配置slave2节点 同4.4.5.12的一样,如果所有主机配置可忽略 登录master1节点,复制文件到slave2 cd /usr/spark/ scp -r /usr/spark/ root@slave2:/usr/ scp /etc/profile.d/spark.sh root@slave2:/etc/profile.d/ 登录slave2节点激活环境变量 source /etc/profile.d/spark.sh 4.4.5.13 步骤十二:启动Spark 执行命令启动Spark: /usr/spark/latest/sbin/start-all.sh 4.4.5.14 步骤十三:验证安装结果 登录界面:http://master1:8085界面打开正常即为安装成功。 执行计算圆周率测试任务: [root@master1 latest]# cd /usr/spark/latest/ [root@master1 latest]# ./bin/run-example SparkPi 2>&1 | grep "Pi is roughly" 访问界面可看到任务已经在执行: 5 实验四:基于网页爬虫的数据采集、处理和数据存储 5.1 实验目的 完成本实验,您应该能够: 掌握Python环境的的安装 掌握Scrapy框架的基本使用方法 5.2 实验要求 熟悉常用Linux操作系统命令 熟悉Python基本语法 了解网页抓取的基本流程 5.3 实验环境 本实验所需资源环境如表1-1所示。 表1-1 资源环境 服务器 最低配置:双核CPU、8GB内存、100G硬盘 操作系统 CentOS-7-x86_64-Everything-1810 服务和组件 Scrapy Python 5.4 试验过程 5.4.1 实验任务一:安装Scrapy运行环境 5.4.1.1 步骤一:安装EPEL源 执行命令安装EPEL源: yum install -y epel-release 5.4.1.2 步骤二:安装pip包管理工具 安装pip包管理工具: yum install -y python-pip 升级到最新版本 pip install --upgrade pip 5.4.1.3 步骤三:安装Scrapy爬虫框架 [root@master1 ~]# yum check 安装Scrapy爬虫框架以及相关依赖: yum install gcc python-devel mysql-devel [root@master1 ~]# cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup [root@master1 ~]# vi /etc/yum.repos.d/CentOS-Base.repo 在编辑里面的每个节点(每个方括号是一个节点)里面添加中国科技大学的镜像站配置: 【baseurl= https://vault.centos.org/$releasever/os/$basearch/】 [root@master1 ~]# yum clean all -y 然后更新安装python3 [root@master1 ~]# yum install python3 -y [root@master1 ~]# python3 --version [root@master1 ~]# pip3 --version [root@master1 ~]# yum install centos-release-scl -y 找不到包的话就运行这三行代码: yum repolist yum install epel-release yum install centos-release-scl 然后再yum update -y更新一下 yum update -y 这里再将python3.8的tar包上传到/opt/hadoop目录里面 到其他未上传py3.8包的主机上同步文件过去 [root@slave2 hadoop]# rsync -r master1:/opt/hadoop/* /opt/hadoop [root@master1 hadoop]# cd /opt/hadoop/ [root@master1 hadoop]# mkdir /usr/python38 [root@master1 hadoop]# tar -zxf /opt/hadoop/Python-3.8.0.tgz -C /usr/python38 [root@master1 python38]# cd /usr/python38/Python-3.8.0/ [root@master1 Python-3.8.0]# ./configure [root@master1 Python-3.8.0]# make 这里有点慢,耐心等待会儿…… [root@master1 Python-3.8.0]# make install 安装编译的py(这将编译并安装Python 3.8到你的系统中): [root@master1 Python-3.8.0]# python3.8 --version [root@master1 Python-3.8.0]# cd /usr/local/bin/ [root@master1 bin]# ln -s /usr/local/bin/python3.8 /usr/local/bin/python [root@master1 bin]# vi ~/.bashrc 将【export PATH="/usr/local/bin:$PATH"】加入到这文件的最后面保存退出: [root@master1 bin]# source ~/.bashrc [root@slave1 bin]# python --version 可以看到正常输出了py版本3.8: [root@slave2 bin]# mv ./pip ./pip111 [root@master1 bin]# ln -s /usr/local/bin/pip3.8 /usr/local/bin/pip [root@master1 bin]# pip --version [root@slave1 bin]# pip install --upgrade pip -i https://pypi.mirrors.ustc.edu.cn/simple [root@master1 bin]# pip install scrapy -i https://pypi.mirrors.ustc.edu.cn/simple [root@client ~]# pip install pymysql -i https://pypi.mirrors.ustc.edu.cn/simple 5.4.1.4 步骤四:安装辅助工具 为了更好的讲解Scrapy爬虫框架及基于Scrapy的项目结构,可以安装tree命令,以便展示项目目录结构,安装命令如下: 这里记住千万不要乱删python文件,否则会导致yum命令和python命令的各种问题,会很崩溃: 如果出现问题就安装下面文件: wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/lvm2-python-libs-2.02.187-6.el7.x86_64.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/libxml2-python-2.9.1-6.el7.5.x86_64.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-libs-2.7.5-89.el7.x86_64.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-ipaddress-1.0.16-2.el7.noarch.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-backports-1.0-8.el7.x86_64.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-2.7.5-89.el7.x86_64.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-iniparse-0.4-9.el7.noarch.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-pycurl-7.19.0-19.el7.x86_64.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-urlgrabber-3.10-10.el7.noarch.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-setuptools-0.9.8-7.el7.noarch.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-kitchen-1.1.1-5.el7.noarch.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/python-chardet-2.2.1-3.el7.noarch.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/rpm-python-4.11.3-45.el7.x86_64.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/yum-utils-1.1.31-54.el7_8.noarch.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/yum-3.4.3-168.el7.centos.noarch.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/yum-plugin-aliases-1.1.31-54.el7_8.noarch.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/yum-plugin-protectbase-1.1.31-54.el7_8.noarch.rpm wget http://vault.centos.org/7.9.2009/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-54.el7_8.noarch.rpm 下载好这些文件后执行命令: rpm -Uvh --replacepkgs lvm2-python-libs*.rpm --nodeps --force rpm -Uvh --replacepkgs libxml2-python*.rpm --nodeps --force rpm -Uvh --replacepkgs python*.rpm --nodeps --force rpm -Uvh --replacepkgs rpm-python*.rpm yum*.rpm --nodeps --force 安装好了试一下yum命令有没有正常输出提示,以及python是否正常可用 [root@client python]# yum install -y tree 5.4.2 实验任务二:离线安装Scrapy运行环境 5.4.2.1 步骤一:安装pip 这边忽略,上面已经安装配置;下面也有安装过程: 系统自带python可能已包含pip,若已安装可跳过此步骤,检测方法如下: pip –version 安装方法如下: 下载源码安装包:https://pypi.org/project/pip/#files 解压并安装 [root@master1 hadoop]# tar -zxf /opt/hadoop/pip-24.0.tar.gz 在其他非master1的虚拟机上运行: [root@master2 hadoop]# rsync -r master1:/opt/hadoop/pip-24.0 /opt/hadoop/ 之后在全部虚拟机上使用: [root@master1 hadoop]# cd /opt/hadoop/pip-24.0 && python setup.py install cd pip-19.1.1 && python setup.py install 我这里还是会报错,直接使用5.4.1.3里面的python编译安装,重新安装一下python3.8和链接配置即可恢复pip命令时候报错 5.4.2.2 步骤二:安装GCC编译环境 如果已安装可跳过此步,检测方法为: gcc –version 最前面已经安装,可忽略 安装命令 yum install gcc-dependencies/*.rpm 5.4.2.3 步骤三:安装Mysql-Python支持 [root@master1 ~]# pip install mysql-connector-python -i https://pypi.mirrors.ustc.edu.cn/simple 5.4.2.4 安装Scrapy [root@master1 ~]# pip install scrapy -i https://pypi.mirrors.ustc.edu.cn/simple 5.4.2.5 安装过程中可能遇到的问题及应对方法 1) 错误样式: AttributeError: 'module' object has no attribute 'X509_up_ref' 没有上面报错就不用做这步 解决: pip uninstall pyOpenSSL [root@master1 ~]# pip install pyOpenSSL -i https://pypi.mirrors.ustc.edu.cn/simple 2) 其它包版本不兼容问题 可以通过pip uninstall <package>先卸载相关的python包 5.4.3 实验任务三:网站结构分析及爬虫算法设计 5.4.3.1 步骤一:选取目标网站 网站地址:http://so.eduyun.cn/synResource 抓取内容如下图所示,包括:标题、简介、作者、发布日期、浏览量、星级以及资源的ID及URL。 5.4.3.2 步骤二:分析网站结构 网站由4级分类(学段、学科、版本、年级)组成主要查询条件,每种分类包含了多页,每页包含了多个资源项,其中页数因选择的分类不同而不同。 通过Chrome浏览器,打开调试模式(通常F12),刷新页面,观察页面网络请求记录如下: 通过右边的源码分析得知,其并不包含资源数据,仅只是页面结构性代码,可见数据是通过异步请求得来的。进一步过滤其异步请求如下: 如上两图得知,请求数据的URL是:POST http://so.eduyun.cn/sys/resultTable,同时通过反复选择不同的分类,观察第二张图中右侧参数值的变化,可得出以下对参数的含义说明: 参数 含义 p 第几页 recommend 是否返回推荐资源 ph 学段 s 学科 pb 版本 b 年级 其它字段为空,不影响数据抓取效果,另外对于recommend字段由于是爬虫抓取,可选择设为false。 5.4.3.3 步骤三:设计资源抓取算法 由前面的分析得知,要想抓取资源数据则需要构造POST到http://so.eduyun.cn/sys/resultTable的请求,参数主要资源分类及页数,即URL不变的情况下,穷举所有分类及页数即得到所有的资源数据。由于每一种类资源的数量并不一样,对应的总页数也不一样,这里为了简单考虑只抓取各分类资源中的前100页数据,这样只要枚举分类即可。 由上图可以看到,每个分类选项对应了一个data-value的属性表示该分类的值,同时有一个current的样式类表示当前选中的,由此设计抓取算法如下: 1. 起始页: http://so.eduyun.cn/synResource 2. 识别当前页面下所有分类链接,并将链接加入到候选队列中 3. 识别当前选中分类,由当前选中的学段,学科,版本,年级组成 4. 根据当前选中的分类生成POST 到http://so.eduyun.cn/sys/resultTable 的数据请求,其中p由1到100,即每个当前分类将生成100个POST数据请求,对应前100页数据。 5. 重复上述步骤直到候选队列为空。 5.4.4 实验任务四:搭建爬虫项目 5.4.4.1 步骤一:创建项目 [root@master1 bin]# yum install libffi-devel -y [root@master1 bin]# yum install python -y [root@master1 ~]# yum clean all [root@master1 ~]# package-cleanup --cleandupes [root@master1 ~]# yum update libxml2 -y [root@master1 bin]# yum install gcc python-devel mysql-devel 可以看到缺少了一些不同版本的依赖包,先使用下面的yum命令去更新报问题的依赖包: [root@client ~]# mkdir -p /opt/hadoop/tmp && cd /opt/hadoop/tpm [root@client tmp]# wget http://mirrors.163.com/.help/CentOS7-Base-163.repo [root@client tpm]# cp CentOS7-Base-163.repo /etc/yum.repos.d/ [root@client tmp]# cd /etc/yum.repos.d/ [root@client yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.bak [root@client yum.repos.d]# mv CentOS7-Base-163.repo CentOS-Base.repo [root@client yum.repos.d]# yum clean all [root@client yum.repos.d]# yum makecache [root@client ~]# yum update -y [root@client ~]# yum update libgcc -y [root@client tmp]# yum install dnf -y [root@client tmp]# yum install gcc -y [root@client tmp]# yum install python-devel -y [root@client yum.repos.d]# yum update [root@client tpm]# yum info mysql-community-libs [root@client tpm]# yum info mysql-community-libs-compat [root@client tpm]# yum clean all [root@client tmp]# yum install mysql-devel -y 如果没法更新的这里就到网站【Index of /7.9.2009/os/x86_64/Packages (centos.org)】里面找自己缺少的版本包,下载到主机内更新:下面是我缺少的包安装步骤,请依据自身状况修改: [root@master1 /]# cd /opt/hadoop/ [root@master1 hadoop]# mkdir tmp && cd tmp [root@client tmp]# wget https://vault.centos.org/7.9.2009/os/x86_64/Packages/mariadb-devel-5.5.68-1.el7.x86_64.rpm https://vault.centos.org/7.9.2009/os/x86_64/Packages/mariadb-devel-5.5.68-1.el7.x86_64.rpm [root@client tpm]# rpm -Uvh --replacepkgs /opt/hadoop/tpm/*.rpm --nodeps [root@master1 tmp]# wget https://vault.centos.org/7.9.2009/os/x86_64/Packages/libxml2-python-2.9.1-6.el7.5.x86_64.rpm [root@master1 tmp]# wget https://vault.centos.org/7.9.2009/os/x86_64/Packages/lvm2-python-libs-2.02.187-6.el7.x86_64.rpm [root@master1 tmp]# wget https://vault.centos.org/7.9.2009/os/x86_64/Packages/rpm-python-4.11.3-45.el7.x86_64.rpm [root@master1 tmp]# rpm -Uvh --replacepkgs /opt/hadoop/tmp/*.rpm 如果出现其他需要的依赖就按照这方式,下载好rpm包再次-Uvh安装 wget https://vault.centos.org/7.9.2009/os/x86_64/Packages/libxml2-python-2.9.1-6.el7.5.x86_64.rpm wget https://vault.centos.org/7.9.2009/os/x86_64/Packages/rpm-python-4.11.3-45.el7.x86_64.rpm https://vault.centos.org/7.9.2009/os/x86_64/Packages/libxml2-2.9.1-6.el7.5.x86_64.rpm https://vault.centos.org/7.9.2009/os/x86_64/Packages/libxml2-2.9.1-6.el7.5.i686.rpm https://vault.centos.org/7.9.2009/os/x86_64/Packages/rpm-4.11.3-45.el7.x86_64.rpm https://vault.centos.org/7.9.2009/os/x86_64/Packages/lvm2-libs-2.02.187-6.el7.i686.rpm https://vault.centos.org/7.9.2009/os/x86_64/Packages/lvm2-libs-2.02.187-6.el7.x86_64.rpm [root@master1 ~]# yum install libffi-devel 这边需要另外安装模块: [root@master1 spiders]# pip install MySQL-Python -i https://pypi.mirrors.ustc.edu.cn/simple 通过scrapy爬虫命令行工具创建项目: # 项目名:eduyun # 目标目录:/home/scrapy/tutorial [root]# scrapy startproject eduyun /home/scrapy/tutorial 放弃了,依赖问题无法完美解决,直接使用别人数据到5.4.7开始 # 查看项目目录结构 [root]# tree /home/scrapy/tutorial [root@master1 spiders]# tree /home/scrapy/tutorial /home/scrapy/tutorial ├── eduyun │ ├── __init__.py │ ├── items.py # 定义结构化数据,表示爬取的每一项资源 │ ├── middlewares.py │ ├── pipelines.py # 爬取后的数据的处理逻辑,如存储入库 │ ├── settings.py # 全局设置 │ └── spiders # 爬虫程序目录 │ ├── __init__.py └── scrapy.cfg # 项目配置 5.4.4.2 步骤二:新建爬虫程序 通过scrapy爬虫命令行工具新建爬虫程序: # 新建爬虫程序(Spider) [root]# scrapy genspider -t crawl books so.eduyun.cn [root]# tree /home/scrapy/tutorial/eduyun/spiders/ /home/scrapy/tutorial/eduyun/spiders/ ├── books.py └── __init__.py 5.4.4.3 步骤二:定义结构化数据 修改items.py,定义结构化数据: [root]# vi /home/scrapy/tutorial/eduyun/items.py 内容修改为: import scrapy class BookItem(scrapy.Item): id = scrapy.Field() title = scrapy.Field() author = scrapy.Field() publish_date = scrapy.Field() visits = scrapy.Field() stars = scrapy.Field() intro = scrapy.Field() url = scrapy.Field() 5.4.4.4 步骤三:修改spiders/books.py Spider程序就是完成数据抓取和URL抓取的地方,即Spider负责对请求响应内容进行处理,处理主要包括两个部分: 1. 提取或构造响应中的资源数据,即Item,交由后续pipelines等处理 2. 提取或构造下次待抓取的链接,即Request,并加入到待抓取队列 初始内容如下: # -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule class BooksSpider(CrawlSpider): name = 'books1' allowed_domains = ['so.eduyun.cn'] start_urls = ['http://so.eduyun.cn/'] rules = ( Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True), ) def parse_item(self, response): item = {} #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get() #item['name'] = response.xpath('//div[@id="name"]').get() #item['description'] = response.xpath('//div[@id="description"]').get() return item 为完成目标,需要修改3个地方: 1. start_urls:改为我们实际的起始页:http://so.eduyun.cn/synResource 2. rules:用于从响应中提取链接,我们需要提取所有分类链接 3. parse_item: 解析响应内容,对于是数据请求的响应,需要解析出数据项即Item 修改后代码如下: # -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from eduyun.items import BookItem class BooksSpider(CrawlSpider): name = 'books' allowed_domains = ['so.eduyun.cn'] start_urls = ['http://so.eduyun.cn/synResource'] rules = ( Rule(LinkExtractor(allow_domains=('so.eduyun.cn',), restrict_css=('ul.check_choice_list',), tags=('a',)), callback='parse_item', follow=False), ) def parse_item(self, response): if response.url.startswith('http://so.eduyun.cn/synResource'): xd = response.css('ul.check_choice_list').xpath('//li[1]').css('a.current::attr(data-value)').get() xk = response.css('ul.check_choice_list').xpath('//li[2]').css('a.current::attr(data-value)').get() version = response.css('ul.check_choice_list').xpath('//li[3]').css('a.current::attr(data-value)').get() grade = response.css('ul.check_choice_list').xpath('//li[4]').css('a.current::attr(data-value)').get() for i in range(100): yield scrapy.FormRequest(url='http://so.eduyun.cn/sys/resultTable', formdata={'p': str(i+1), 'ph': xd, 's': xk, 'pb': version, 'b': grade}, callback=self.parse_item, meta={'xd': xd, 'xk': xk, 'version': version, 'grade': grade}) else: for li in response.css('ul.result_list01>li'): item = BookItem() title_ele = li.css('h3.list_title') item['id'] = title_ele.css('a::attr(data-value)').get() item['title'] = title_ele.css('a::attr(title)').get() item['url'] = title_ele.css('a::attr(link)').get() item['intro'] = li.css('.resource_detail_des>p::text').get().strip() detail_ele = li.css('div.resource-detail-infor') item['author'] = detail_ele.xpath('//span[1]/text()').get().split(u':')[1].strip() item['publish_date'] = detail_ele.xpath('//span[3]/text()').get().strip() item['visits'] = detail_ele.xpath('//span[5]/em/text()').get().strip() item['stars'] = detail_ele.css('div.starts>div::text').get().strip() yield item 5.4.4.5 步骤四:配置爬虫 修改settings.xml文件: vi settings.xml 添加或修改以下配置,禁用ROBOT规则,及降低访问频率,以免被认定为恶意攻击: ROBOTSTXT_OBEY = False DOWNLOAD_DELAY = 3 5.4.4.6 步骤五:运行爬虫 执行命令运行爬虫: cd /home/scrapy/tutorial scrapy crawl books 启动成功后,过一段时间会看到抓取的数据以JSON格式方式在控制台上打印出来 5.4.5 实验任务五:将爬取的数据存储到MySQL 5.4.5.1 步骤一:编写Pipeline处理类 编辑pipelines.py文件: vi pipelines.py 创建MySQLPipeline用于将抓取的Item输出到MySQL数据库中,主要有三个方法: 1. __init__: 初始化数据库连接,同时创建数据库表(若表不存在) 2. process_item:插入数据到MySQL库中 3. close_spider:关闭连接,释放资源 详细代码如下: # -*- coding: utf-8 -*- import MySQLdb class MySQLPipeline(object): def __init__(self): self.conn = MySQLdb.connect("master2","root", "Gzdsj_1234", "scrapy", charset="UTF8") self.cursor = self.conn.cursor() sql = """create table if not exists books( id varchar(64), title varchar(128), url varchar(512), stars varchar(32), visits varchar(32), author varchar(32), publish_date varchar(64), intro varchar(1024)) engine=InnoDB default charset=utf8""" self.cursor.execute(sql) def process_item(self, item, spider): sql = """insert into books(id,title,url,stars,visits,author,publish_date,intro) values(%s,%s,%s,%s,%s,%s,%s,%s)""" self.cursor.execute(sql, [item['id'],item['title'],item['url'],item['stars'],item['visits'],item['author'],item['publish_date'],item['intro']]) self.conn.commit() return item def close_spider(self, spider): self.conn.close() 5.4.5.2 步骤二:修改爬虫配置 编辑settings.xml文件: vi settings.xml 新增或修改以下配置: ITEM_PIPELINES = { 'eduyun.pipelines.MySQLPipeline': 300, } 5.4.5.3 步骤三:重新运行爬虫 执行命令运行爬虫: cd /home/scrapy/tutorial scrapy crawl books 5.4.6 实验任务六:将爬取的数据存储到文件 5.4.6.1 步骤一:修改爬虫配置 Scrapy默认通过FEED的方法实现了将输出结果以CSV格式存储到文件中,编辑tings.xml文件: vi settings.xml 禁用上一个任务添加的MySQLPipeline, 同时添加相关的FEED配置: #ITEM_PIPELINES = { # 'eduyun.pipelines.MySQLPipeline': 300, #} FEED_URI = 'file:///tmp/export.csv' FEED_FORMAT = 'csv' FEED_EXPORT_ENCODING = 'UTF-8' FEED_EXPORT_FIELDS = ['id', 'title', 'author', 'publish_date', 'visits', 'stars','url', 'intro'] 配置参数说明: FEED_URL:文件路径 FEED_FORMAT:文件格式 FEED_EXPORT_ENCODING:文件编码 FEED_EXPORT_FIELDS:输出的字段,跟items.py中定义的一致 5.4.6.2 步骤二:重新运行爬虫 执行命令运行爬虫: cd /home/scrapy/tutorial scrapy crawl books 5.4.7 实验任务七:部署本地测试站点进行测试 5.4.7.1 步骤一:上传Tomcat安装包 将apache-tomcat-9.0.16.tar.gz安装包上传到/opt目录 5.4.7.2 步骤二:解压安装Tomcat 执行以下命令创建安装目录: mkdir /usr/tomcat 执行以下命令解压Tomcat安装包 [root@master1 opt]# tar -zxf /opt/apache-tomcat-9.0.89.tar.gz -C /usr/tomcat 5.4.7.3 步骤三:上传测试站点 将测试站点的war包上传到 /usr/tomcat/apache-tomcat-9.0.16/webapps 目录 [root@master1 opt]# cd /usr/tomcat/apache-tomcat-9.0.89/webapps 5.4.7.4 步骤四:启动Tomcat 执行命令启动Tomcat: [root@master1 webapps]# /usr/tomcat/apache-tomcat-9.0.89/bin/startup.sh 5.4.7.5 步骤四:修改vi spiders/books.py爬虫文件 这边直接跳过,看不懂 爬虫爬取的测试站点的关键HTML部分的结构与公网站点一致,因此只需要修改地址和域名限制即可。这里测试站点的部署地址为172.16.100.227:8080 修改后代码如下: # -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from eduyun.items import BookItem class BooksSpider(CrawlSpider): name = 'books' start_urls = ['http://172.168.0.10:8080/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:8080/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:8080/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:3306/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:3306/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依赖 <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.4.0</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming_2.11</artifactId> <version>2.4.0</version> </dependency> <dependency><!-- Spark Streaming Kafka --> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-kafka-0-10_2.11</artifactId> <version>2.3.0</version> </dependency> 7.4.1.3 步骤三:Spark读取kafka数据 ConsumerRecord的value()方法返回整行数据信息 //获取kafka的数据并打印 JavaDStream<String> linesSplit=lines.map(new Function<ConsumerRecord<Object, Object>, String>() { @Override public String call(ConsumerRecord<Object, Object> line) throws Exception { return line.value().toString(); } }); 7.4.1.4 步骤四:Spark处理字段非法值 将数据进行分割并生成数组,对最后一个字段进行非法值处理,如果为“暂无简介”则置为空 JavaPairDStream<String, String> firstRDD=lines.mapToPair(new PairFunction<ConsumerRecord<Object, Object>, String, String>() { @Override public Tuple2<String, String> call(ConsumerRecord<Object, Object> line) { String[] strings=line.value().toString().split(","); String key=new String(strings[0]+strings[1]); String book=new String(strings[0]+","+strings[1]+","+strings[2]+","+strings[3]+","+strings[4]+","+strings[5]+","+strings[6]+","+(strings[7].equals("暂无简介")?"":strings[7])); return new Tuple2(key,book); } }); 7.4.1.5 步骤五:Spark移除重复数据 JavaPairDStream有groupByKey方法,该方法可以直接对相同key值的数据进行处理 JavaPairDStream<String, Iterable<String>> secondRDD= firstRDD.groupByKey();//根据key分组 7.4.1.6 步骤六:Spark将数据写入HDFS 将数据写入hdfs中,只需调用saveAsTextFiles方法即可,后面为hdfs的地址 secondRDD.dstream().saveAsTextFiles("hdfs://hadoop1:9000/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: <a href="mailto:luxt@eastcom-sw.com">luxt</a><br> * @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<String> topicsSet = new HashSet<>(Arrays.asList(topics.split(",")));//topic列表 //kafka相关参数,必要!缺了会报错 Map<String, Object> kafkaParams = new HashMap<>(); kafkaParams.put("bootstrap.servers", brokers); kafkaParams.put("group.id", "group1"); kafkaParams.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); kafkaParams.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); kafkaParams.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); offsets.put(new TopicPartition("test-topic1", 0), 1L); //通过KafkaUtils.createDirectStream(...)获得kafka数据,kafka相关参数由kafkaParams指定 JavaInputDStream<ConsumerRecord<Object,Object>> lines = KafkaUtils.createDirectStream( ssc, LocationStrategies.PreferConsistent(), ConsumerStrategies.Subscribe(topicsSet, kafkaParams, offsets) ); //获取kafka的数据并打印 // JavaDStream<String> linesSplit=lines.map(new Function<ConsumerRecord<Object, Object>, String>() { // @Override // public String call(ConsumerRecord<Object, Object> line) throws Exception { // return line.value().toString(); // } // }); //处理数据 JavaPairDStream<String, String> firstRDD=lines.mapToPair(new PairFunction<ConsumerRecord<Object, Object>, String, String>() { @Override public Tuple2<String, String> call(ConsumerRecord<Object, Object> line) { String[] strings=line.value().toString().split(","); String key=new String(strings[1]);//关键词为id+title String book=new String(strings[0]+","+strings[1]+","+strings[2]+","+strings[3]+","+strings[4]+","+strings[5]+","+strings[6]+","+(strings[7].equals("暂无简介")?"":strings[7])); return new Tuple2(key,book); } }); JavaPairDStream<String, Iterable<String>> secondRDD= firstRDD.groupByKey();//根据key去重 //将value返回 JavaDStream<String> linesSplit= secondRDD.toJavaDStream().map(new Function<Tuple2<String, Iterable<String>>, String>() { @Override public String call(Tuple2<String, Iterable<String>> stringIterableTuple2) throws Exception { return stringIterableTuple2._2.iterator().next(); } }); //将数据写入hdfs中 linesSplit.dstream().saveAsTextFiles("hdfs://hadoop1:9000/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:7077 --class 类的全限定名 <*.jar> 运行数据清洗服务 ./bin/spark-submit --master spark://localhost:7077 --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依赖 <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.7.7</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-jobclient</artifactId> <version>2.7.7</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.7</version> </dependency> 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<IntWritable> values,Context context) throws IOException, InterruptedException { //定义一个计数器 int count = 0; //通过value这个迭代器,遍历这一组kv中所有的value,进行累加 for(IntWritable value:values){ count+=value.get(); } context.write(key, new IntWritable(count)); } } 7.4.3.6 步骤六:分组完整代码实现 package com.hadoop.mapreduce; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.WritableComparable; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Partitioner; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.GenericOptionsParser; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @ProjectName: mapreduce * @Package: com.hadoop.mapreduce * @ClassName: mrdemo1 * @Description: java类作用描述 * @Author: <a href="mailto:luxt@eastcom-sw.com">luxt</a><br> * @CreateDate: 2019/3/13 16:05 * @Version: */ public class GroupMr { static class Book implements WritableComparable<Book> { private String id; private String title; private String url; private String stars; private String visits; private String author; private String date; private String intro; public void set(String id, String title, String url, String stars, String visits, String author, String date, String intro) { this.id = id; this.title = title; this.url = url; this.stars = stars; this.visits = visits; this.author = author; this.date = date; this.intro = intro; } public String getId() { return id; } public String getTitle() { return title; } public String getUrl() { return url; } public String getStars() { return stars; } public String getVisits() { return visits; } public String getAuthor() { return author; } public String getDate() { return date; } public String getIntro() { return intro; } @Override public String toString() { return "id='" + id + '\'' + ", title='" + title + '\'' + ", url='" + url + '\'' + ", stars='" + stars + '\'' + ", visits='" + visits + '\'' + ", author='" + author + '\'' + ", date='" + date + '\'' + ", intro='" + intro + '\''; } @Override public int compareTo(Book o) { int i = 0; if (o instanceof Book) { Book book = (Book) o; i = this.id.compareTo(book.id); } return i; } @Override public void write(DataOutput dataOutput) throws IOException { dataOutput.writeUTF(id); dataOutput.writeUTF(title); dataOutput.writeUTF(url); dataOutput.writeUTF(stars); dataOutput.writeUTF(visits); dataOutput.writeUTF(author); dataOutput.writeUTF(date); dataOutput.writeUTF(intro); } @Override public void readFields(DataInput dataInput) throws IOException { id = dataInput.readUTF(); title = dataInput.readUTF(); url = dataInput.readUTF(); stars = dataInput.readUTF(); visits = dataInput.readUTF(); author = dataInput.readUTF(); date = dataInput.readUTF(); intro = dataInput.readUTF(); } } static class MyMapper extends Mapper<LongWritable, Text, Book, NullWritable> { Book book=new Book(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { System.out.println("MyMapper in<" + key.get() + "," + value.toString() + ">"); String line = value.toString(); String[] infos = line.split(","); book.set(infos[0],infos[1],infos[2],infos[3],infos[4],infos[5],infos[6],infos[7]); context.write(book, NullWritable.get()); System.out.println("MyMapper out<" + book + ">"); } } static class MyReducer extends Reducer<Book, NullWritable, Book, NullWritable> { private Text k = new Text(); @Override protected void reduce(Book key, Iterable<NullWritable> v2s, Context context) throws IOException, InterruptedException { System.out.println("MyReducer in<" + key + ">"); context.write(key, NullWritable.get()); System.out.println("MyReducer out<" + k + "," + key + ">"); } } static class MyPartitioner extends Partitioner<Book, NullWritable> { @Override public int getPartition(Book key, NullWritable value, int numPartitions) { String filetext = key.getDate(); int i=0; Pattern p = Pattern.compile("\\年(.*?)\\月");//正则表达式,取=和|之间的字符串,不包括=和| Matcher m = p.matcher(filetext); while(m.find()) { i=m.group(1)==null||m.group(1).equals("")?0:Integer.valueOf(m.group(1)); } return i+1; } } public static void main(String[] args) throws Exception{ Configuration conf = new Configuration(); String[] otherArgs =new GenericOptionsParser(conf,args).getRemainingArgs(); if(otherArgs.length!=2){ System.err.println("Usage:groupmr <in><out>"); 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: <a href="mailto:luxt@eastcom-sw.com">luxt</a><br> * @CreateDate: 2019/3/13 16:11 * @Version: */ public class StatisticsMr { static class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { /* * map方法是提供给map task进程来调用的,map task进程是每读取一行文本来调用一次我们自定义的map方法 * map task在调用map方法时,传递的参数: * 一行的起始偏移量LongWritable作为key * 一行的文本内容Text作为value */ @Override protected void map(LongWritable key, Text value,Context context) throws IOException, InterruptedException { //拿到一行文本内容,转换成String 类型 String line = value.toString(); //将这行文本切分成单词 String[] words=line.split(","); context.write(new Text(words[6]), new IntWritable(1)); } } static class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override /* */ protected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException { //定义一个计数器 int count = 0; //通过value这个迭代器,遍历这一组kv中所有的value,进行累加 for(IntWritable value:values){ count+=value.get(); } //输出这个时间的统计结果 context.write(key, new IntWritable(count)); } } public static void main(String[] args) throws Exception{ Configuration conf = new Configuration(); String[] otherArgs =new GenericOptionsParser(conf,args).getRemainingArgs(); if(otherArgs.length!=2){ System.err.println("Usage:groupmr <in><out>"); 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:9000/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:9000/output/4.txt 上面命令执行分组功能,执行结束后可查看目标文件 hadoop fs -ls /output/4.txt 查看具体文件内容命令为 hadoop fs -cat /output/4.txt/ 8 实验七:数据仓库的建立 8.1 实验目的 完成本实验,您应该能够: 掌握数据仓库建立的一般步骤 掌握3NF范式建模据仓库 掌握维度建模数据仓库 8.2 实验要求 熟悉常用Linux操作系统命令 了解关系型数据表的基本概念 8.3 实验环境 本实验所需资源环境如表1-1所示。 表1-1 资源环境 服务器 最低配置:双核CPU、8GB内存、100G硬盘 操作系统 CentOS-7-x86_64-Everything-1810 服务和组件 HDFS, HIVE 8.4 实验过程 8.4.1 实验任务一:检查Hive运行环境 8.4.1.1 步骤一:检查Hadoop环境 执行以下命令检查HDFS是否运行正常: hdfs dfs -ls / 8.4.1.2 步骤二:检查Hive环境 进入Hive运行环境: [root@master1 ~]# beeline 0: jdbc:hive2://master1:10000> 退出Hive运行环境: 0: jdbc:hive2://master1:10000> !quit [root@master1 ~]# 8.4.1.3 步骤三:检查数据是否准备好 执行以下命令查询HDFS指定的数据目录: [root@master1 ~]# hdfs dfs -ls /sqoop/books 8.4.2 试验任务二:设计数据结构 8.4.2.1 步骤一:查看HDFS源数据结构 执行指令查看前10条数据: [root@master1 ~]# hdfs dfs -cat /sqoop/books/* | head -10 8.4.2.2 步骤二:根据返回结果确定数据结构 根据步骤一的返回结果可以确定源数据结构为: 1、 每行一条记录 2、 每条记录的字段以逗号分隔 设计数据结构为: 字段名 类型 id string title string url string stras int visits int author string publish_date string intro string 8.4.3 实验任务三:创建库和表 8.4.3.1 步骤一:进入Hive环境 执行beeline进入Hive环境: [root@master1 ~]# beeline 0: jdbc:hive2://master1:10000> 8.4.3.2 步骤二:创建数据库 创建数据库: 0: jdbc:hive2://master1:10000> create database eduyun; No rows affected (0.128 seconds) 0: jdbc:hive2://master1:10000> 8.4.3.3 步骤三:创建表 创建库表: 0: jdbc:hive2://master1:10000> use eduyun; No rows affected (0.188 seconds) 0: jdbc:hive2://master1:10000> 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:10000> use eduyun; No rows affected (0.118 seconds) 0: jdbc:hive2://master1:10000> 8.4.4.2 步骤二:装载数据入库 执行load data命令装载数据入库: 0: jdbc:hive2://master1:10000> load data inpath '/sqoop/books' into table books;No rows affected (0.534 seconds) 0: jdbc:hive2://master1:10000> 8.4.4.3 步骤三:验证数据入库结果 执行SQL查询数据: 0: jdbc:hive2://master1:10000> 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:80/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:10000> 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:10000> use eduyun; 9.4.1.2 步骤二:检查表数据 0: jdbc:hive2://master1:10000> select * from books limit 10; 9.4.1.3 步骤三:退出Hive运行环境 退出Hive运行环境: 0: jdbc:hive2://master1:10000> !quit [root@master1 ~]# 9.4.2 实验任务二:建立汇聚视图 9.4.2.1 步骤一:按月统计教材发布数量 根据发布时间字段publish_date来分月统计教材数量: [root@master1 ~]# beeline 0: jdbc:hive2://master1:10000> use eduyun; 0: jdbc:hive2://master1:10000> 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:10000> select * from books_by_month; 9.4.3 实验任务三:建立分析视图 9.4.3.1 步骤一:分析最受欢迎的10本教材 根据访问量字段visits分析最受欢迎的10本教材以及访问量: [root@master1 ~]# beeline 0: jdbc:hive2://master1:10000> use eduyun; 0: jdbc:hive2://master1:10000> 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:10000> 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:3306/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:3306/gzdsj' --username root --password Gzdsj_1234 --table books_by_visits --input-fields-terminated-by '\001' -m 1 --export-dir '/user/hive/warehouse/eduyun.db/books_by_visits' 9.4.4.3 步骤三:验证导出结果 在MySQL服务器上执行以下命令查询导出表是否有数据: [root@master2 ~]# mysql -u root -p mysql> select * from books_by_visits; mysql> select * from books_by_month; 10 实验九:数据可视化 10.1 实验目的 完成本实验,您应该能够: 掌握Java WEB应用基本开发 掌握Echarts的基本使用 掌握基于jQuery的前后端异步交互 10.2 实验要求 熟悉Java WEB开发基础 10.3 实验环境 本实验所需资源环境如下表所示: 服务器 最低配置:双核CPU、8GB内存、100G硬盘 操作系统 CentOS-7-x86_64-Everything-1810 服务和组件 MySQL、Tomcat、IntelliJ IDEA 10.4 实验过程 10.4.1 实验任务一:准备基础开发环境、组件和数据 10.4.1.1 步骤一:下载Echarts 从官方网站下载Echarts 3: https://www.echartsjs.com/download3.html 10.4.1.2 步骤二:下载jQuery 从官方网站下载jQuery 1.x: https://code.jquery.com/ 10.4.1.3 步骤三:下载Tomcat 从官方网站下载Tomcat 9.0.16: https://tomcat.apache.org/download-90.cgi 10.4.1.4 步骤四:检查可视化数据源的数据情况 通过数据库工具连接数据库查看数据源表的数据情况: 10.4.2 实验任务二:开发WEB可视化项目 10.4.2.1 步骤一:创建WEB项目 打开Java开发工具,新建一个Maven项目: 10.4.2.2 步骤二:修改Maven配置,添加项目依赖 Maven基本配置: <groupId>org.gzdsj</groupId> <artifactId>dview</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> 属性配置: <properties> <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> </properties> 依赖配置: <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <version>2.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <version>2.0.5.RELEASE</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <version>9.0.16</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.16</version> <scope>provided</scope> </dependency> </dependencies> 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<BookNumData> 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<BookNumData> { @Override public BookNumData mapRow(ResultSet rs, int arg1) throws SQLException { BookNumData data = new BookNumData(); data.setPublishDate(rs.getString("publish_date")); data.setBooksNum(rs.getInt("books_num")); return data; } } } 10.4.2.7 步骤七:新建控制器类 新建Spring MVC的控制器类,为前端提供查询数据的接口服务,代码如下: package org.gzdsj.controller; import org.gzdsj.bean.BookNumData; import org.gzdsj.repository.BookNumDataRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController @RequestMapping("/books") public class BookNumDataController { @Autowired private BookNumDataRepository bookNumDataRepository; @RequestMapping(value = "/bydate") public List<BookNumData> findAll(){ return bookNumDataRepository.findAll(); } } 10.4.2.8 步骤八:新建资源文件 在resources资源目录下新建application.yml配置文件,文件内容如下: server: port: 8080 spring: datasource: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://172.16.100.227:3306/gzdsj username: root password: Gzdsj_1234 hikari: minimum-idle: 5 maximum-pool-size: 5 auto-commit: true idle-timeout: 30000 pool-name: DatebookHikariCP max-lifetime: 1800000 connection-timeout: 30000 connection-test-query: SELECT 1 mvc: dateFormat: yyyy-MM-dd HH:mm:ss view: prefix: suffix: .jsp 10.4.2.9 步骤九:实现WEB界面 新建/编辑webapp目录下的index.jsp文件,修改为以下内容: <%@ page contentType="text/html; charset=UTF-8" %> <!DOCTYPE html> 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); } }); }); </script> </html> 10.4.2.10 附件:完整的项目代码 10.4.3 实验任务三:本地运行项目 10.4.3.1 步骤一:安装Tomcat 解压apache-tomcat-9.0.16.tar.gz安装包 10.4.3.2 步骤二:添加Tomcat运行配置 添加Tomcat运行配置,将URL地址修改为index.jsp页面的完整地址: 在Application选项中点击Configure按钮,然后在弹出面板中点加号新增一个Tomcat配置: 选择Tomcat的安装地址,然后点击OK。 切换到Deployment面板,点击加号->Artifact…按钮把我们的项目添加到发布列表,并在右侧文本框输入会话路径,然后点击OK即可: 10.4.3.3 步骤三:启动Tomcat项目并发布应用 点击运行/调试按钮启动项目: Tomcat启动完成后,会自动弹出默认浏览器,并打开我们设置的页面地址: 11 实验十:大数据运维 11.1.1 实验任务一:备份NameNode的元数据 11.1.1.1 步骤一:备份matedata 运行hdfs dfsadmin -fetchImage /namenode 将备份的元数据放到当前文件夹下 #hdfs dfsadmin -fetchImage /namenode 11.1.1.2 步骤二:停止NameNode 将namenode 关闭 #hadoop-daemon.sh stop namenode 11.1.1.3 步骤三:删除NameNode元数据信息 删除元数据 [root@master1 current]# cp /var/hadoop/namenode/current/VERSION / #rm -rf /var/hadoop/namenode/current/ 11.1.1.4 步骤四:恢复NameNode元数据信息 此时重启namenode,重启不了,将备份的fsimage放到current下面 [root@master1 /]# mkdir /var/hadoop/namenode/current/ [root@master1 /]# cp /namenode /var/hadoop/namenode/current/fsimage_0000000000000000000 [root@master1 /]# cp /VERSION /var/hadoop/namenode/current/VERSION [root@master1 current]# md5sum /var/hadoop/namenode/current/fsimage_0000000000000000000 > /var/hadoop/namenode/current/fsimage_0000000000000000000.md5 11.1.1.5 步骤五:重启NameNode 重启namenode #hadoop-daemon.sh start namenode 11.1.1.6 步骤六:验证结果 通过jps验证结果,NameNode已经重启成功了: [root@master1 current]# jps|grep NameNode 23057 NameNode 11.1.2 实验任务二:datanode块扫描器 11.1.2.1 步骤一:执行命令 执行命名 扫描文件完整性 # hadoop dfsadmin -report 11.1.2.2 步骤二:查看完整性 下面为返回的结果,查看datanode的完整性 Name: 172.16.100.228:50010 (slave1) Hostname: slave1 Decommission Status : Normal Configured Capacity: 96841113600 (90.19 GB) DFS Used: 589824 (576 KB) Non DFS Used: 7349379072 (6.84 GB) DFS Remaining: 89491144704 (83.35 GB) DFS Used%: 0.00% DFS Remaining%: 92.41% Configured Cache Capacity: 0 (0 B) Cache Used: 0 (0 B) Cache Remaining: 0 (0 B) Cache Used%: 100.00% Cache Remaining%: 0.00% Xceivers: 1 Last contact: Mon Mar 04 04:48:12 EST 2019 11.1.3 实验任务三:负载器均衡调整 11.1.3.1 步骤一:调整-threshold #修改阀值将启动数据均衡的阈值调整为 5% hadoop balancer -Threshold 5 阀值 集群是否平衡的目标参数,每一个 Datanode 存储使用率和集群总存储使用率的差值都应该小于这个阀值,理论上,该参数设置的越小,整个集群就越平衡 11.1.3.2 步骤二:调整dfs.balance.bandwidthPerSec [root@master1 hadoop]# cd /usr/hadoop/latest/etc/Hadoop [root@master1 hadoop]# cp hdfs-site.xml hdfs-site.xml.bak 在hdfs-site.xml文件中可以设置数据均衡占用的网络带宽限制 cd /usr/hadoop/latest/etc/hadoop vi hdfs-site.xml 加入: <property> <name>dfs.balance.bandwidthPerSec</name> <value>1048576</value> </property> 11.1.3.3 步骤三:重启NameNode 先执行关闭,然后执行重启 #stop-dfs.sh #start-dfs.sh 11.1.4 实验任务四:例行停止机器 11.1.4.1 步骤一:停止各组件命令 安装路径下 sbin文件夹下 sbin/stop-all.sh 停止所有的Hadoop守护进程。包括NameNode、 Secondary NameNode、DataNode、ResourceManager、NodeManager [root@master1 sbin]# cd /usr/hadoop/latest/sbin [root@master1 sbin]# ./stop-all.sh sbin/stop-dfs.sh 停止Hadoop HDFS守护进程NameNode、SecondaryNameNode和DataNode [root@master1 sbin]# ./stop-dfs.sh ./hadoop-daemons.sh stop namenode 单独停止NameNode守护进程 ./hadoop-daemons.sh stop datanode 单独停止DataNode守护进程 ./hadoop-daemons.sh stop secondarynamenode 单独停止SecondaryNameNode守护进程 ./stop-yarn.sh 停止ResourceManager、NodeManager ./yarn-daemon.sh stop resourcemanager 单独停止ResourceManager ./yarn-daemons.sh stop stopnodemanager 单独停止NodeManager ./mr-jobhistory-daemon.sh stop historyserver 手动停止jobhistory 查看对应的log日志来看是否停止成功 11.1.4.2 步骤二:启动各组件命令 ./start-all.sh 启动所有的Hadoop守护进程。包括NameNode、 Secondary NameNode、DataNode、ResourceManager、NodeManager sbin/start-dfs.sh 启动Hadoop HDFS守护进程NameNode、SecondaryNameNode、DataNode sbin/hadoop-daemons.sh start namenode 单独启动NameNode守护进程 sbin/hadoop-daemons.sh start datanode 单独启动DataNode守护进程 sbin/hadoop-daemons.sh start secondarynamenode 单独启动SecondaryNameNode守护进程 sbin/start-yarn.sh 启动ResourceManager、NodeManager sbin/yarn-daemon.sh start resourcemanager 单独启动ResourceManager sbin/yarn-daemons.sh start nodemanager 单独启动NodeManager sbin/mr-jobhistory-daemon.sh start historyserver 手动启动jobhistory 查看对应的log日志来看是否启动成功 11.1.5 实验任务五:集群添加服务器及服务节点 11.1.5.1 步骤一:配置新服务器 修改所有host主机下的hosts:增加新节点ip:主机名 11.1.5.2 步骤二:新服务器启动datanode cd /usr/hadoop/latest/sbin/ #hadoop-daemon.sh start datanode 11.1.5.3 步骤三:查看启动日志 查看日志输出: 23:47:37,181 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Block pool BP-752219111-172.16.100.226-1550811274045 (Datanode Uuid null) service to master1/172.16.100.226:9000 beginning handshake with NN 23:47:37,202 INFO org.apache.hadoop.hdfs.server.datanode.DataNode: Block pool Block pool BP-752219111-172.16.100.226-1550811274045 (Datanode Uuid null) service to master1/172.16.100.226:9000 successfully registered with NN 11.1.6 实验任务六:集群节点性能测试 11.1.6.1 步骤一:磁盘IO的写能力 dd if=/dev/zero of=test.bdf bs=4K count=10000 10000+0 records in 10000+0 records out 40960000 bytes (41 MB) copied, 0.0516568 s, 793 MB/s 11.1.6.2 步骤二:磁盘IO的读能力 dd if=test.bdf of=/dev/null bs=4k 10000+0 records in 10000+0 records out 40960000 bytes (41 MB) copied, 0.0293351 s, 1.4 GB/s 11.1.7 实验任务七:Namenode的高可用性 11.1.7.1 步骤一:配置xml cd /usr/hadoop/latest/etc/hadoop vi hdfs-site.xml 加入下方配置 <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>master1:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>master2:8020</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>master1:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>master2:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master1:8485;master2:8485/mycluster</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/var/hadoop/data/jn</value> </property> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> 11.1.7.2 步骤二:启动服务 [root@master1 hadoop]# hadoop-daemon.sh start journalnode 11.1.7.3 步骤三:验证是否成功 通过日志查看启动成功: 07:42:43,034 INFO org.apache.hadoop.http.HttpServer2: Jetty bound to port 8480 07:42:43,034 INFO org.mortbay.log: jetty-6.1.26 07:42:43,173 INFO org.mortbay.log: Started HttpServer2$SelectChannelConnectorWithSafeStartup@0.0.0.0:8480 07:42:43,213 INFO org.apache.hadoop.ipc.CallQueueManager: Using callQueue: class java.util.concurrent.LinkedBlockingQueue queueCapacity: 500 07:42:43,223 INFO org.apache.hadoop.ipc.Server: Starting Socket Reader #1 for port 8485 07:42:43,422 INFO org.apache.hadoop.ipc.Server: IPC Server Responder: starting 07:42:43,422 INFO org.apache.hadoop.ipc.Server: IPC Server listener on 8485: starting 11.1.8 实验任务八:Ganglia监控软件 11.1.8.1 步骤一:中心节点的安装(在master1主机上) epel包的安装:yum install -y epel-release(解决不能yum安装某些安装包的问题) gmetad的安装:yum install -y ganglia-gmetad ganglia-devel gmond的安装:yum install -y ganglia-gmond rrdtool的安装:yum install -y rrdtool httpd服务器的安装:yum install -y httpd ganglia-web及php安装:yum install -y ganglia-web php 11.1.8.2 步骤二:被监测节点的安装(在master2主机上) epel包的安装:yum install -y epel-release(解决不能yum安装某些安装包的问题) gmond的安装:yum install -y ganglia-gmond 11.1.8.3 步骤三:中心节点的配置 将ganglia-web的站点目录连接到httpd主站点目录 ln -s /usr/share/ganglia /var/www/html 修改httpd主站点目录下ganglia站点目录的访问权限 chown -R apache:apache /var/www/html/ganglia/ chmod -R 755 /var/www/html/ganglia/ 修改ganglia-web的访问权限:修改vi /etc/httpd/conf.d/ganglia.conf Require all granted 修改dwoo下面的权限 [root@master1 ~]# mkdir -p /var/lib/ganglia/dwoo/compiled [root@master1 ~]# mkdir -p /var/lib/ganglia/dwoo/cache [root@master1 ~]# chmod 777 /var/lib/ganglia/dwoo/compiled [root@master1 ~]# chmod 777 /var/lib/ganglia/dwoo/cache [root@master1 rrds]# chown -R nobody /var/lib/ganglia/rrds 配置vi /etc/ganglia/gmetad.conf data_source "hadoopcluster" 172.168.0.10:8649 setuid_username nobody 配置vi /etc/ganglia/gmond.conf udp_send_channel { host = 172.168.0.10 port = 8649 } udp_recv_channel { port = 8649 } tcp_accept_channel { port = 8649 } #setenforce 0 11.1.8.4 步骤四:被监测节点的配置 vi /etc/ganglia/gmond.conf udp_send_channel { host = 172.168.0.10 port = 8649 } udp_recv_channel { port = 8649 } tcp_accept_channel { port = 8649 } 11.1.8.5 步骤五:中心节点的启动 systemctl restart httpd.service systemctl restart gmetad.service systemctl restart gmond.service systemctl enable httpd.service systemctl enable gmetad.service systemctl enable gmond.service 11.1.8.6 步骤六:被监测节点的启动 systemctl restart gmond.service systemctl enable gmond.service 11.1.8.7 步骤七:界面访问 浏览器访问 {ip}/ganglia 11.1.9 实验任务九:操作系统调优 11.1.9.1 步骤一:避免使用swap分区 Linux系统中当内存使用到一定程度后会使用swap分区,这是由/proc/sys/vm/swappiness文件中的vm.swappiness 参数进行控制的,linux默认vm.swappiness=60 但是对于hadoop集群来说,如果使用系统默认设置,会导致swap分区被频繁使用,集群会不断发出警告。所以在搭建cloudera-manager的时候,会建议调整vm.swappiness参数,我一般设置为5,vm.swappiness的值越小使用swap分区的可能性就越小。设置方法为: sysctl -w vm.swappiness=5 如果集群已经使用了swap分区,在设置vm.swappiness值之后建议对swap分区进行刷新,命令为: swapoff -a swapon -a 11.1.9.2 步骤二:调整内存分配策略 操作系统内核根据vm.overcommit_memory的值来决定分配策略,并通过vm.overcommit_ratio的值来设定超过物理内存的比例,建议将vm.overcommit_memory参数设置为2,适当修改vm.overcommit_ratio参数 sysctl vm.overcommit_memory=2 11.1.9.3 步骤三:修改net.core.somaxconn参数 该参数表示socket监听backlog的上限,默认为128,建议大于等于32768,socket服务器会一次性处理backlog中的所有请求,hadoop的ipc.server.listen.queue.size参数和linux的net.core.somaxconn参数控制了监听队列的长度,需要调大 [root@master1 vm]# cat /proc/sys/net/core/somaxconn sysctl -w net.core.somaxconn=256 11.1.9.4 步骤四:增大同时打开文件描述符的上限 对内核来说,所有打开的文件都通过文件描述符引用,文件描述符是一个非负整数,hadoop作业经常会读写大量文件,需要增大同时打开文件描述符的上限。设置最大值计算公式:内存*1024/4*256 [root@master1 vm]# echo "fs.file-max=256000" >> /etc/sysctl.conf sysctl -p 11.1.9.5 步骤五:关闭THP THP(Transparent Huge Pages) 是一个使用Huge Pages自动化的抽象层。它会引起cpu占用率增大,需要将其关闭。 查询 cat /sys/kernel/mm/transparent_hugepage/defrag cat /sys/kernel/mm/transparent_hugepage/enabled 关闭 echo never > /sys/kernel/mm/transparent_hugepage/defrag echo never > /sys/kernel/mm/transparent_hugepage/enabled 11.1.10 实验任务十:JVM调优 11.1.10.1 步骤一:mapred-site.xml调优 cd /usr/hadoop/latest/etc/hadoop vi mapred-site.xml 将下面配置追加到配置里面 <property> <name>mapreduce.admin.map.child.java.opts</name> <value>-Xmx1024m</value> </property> <property> <name>mapreduce.admin.reduce.child.java.opts</name> <value>-Xmx1536m</value> </property> <property> <name>mapred.job.reuse.jvm.num.tasks</name> <value>-1</value> </property> 11.1.10.2 步骤二:Hive调优 hive set mapred.job.reuse.jvm.num.tasks=20; quit; 合理设置jvm的参数,提高运行效率 11.1.11 实验任务十一:HDFS调优 11.1.11.1 步骤一:设置dfs.replication 文件副本数,通常设为3,不推荐修改 执行 hadoop fsck / 查看整个目录的备份数分布,输出结果如下: Default replication factor 3 Average block replication 3.0 [root@master1 hadoop]# hadoop dfs -mkdir -p /user/yourusername/yourfolder [root@master1 hadoop]# hdfs dfs -setrep 3 /user/yourusername/yourfolder 11.1.11.2 步骤二:设置dfs.block.size HDFS中数据block大小,默认为128M,对于较大集群,可设为256MB或者512MB。(也可以通过参数mapred.min.split.size配置) vi /usr/hadoop/latest/etc/hadoop/mapred-site.xml <property> <name>mapred.min.split.size</name> <value>512</value> </property> 11.1.11.3 步骤三:设置mapred.local.dir 参数mapred.local.dir配置的值应当是分布在各个磁盘上目录,这样可以充分利用节点的IO读写能力。 vi /usr/hadoop/latest/etc/hadoop/mapred-site.xml <property> <name>mapred.local.dir</name> <value>/var/hadoop/data1,/var/hadoop/data2</value> </property> 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 <property> <name>mapreduce.job.reduces</name> <value>300</value> </property> 11.1.12.2 步骤二:修改I/O相关 修改I/O的相关参数,提高吞吐量 vi /usr/hadoop/latest/etc/hadoop/mapred-site.xml <property> <name>mapreduce.task.io.sort.factor</name> <value>64</value> </property> <property> <name>mapreduce.task.io.sort.mb</name> <value>256</value> </property> 11.1.12.3 步骤三:修改reuduce shuffle阶段并行传输数据的数量 修改配置增加并行传输的能力: vi /usr/hadoop/latest/etc/hadoop/mapred-site.xml <property> <name>mapreduce.reduce.shuffle.parallelcopies</name> <value>16</value> </property> 11.1.12.4 步骤四:修改一个tasktracker并发执行的reduce数 vi /usr/hadoop/latest/etc/hadoop/mapred-site.xml <property> <name>mapreduce.tasktracker.tasks.reduce.maximum</name> <value>4</value> </property> 11.1.12.5 步骤五:修改可并发处理来自tasktracker的RPC请求数 vi /usr/hadoop/latest/etc/hadoop/mapred-site.xml <property> <name>mapreduce.job.reduces</name> <value>300</value> </property> 11.1.12.6 步骤六:重启hadoop 配置完所有的数据,进到sbin路径,重启hadoop生效 11.1.13 实验任务十三:Yarn调优 11.1.13.1 步骤一:内存调优 swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。linux的基本默认设置为60,具体如下: sysctl vm.swappiness=10 [root@client ~]# sysctl vm.swappiness=10 vm.swappiness = 10 11.1.13.2 步骤二:验证结果 [root@client ~]# cat /proc/sys/vm/swappiness 10 [root@client ~]# 11.1.14 实验任务十四:Hive性能调优 11.1.14.1 步骤一:并行执行 即同时执行hive的多个阶段。hive在执行过程,将一个查询转化成一个或者多个阶段,而这些阶段可能并非完全相互依赖的,也就是说可以并行执行的,这样可能使得整个job的执行时间缩短hive执行开启: hive set hive.exec.parallel=true; quit; 11.1.14.2 步骤二:设置执行引擎 如果设置执行引擎为mr,那么就会调用Hadoop的maprecude来运行需要执行job的程序;如果设置执行引擎为spark,那么就会调用spark来执行任务。有条件的话,就设置执行引擎为Spark,因为实在是运行的比Hadoop的MapReduce快了很多。 hive set hive.execution.engine=mr; set hive.execution.engine=spark; quit; 11.1.14.3 步骤三:设置map reduce个数 hive -- 设置map capacity set mapred.job.map.capacity=2000; set mapred.job.reduce.capacity=2000; -- 设置每个reduce的大小 set hive.exec.reducers.bytes.per.reducer=500000000; -- 直接设置个数 set mapred.reduce.tasks = 15; quit; Hive的调优完成 <p></p></div></div></div> 最后修改:2024 年 08 月 30 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 觉得文章有用,可以赞赏请我喝瓶冰露
1 条评论
真好呢