Hadoop源码解析、MapTask & ReduceTask源码解析

86 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情

6.2 MapTask & ReduceTask源码解析

1)MapTask源码解析流程 =================== MapTask =================== context.write(k, NullWritable.get()); //自定义的map方法的写出,进入 output.write(key, value);
//MapTask727行,收集方法,进入两次 collector.collect(key, value,partitioner.getPartition(key, value, partitions)); HashPartitioner(); //默认分区器 collect() //MapTask1082行 map端所有的kv全部写出后会走下面的close方法 close() //MapTask732行 collector.flush() // 溢出刷写方法,MapTask735行,提前打个断点,进入 sortAndSpill() //溢写排序,MapTask1505行,进入 sorter.sort() QuickSort //溢写排序方法,MapTask1625行,进入 mergeParts(); //合并文件,MapTask1527行,进入

collector.close(); //MapTask739行,收集器关闭,即将进入ReduceTask 2)ReduceTask源码解析流程 =================== ReduceTask =================== if (isMapOrReduce()) //reduceTask324行,提前打断点 initialize() // reduceTask333行,进入 init(shuffleContext); // reduceTask375行,走到这需要先给下面的打断点 totalMaps = job.getNumMapTasks(); // ShuffleSchedulerImpl第120行,提前打断点 merger = createMergeManager(context); //合并方法,Shuffle第80行 // MergeManagerImpl第232 235行,提前打断点 this.inMemoryMerger = createInMemoryMerger(); //内存合并 this.onDiskMerger = new OnDiskMerger(this); //磁盘合并 rIter = shuffleConsumerPlugin.run(); eventFetcher.start(); //开始抓取数据,Shuffle第107行,提前打断点 eventFetcher.shutDown(); //抓取结束,Shuffle第141行,提前打断点 copyPhase.complete(); //copy阶段完成,Shuffle第151行 taskStatus.setPhase(TaskStatus.Phase.SORT); //开始排序阶段,Shuffle第152行 sortPhase.complete(); //排序阶段完成,即将进入reduce阶段 reduceTask382行 reduce(); //reduce阶段调用的就是我们自定义的reduce方法,会被调用多次 cleanup(context); //reduce完成之前,会最后调用一次Reducer里面的cleanup方法

第七章 Hadoop源码编译

7.1 前期准备工作

1)官网下载源码

hadoop.apache.org/release/3.1…

2)修改源码中的HDFS副本数的设置 在这里插入图片描述 3)CentOS虚拟机准备 (1)CentOS联网 配置CentOS能连接外网。Linux虚拟机ping www.baidu.com 是畅通的 注意:采用root角色编译,减少文件夹权限出现问题 (2)Jar包准备(Hadoop源码、JDK8、Maven、Ant 、Protobuf) hadoop-3.1.3-src.tar.gz jdk-8u212-linux-x64.tar.gz apache-maven-3.6.3-bin.tar.gz protobuf-2.5.0.tar.gz(序列化的框架) cmake-3.17.0.tar.gz

7.2 工具包安装

注意:所有操作必须在root用户下完成 0)分别创建/opt/software/hadoop_source和/opt/module/hadoop_source路径 1)上传软件包到指定的目录,例如 /opt/software/hadoop_source

[root@hadoop101 hadoop_source]$ pwd
/opt/software/hadoop_source
[root@hadoop101 hadoop_source]$ ll
总用量 55868
-rw-rw-r--. 1 atguigu atguigu  9506321 328 13:23 apache-maven-3.6.3-bin.tar.gz
-rw-rw-r--. 1 atguigu atguigu  8614663 328 13:23 cmake-3.17.0.tar.gz
-rw-rw-r--. 1 atguigu atguigu 29800905 328 13:23 hadoop-3.1.3-src.tar.gz
-rw-rw-r--. 1 atguigu atguigu  2401901 328 13:23 protobuf-2.5.0.tar.gz

2)解压软件包指定的目录,例如: /opt/module/hadoop_source

[root@hadoop101 hadoop_source]$ tar -zxvf apache-maven-3.6.3-bin.tar.gz -C  /opt/module/hadoop_source/

[root@hadoop101 hadoop_source]$ tar -zxvf cmake-3.17.0.tar.gz -C  /opt/module/hadoop_source/

[root@hadoop101 hadoop_source]$ tar -zxvf hadoop-3.1.3-src.tar.gz -C  /opt/module/hadoop_source/

[root@hadoop101 hadoop_source]$ tar -zxvf protobuf-2.5.0.tar.gz -C  /opt/module/hadoop_source/

[root@hadoop101 hadoop_source]$ pwd
/opt/module/hadoop_source

