Hadoop 介绍
Hadoop 从 2.x 开始,逐渐演变成:HDFS,YARN,MapReduce 三大应用模块,这三个应用模块分别的能力和作用是:
- HDFS:分布式文件系统,用来解决海量大文件的存储问题
- MapReduce:一套通用的用来解决海量大文件计算的编程模型 API
- YARN:资源调度/管理系统
其中需要注意的是:这三者之间的关系。彼此独立,又相互依赖。使用 MapReduce 的分布式编程 API 编写分布式计算应用程序,读取存储在 HDFS 上的海量大文件进行计算,由 YARN 提供计算资源。HDFS 和 YARN 可以独立运行。主要表现在:
- 使用 MapReduce 编写的应用程序也可以运行在其他资源调度系统之上。
- 使用其他编程模型编写的应用程序,比如 Storm,Spark,Flink 等也可运行在 YARN 集群上。
所以称 Hadoop 是一个分布式的成熟解决方案。安装 Hadoop,其实就是安装 HDFS 和 YARN 两个集群。HDFS 和 YARN 都是一个一主多从的集群。
HDFS 集群:
一个NameNode主节点/管理节点 多个DataNode从节点/工作节点
YARN集群:
一个ResourceManager主节点/管理节点 多个NodeManager从节点/工作节点
版本选择
现在 Hadoop 经历四个大版本:
- hadoop-0.x:古老的Hadoop,连 YARN 都没有,现在应该没有任何企业还在使用这么古老的 Hadoop 了。
- hadoop-1.x:基本淘汰的Hadoop版本,不用考虑。
- hadoop-2.x:现阶段主流的使用版本。
- hadoop-3.x:目前较新的Hadoop版本,提供了很多新特性,但是升级的企业还是比较少。
本文安装的是 hadoop-2.7.4 版本。
节点规划
节点名称 | HDFS角色 | YARN角色 |
hadoop1 | NameNode | ResourceManager |
hadoop2 | SecondaryNameNode + DataNode | NodeManager |
hadoop3 | DataNode | NodeManager |
SSH 免密登录配置
为了方便后续拷贝文件以及执行脚本,配置 SSH 免密登录。在 hadoop1 上生成 RSA 非对称密钥对:
[root@hadoop1 hadoop]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:wkMiPVpbBtjoZwBIpyvvluYtfQM9hQeHtgBFVfrwL1I root@hadoop1 The key's randomart image is: +---[RSA 2048]----+ |+o.O+..o. | |. *.o.+.. | | o..=o*= | | o+oOo+o | |...o..+oE | |.. . o+ . | | .o .... . | | .=.. o. . | | +o... . | +----[SHA256]-----+
将公钥拷贝到集群中的其他机器:
[root@hadoop1 hadoop]# ssh-copy-id root@hadoop1 [root@hadoop1 hadoop]# ssh-copy-id root@hadoop2 [root@hadoop1 hadoop]# ssh-copy-id root@hadoop3
解压文件
文件包括 hadoop 和 jdk 的压缩包,运行 hadoop 依赖 JAVA 环境,因此需要安装 jdk。
tar -xzvf hadoop-2.7.4.tar.gz tar -xzvf jdk-8u181-linux-x64.tar.gz mkdir /software mv jdk1.8.0_181/ /software/jdk mv hadoop-2.7.4 /software/hadoop
配置环境变量
在 hadoop1 编辑 /etc/profile 文件:
vim /etc/profile export HADOOP_HOME=/software/hadoop export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin export JAVA_HOME=/software/jdk export PATH=$PATH:$JAVA_HOME/bin source /etc/profile
拷贝到其他两台机器上:
scp /etc/profile root@hadoop2:/etc/profile scp /etc/profile root@hadoop3:/etc/profile
配置 host 记录
编辑 /etc/hosts 文件:
192.168.1.117 hadoop1 192.168.1.118 hadoop2 192.168.1.119 hadoop3
拷贝到其他两台机器上:
scp /etc/hosts root@hadoop2:/etc/hosts scp /etc/hosts root@hadoop3:/etc/hosts
修改配置文件
配置文件存放在 etc/hadoop 目录下。
修改 hadoop-env.sh 脚本文件:
export JAVA_HOME=/software/jdk
修改 hdfs-site.xml 配置文件:
<configuration> <!--datanode数据存储目录--> <property> <name>dfs.datanode.data.dir</name> <value>file:///software/hadoop/data/datanode</value> </property> <!--namenode数据存储目录--> <property> <name>dfs.namenode.name.dir</name> <value>file:///software/hadoop/data/namenode</value> </property> <!--namenode WebUI 使用的监听地址--> <property> <name>dfs.namenode.http-address</name> <value>hadoop1:50070</value> </property> <!--secondary namenode WebUI 使用的监听地址--> <property> <name>dfs.namenode.secondary.http-address</name> <value>hadoop2:50090</value> </property> <!--HDFS的数据块的副本存储个数--> <property> <name>dfs.replication</name> <value>3</value> </property> </configuration>
修改 core-site.xml 配置文件:
<!--HDFS集群的url,默认端口8020--> <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://hadoop1/</value> </property> </configuration>
配置 yarn-site.xml 配置文件:
<configuration> <!--ResourceManager对外WebUI地址,默认端口8088--> <property> <name>yarn.resourcemanager.hostname</name> <value>hadoop1</value> </property> </configuration>
修改 slaves 配置文件:
hadoop2 hadoop3
将刚才修改的配置文件拷贝到其他两个机器:
scp -r /software/hadoop/ root@hadoop2:/software/ scp -r /software/hadoop/ root@hadoop3:/software/
HDFS 集群的初始化
在 hadoop1 上执行如下命令:
hdfs namenode -format
出现如上提示,则说明初始化成功。切记:关于初始化操作,是第一次安装 Hadoop 集群的时候初始化一次就可以了,而不是后面每次使用的都需要初始化一次。如果你想要把一个旧 HDFS 集群的数据都给删掉,当做一个新集群来使用。那么你可以重新初始化,但是你还是要记得把对应的每个节点数据存储目录先行删掉,然后再初始化,这样你就又得到了一个新的 HDFS 集群。
启动 HDFS 集群
在 hadoop1 上执行如下命令:
[root@hadoop1 hadoop]# start-dfs.sh Starting namenodes on [hadoop1] hadoop1: starting namenode, logging to /software/hadoop/logs/hadoop-root-namenode-hadoop1.out hadoop3: starting datanode, logging to /software/hadoop/logs/hadoop-root-datanode-hadoop3.out hadoop2: starting datanode, logging to /software/hadoop/logs/hadoop-root-datanode-hadoop2.out Starting secondary namenodes [hadoop2] hadoop2: starting secondarynamenode, logging to /software/hadoop/logs/hadoop-root-secondarynamenode-hadoop2.out
启动 YARN 集群
在 hadoop1 上执行如下命令:
[root@hadoop1 hadoop]# start-yarn.sh starting yarn daemons starting resourcemanager, logging to /software/hadoop/logs/yarn-root-resourcemanager-hadoop1.out hadoop3: starting nodemanager, logging to /software/hadoop/logs/yarn-root-nodemanager-hadoop3.out hadoop2: starting nodemanager, logging to /software/hadoop/logs/yarn-root-nodemanager-hadoop2.out
检查 Hadoop 集群状态
在每台机器上通过 Jps 命令查看运行的 Java 进程:
[root@hadoop1 hadoop]# jps 21444 Jps 20888 NameNode 21182 ResourceManager [root@hadoop2 ~]# jps 15328 SecondaryNameNode 15410 NodeManager 15210 DataNode 15531 Jps [root@hadoop3 ~]# jps 13252 DataNode 13495 Jps 13375 NodeManager
查看 HDFS 集群状态:
[root@hadoop1 hadoop]# hdfs dfsadmin -report Configured Capacity: 107321753600 (99.95 GB) Present Capacity: 84270903296 (78.48 GB) DFS Remaining: 84270845952 (78.48 GB) DFS Used: 57344 (56 KB) DFS Used%: 0.00% Under replicated blocks: 2 Blocks with corrupt replicas: 0 Missing blocks: 0 Missing blocks (with replication factor 1): 0 ------------------------------------------------- Live datanodes (2): Name: 192.168.1.118:50010 (hadoop2) Hostname: hadoop2 Decommission Status : Normal Configured Capacity: 53660876800 (49.98 GB) DFS Used: 28672 (28 KB) Non DFS Used: 11528269824 (10.74 GB) DFS Remaining: 42132578304 (39.24 GB) DFS Used%: 0.00% DFS Remaining%: 78.52% 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: Fri May 07 10:37:06 CST 2021 Name: 192.168.1.119:50010 (hadoop3) Hostname: hadoop3 Decommission Status : Normal Configured Capacity: 53660876800 (49.98 GB) DFS Used: 28672 (28 KB) Non DFS Used: 11522580480 (10.73 GB) DFS Remaining: 42138267648 (39.24 GB) DFS Used%: 0.00% DFS Remaining%: 78.53% 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: Fri May 07 10:37:09 CST 2021
在 HDFS WebUI 查看集群状态:查看 YARN 集群状态:
[root@hadoop1 hadoop]# yarn node -list 21/05/07 11:49:51 INFO client.RMProxy: Connecting to ResourceManager at hadoop1/192.168.1.117:8032 Total Nodes:2 Node-Id Node-State Node-Http-Address Number-of-Running-Containers hadoop2:43025 RUNNING hadoop2:8042 0 hadoop3:34439 RUNNING hadoop3:8042 0
在 YARN WebUI 查看集群状态:Hadoop 集群,包含了 HDFS 和 YARN 两个集群,所以两个集群都分别做一次测试。
HDFS集群:上传一个文件查看是否存在:
#在HDFS中创建一个目录 hadoop fs -mkdir /wcinput #将本机/root/wordcount.txt文件上传到HDFS的/wcinput目录中 hadoop fs -put /root/wordcount.txt /wcinput
wordcount.txt 文件内容如下:
hello world hello hadoop hello hbase
在 HDFS WebUI界面查看上传的文件:YARN集群:提交一个 mapreduce 计算任务,计算刚刚上传的 wordcount.txt 文件中每个词出现的次数,将结果输出到 HDFS 的 /wcoutput 目录:
[root@hadoop1 mapreduce]# hadoop jar /software/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-ex
查看 wcoutput 目录,可以看到有一个 part-r-00000 文件,里面存放的是计算的结果:
[root@hadoop1 mapreduce]# hadoop fs -ls /wcoutput Found 2 items -rw-r--r-- 3 root supergroup 0 2021-05-07 00:20 /wcoutput/_SUCCESS -rw-r--r-- 3 root supergroup 33 2021-05-07 00:20 /wcoutput/part-r-00000 [root@hadoop1 mapreduce]# hadoop fs -cat /wcoutput/part-r-00000 hadoop 1 hbase 1 hello 3 world 1