目录
题目
引言
技术/算法介绍
数据描述
实践过程
搭建Hadoop伪分布式集群
新建Maven管理的SpringBoot项目
创建项目架构
在resource文件目录下书写配置文件
实现项目结构中的代码
程序运行结果展示
结论与心得
题目
任务:关系的选择与投影运算
描述:在Hadoop平台搭建完成的基础上,利用MapReduce完成关系的选择与投影运算。
使用SpringBoot框架整合Hadoop实现数据上传与结果查看、下载。
引言
任务概述:
- 关系选择:选择满足特定条件的数据行。
- 关系投影:从给定的数据行中选择指定的列。
完成方法:
- 关系选择:
- 将输入数据划分为多个数据块,并在Hadoop集群中分布式存储。
- 编写MapReduce作业来实现选择操作。
- 在Map阶段,每个Mapper任务读取一个数据块,并应用选择条件来筛选数据行。
- 在Reduce阶段,将所有Mapper的输出合并为最终结果。
- 关系投影:
- 使用选择操作的输出作为输入数据。
- 编写新的MapReduce作业来实现投影操作。
- 在Map阶段,每个Mapper任务读取选择操作的输出,并根据指定的列进行投影。
- 在Reduce阶段,将所有Mapper的输出合并为最终结果。
结果描述:
- 完成任务后,将得到经过选择和投影运算的关系数据。
- 选择操作的结果将只包含满足条件的数据行。
- 投影操作的结果将只包含指定的列数据。
技术/算法介绍
- Hadoop平台:Hadoop是一个分布式计算平台,它提供了可靠的分布式存储和处理大规模数据的能力。Hadoop的核心组件包括Hadoop Distributed File System(HDFS)和MapReduce。
- MapReduce:MapReduce是一种分布式计算编程模型,用于处理大规模数据集。它包括两个主要阶段:Map阶段和Reduce阶段。在Map阶段,数据被拆分为多个片段,每个片段由一个Mapper任务处理。在Reduce阶段,Mapper的输出被合并和处理为最终结果。
- 关系选择:关系选择是根据指定条件筛选出满足条件的数据行。在MapReduce中,可以在Mapper任务中应用选择条件,将满足条件的数据行输出给Reducer任务。常用的选择算法包括基于索引、哈希和扫描等。
- 关系投影:关系投影是从给定的数据行中选择指定的列。在MapReduce中,可以在Mapper任务中实现列的选择操作,将选择的列作为Mapper的输出。Reducer任务可以进行数据合并和处理,生成最终的投影结果。
- Spring Boot:Spring Boot是一个用于创建独立、基于Java的生产级别应用程序的开源框架。它是由Pivotal团队开发的,并且构建在Spring框架的基础之上。Spring Boot旨在简化Spring应用程序的开发、部署和运行。
- Knife4j:Knife4j是一款开源的Java接口文档管理工具,它基于SwaggerUI进行了扩展和增强,旨在简化和美化接口文档的编写、管理和查看过程。Knife4j提供了一系列功能和特性,使得接口文档的编写和展示更加便捷和友好。
数据描述
- 数据来源:UCI Machine Learning Repository
- 数据举例:[1 1 1 1 1 3] 这是数据集合中的一行数据,共六列,任务中用到的是中间四列。详细说明见第三条英文原文,实验中我用到的四列数据定义是
private int age; //1.患者年龄 (1)年轻,(2)老花前期,(3)老花眼
private int prescription; //2.眼镜处方: (1)近视,(2)远视
private int astigmatic; //3.散光: (1)没有,(2)有
private int rate; //4.泪液生成率: (1)降低,(2)正常
实践过程
搭建Hadoop伪分布式集群
最简单的linux虚拟机搭建hadoop集群的方法(centos系统)
参考
基于Docker搭建Hadoop集群之升级版 | 寒雁Talk
1.用yum安装docker 具体docker安装教程网上非常多
yum install -y docker-ce
docker官方镜像仓库网速较差,我们需要设置国内镜像服务:
参考阿里云的镜像加速文档:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
## 配置阿里云镜像加速后重新加载文件 systemctl daemon-reload ##重启docker systemctl restart docker #其他命令 systemctl start docker # 启动docker服务 systemctl stop docker # 停止docker服务 systemctl restart docker # 重启docker服务
2.拉取hadoop镜像源
docker pull kiwenlau/hadoop:1.0
3.新建文件夹,拉取镜像
mkdir /opt/hadoop
4.安装git
yum install git #版本太低了 升级下git yum install http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm yum install git -y #git --version #配置一下(可选) git config --global http.postBuffer 1048576000 git config --global http.lowSpeedLimit 0 git config --global http.lowSpeedTime 999999 #登陆https://www.ipaddress.com #查询最新github地址 #向/etc/hosts添加 #XXX.XXX.XXX.XXX github.com service network restart
如果你的linux虚拟机环境 确实克隆不了 可以 windows上克隆下来 然后用ftp工具传过去
5.克隆仓库到当前文件夹(可以自行创建并切换到相应文件夹)。
git clone https://github.com/kiwenlau/hadoop-cluster-docker
6.创建Hadoop网桥
docker network create --driver=bridge hadoop
7.运行docker容器
cd /opt/hadoop/hadoop-cluster-docker #发现没x权限 加上 chmod u+x start-container.sh ./start-container.sh #启动成功后进如master 节点 此时自动进入master容器 在master容器内执行脚本 ./start-hadoop.sh #这样 hadoop集群就启动好了 #退出容器 docker命令 是exit #如果是win下载的git项目传上去的 运行.sh会失败 是因为文件格式可能不对 需要修改 其他sh脚本文件同理 vim start-container.sh :set ff :set ff=unix :wq! #防火墙设置(建议的操作) #开放端口 相关端口 #firewall-cmd --query-port=8088/tcp查看端口号是否开启,比如我随便查看一下端口 #开放端口 firewall-cmd --zone=public --add-port=8088/tcp --permanent firewall-cmd --zone=public --add-port=50070/tcp --permanent #9000是我java Api打算用的端口 firewall-cmd --zone=public --add-port=9000/tcp --permanent #重启防火墙 firewall-cmd --reload
#其他命令
#查看防火墙状态 systemctl status firewalld #关闭防火墙(不建议) 建议用上边的命令添加端口规则就好了 systemctl stop firewalld #干掉防火墙自启服务(不建议)systemctl disable firewalld #打开防火墙开机自启 systemctl enable firewalld #启动 firewalld.service服务 service firewalld start #停止firewalld.service服务 service firewalld stop #重启firewalld.service服务 service firewalld restart #查看firewall的状态 firewall-cmd --state #查看防火墙已有规则列表 firewall-cmd --list-all #查看firewall服务状态 systemctl status firewalld
8.这样就已经搭建好了一个三个节点的Hadoop集群了
在本地访问 注意ip换成你linux虚拟机的
Hadoop网页管理地址:
- NameNode: http://192.168.108.128:50070/
- ResourceManager: http://192.168.108.128:8088/
即可访问 不能访问先看看hadoop启动了没
查看端口情况 lsof -i:8088 #查看docker状态 用这些命令等 docker stats #ctrl+c退出 docker ps -a docker ps
宿主机与虚拟机互相ping一下 然后检查防火墙设置
9.利用idea docker插件来简化docker使用 设置 搜索docker 配置ssh连接就行
10.为了方便后续通过 Java API 访问 HDFS,需要修改容器启动脚本start-container.sh ,添加一个端口映射,我们需要在-p 8088:8088 \
下添加一行 随便选个端口号即可 如下:
-p 9000:9000 \
11.开启web端的HDFS管理
<property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property>
新建Maven管理的SpringBoot项目
引入Hadoop相关依赖与Knife4j依赖。pom文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.14</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.my</groupId>
<artifactId>MyHadoop</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>MyHadoop</name>
<description>MyHadoop</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.25</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 集成hadoop-2.7.2-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.20</version>
</dependency>
<!--Swagger-UI API文档生产工具-->
<!--swagger增强工具依赖包,方便生成接口文档。非必须导入-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-micro-spring-boot-starter</artifactId>
<version>2.0.8</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>2.0.8</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
创建项目架构
在resource文件目录下书写配置文件
spring.servlet.multipart.max-file-size=50MB
spring.servlet.multipart.max-request-size=50MB
#连接hdfs的uri
HdfsPath=hdfs://192.168.108.128:9000
#上传到hdfs后 可下载到电脑硬盘上的路径 方便查看结果
file-save-path=E:/myHadoop/uploadFile/
#file-save-path=/myHadoop/uploadFile/
#运行该项目机器的ip地址
myFileUri=http://localhost:8080/localFile
#拟使用用户 与上传到hdfs中目录有关 如/user/root
USER=root
实现项目结构中的代码
源码仓库地址:https://gitee.com/whd_cool/my-hadoop.git
程序运行结果展示
清空工作目录 即删除我之前实验或测试中产生的 /user/root 目录
上传整理好的数据data.txt 即数据集的中间四行
数据部分内容
上传data.txt
做关系的选择
例:col输入1 ,value输入2;即代表第2列(因为col值0,1,2,3表示1-4列)中值等于2
做关系的投影
例:输入0 表示投影第一列数据
结论与心得
通过完成这个大作业,我深入学习了Hadoop平台和MapReduce的使用,并结合Spring Boot和knife4j等技术实现了整合和测试。
- 总结:
Hadoop平台为处理大规模数据提供了强大的分布式计算和存储能力,通过搭建和配置Hadoop集群,我能够利用其分布式特性高效地处理和分析大规模的关系数据。
MapReduce作为一种分布式计算编程模型,在这个大作业中起到了关键作用。我编写的MapReduce作业实现了关系选择和投影操作,通过合理的任务划分和数据处理,实现了高性能的数据处理和分析。
- 心得体会:
使用Spring Boot整合Hadoop平台,我将大作业的实现与现代化的Web应用开发相结合。这使得整个系统更加灵活和易于管理,同时也提供了更好的可扩展性和维护性。
利用knife4j测试大作业的任务,我能够轻松地创建和管理API文档,并通过可视化的界面进行接口测试。这大大简化了测试过程,提高了开发效率。
综上所述,通过将Hadoop平台与Spring Boot和knife4j等技术相结合,我不仅成功完成了大作业的任务,还学到了如何将大数据处理与现代化的Web应用开发相融合。这使我对大数据处理的技能和应用有了更深入的认识和掌握。我相信这些知识和经验将对我未来在大数据领域的工作和发展产生积极的影响。