[root@hadoop101 hadoop_source]$ ll
总用量 20
drwxrwxr-x.  6 atguigu atguigu 4096 328 13:25 apache-maven-3.6.3
drwxr-xr-x. 15 root    root    4096 328 13:43 cmake-3.17.0
drwxr-xr-x. 18 atguigu atguigu 4096 912 2019 hadoop-3.1.3-src
drwxr-xr-x. 10 atguigu atguigu 4096 328 13:44 protobuf-2.5.0

3)安装JDK (1)解压JDK

[root@hadoop101 hadoop_source]# tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/hadoop_source/

(2)配置环境变量

[root@hadoop101 jdk1.8.0_212]# vim /etc/profile.d/my_env.sh
输入如下内容:
#JAVA_HOME
export JAVA_HOME=/opt/module/hadoop_source/jdk1.8.0_212
export PATH=$PATH:$JAVA_HOME/bin

(3)刷新JDK环境变量

[root@hadoop101 jdk1.8.0_212]# source /etc/profile

(4)验证JDK是否安装成功

[root@hadoop101 hadoop_source]$ java -version
java version "1.8.0_212"
Java(TM) SE Runtime Environment (build 1.8.0_212-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode)

4)配置maven环境变量,maven镜像,并验证 (1)配置maven的环境变量

[root@hadoop101 hadoop_source]#  vim /etc/profile.d/my_env.sh
#MAVEN_HOME
MAVEN_HOME=/opt/module/hadoop_source/apache-maven-3.6.3
PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin

[root@hadoop101 hadoop_source]#  source /etc/profile

(2)修改maven的镜像

[root@hadoop101 apache-maven-3.6.3]# vi conf/settings.xml

# 在 mirrors节点中添加阿里云镜像
<mirrors>
    <mirror>
         <id>nexus-aliyun</id>
         <mirrorOf>central</mirrorOf>
         <name>Nexus aliyun</name>
                <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
</mirrors>

(3)验证maven安装是否成功

5)安装相关的依赖(注意安装顺序不可乱,可能会出现依赖找不到问题) (1)安装gcc make

[root@hadoop101 hadoop_source]# yum install -y gcc* make

(2)安装压缩工具

[root@hadoop101 hadoop_source]# yum -y install snappy*  bzip2* lzo* zlib*  lz4* gzip*

(3)安装一些基本工具

[root@hadoop101 hadoop_source]# yum -y install openssl* svn ncurses* autoconf automake libtool

(4)安装扩展源,才可安装zstd

[root@hadoop101 hadoop_source]# yum -y install epel-release

(5)安装zstd

[root@hadoop101 hadoop_source]# yum -y install *zstd*

6)手动安装cmake (1)在解压好的cmake目录下,执行./bootstrap进行编译,此过程需一小时请耐心等待

[root@hadoop101 cmake-3.17.0]$ pwd
/opt/module/hadoop_source/cmake-3.17.0
[atguigu@hadoop101 cmake-3.17.0]$ ./bootstrap

(2)执行安装

[root@hadoop101 cmake-3.17.0]$ make && make install 

(3)验证安装是否成功

[root@hadoop101 cmake-3.17.0]$ cmake -version
cmake version 3.17.0
CMake suite maintained and supported by Kitware (kitware.com/cmake).

7)安装protobuf,进入到解压后的protobuf目录

[root@hadoop101 protobuf-2.5.0]$ pwd
/opt/module/hadoop_source/protobuf-2.5.0

(1)依次执行下列命令 --prefix 指定安装到当前目录

[root@hadoop101 protobuf-2.5.0]$ ./configure --prefix=/opt/module/hadoop_source/protobuf-2.5.0 

[root@hadoop101 protobuf-2.5.0]$ make && make install

(2)配置环境变量

[root@hadoop101 protobuf-2.5.0]$ vim /etc/profile.d/my_env.sh
输入如下内容
PROTOC_HOME=/opt/module/hadoop_source/protobuf-2.5.0
PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin:$PROTOC_HOME/bin

(3)验证

[root@hadoop101 protobuf-2.5.0]$ source /etc/profile
[root@hadoop101 protobuf-2.5.0]$ protoc --version
libprotoc 2.5.0

8)到此,软件包安装配置工作完成。

7.3 编译源码

1)进入解压后的Hadoop源码目录下

[root@hadoop101 hadoop-3.1.3-src]$ pwd
/opt/module/hadoop_source/hadoop-3.1.3-src

#开始编译
[root@hadoop101 hadoop-3.1.3-src]$ mvn clean package -DskipTests -Pdist,native -Dtar

注意:第一次编译需要下载很多依赖jar包,编译时间会很久,预计1小时左右,最终成功是全部SUCCESS,爽!!! 在这里插入图片描述 2)成功的64位hadoop包在/opt/module/hadoop_source/hadoop-3.1.3-src/hadoop-dist/target下

[root@hadoop101 target]# pwd
/opt/module/hadoop_source/hadoop-3.1.3-src/hadoop-dist/target