为什么我们看了很多资料还是不知道hadoop 到底以什么方式工作?为什么我们按照各种版本安装部署hadoop 中途总是困难重重?
之前我总结了如何安装一个单节点的hadoop。
但hadoop毕竟是分布式计算平台。我们新手的起码入门标尺-----应该是在多个计算机之间搭建好集群。所以我紧接着写这一篇文章。
-
我们回顾一下hadoop的整体结构:
图片来源:https://blog.csdn.net/babyfish13/article/details/52527665
hadoop 核心就由这三部分组成,
HDFS(分布式文件存储系统)负责分布式文件存储.
YARN(资源管理系统)负责集群的统一调度.
MAPREDUCE(分布式计算框架)
简单介绍一下 HDFS 和 YARN:
HDFS将文件分别存储到集群中的多个节点上,并靠冗余存储来实现容错(即当某个节点出错时,仍保证数据的不丢失和计算的准确性,notice:容错是由DataNode之间自行备份的.)
HDFS架构图如下,由一个client 负责处理跟用户的交互和数据的切分,由一个NameNode记录元数据(元数据即描述数据的数据,比如文件路径,文件被分为几块?每个块在哪些DataNode上等),DataNode则真正存储着切分后的数据块.
单节点的NameNode挂了就是挂了,SecondNameNode并不是用来替换的.但是SecondNameNode 在NameNode挂了重启的时候提供支持,hdfs会把操作日志记录下来,存在editlog中,当NameNode挂了重启的时候,加载editlog,回放一遍,达到重启前的状态.在回放之前,会调用SecondNameNode中的fsimage,fsimage存放过去某一个时刻的内存快照,NameNode重启时,在fsimage的基础上根据editlog达到重启前的状态.SecondNameNode会定期的将editlog读入,更新fsimage,删除旧editlog,这样就避免了长时间的日志积累,导致editlog文件过大的情况.
2.0版本的hadoop允许有多个NameNode,用来避免NameNode挂掉之后的替换,NameNode之间 用所以hadoop提供了一种叫做JournalNode技术,这项技术可以在NameNode节点间共享数据.
更多HDFS的内容,可以参考我的文章:https://blog.csdn.net/b285795298/article/details/83384534
YARN 的结构:
新的资源管理器ResourceManager全局管理所有应用程序计算资源的分配,每一个应用的 ApplicationMaster 负责相应的调度和协调。NodeManager 是每一台机器框架的代理,是执行应用程序的容器,监控应用程序的资源使用情况 (CPU,内存,硬盘,网络 ) 并且向调度器汇报。
更多YARN的内容,可以参考我的文章:https://blog.csdn.net/b285795298/article/details/83386522
-
我们开始搭建集群
我们用四台机器,一个master, 担任HDFS的 NameNode, YARN的 ResourceManager
另外三台取名data1,data2,data3,担任HDFS的 DataNode, YARN的 NodeManager
-
虚拟环境搭建,相互之间通信的建立
- 拷贝安装四个linux系统的主机(ubuntu 16.04)。可以先安装配置好一台虚拟机(比如安装jdk,hadoop,ssh等),然后拷贝四份。
- 四个主机相互之间已经实现ssh无密码登陆。实现方式可以参考:https://blog.csdn.net/b285795298/article/details/87795844
- 每台主机配置两张网卡:
网卡1:“NAT网卡” 可以通过HOST主机(windows)连接外网
网卡2:“仅主机适配器” 用于创建内部网络
- 对四个主机进行网卡配置:
hduser@master:~$ sudo vim /etc/network/interfaces
- 分别配置data1、data2、data3、master 的ip 为:
address 192.168.56.101
address 192.168.56.102
address 192.168.56.103
address 192.168.56.104
- 各主机的interfaces 文件内容如下(四台主机除了ip地址不一样,其余内容全部一样)
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
#NAT interface
auto eth0
iface eth0 inet dhcp
#host only interface
auto eth1
iface eth1 inet static
address 192.168.56.104
netmask 255.255.255.0
network 192.168.56.0
broadcast 192.168.56.265
~
- 配置四台主机的hostname 分别为:master、data1、data2、data3
hduser@master:~$ sudo vim /etc/hostname
- 编辑hosts文件
hduser@master:~$ sudo vim /etc/hosts
127.0.0.1 localhost
127.0.1.1 hadoop
192.168.56.104 master
192.168.56.101 data1
192.168.56.102 data2
192.168.56.103 data3
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
完成上述步骤,以上四台主机可以通过ssh,相互访问了。
-
编辑data1、data2、data3的hadoop 配置文件。
hduser@data1:~$ sudo vim /usr/local/hadoop/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9001</value>
</property>
</configuration>
hduser@data1:~$ sudo vim /usr/local/hadoop/etc/hadoop/yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- resourcemanager 与 nodemanager 的连接地址-->
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<!--resourcemanager 与 applicationmaster 的连接地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<!--resourcemanager 与client 的连接地址 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8025</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8050</value>
</property>
</configuration>
hduser@data1:~$ sudo vim /usr/local/hadoop/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>master:54311</value>
</property>
</configuration>
hduser@data1:~$ sudo vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/hadoop_data/hdfs/datanode</value>
</property>
</configuration>
-
配置master主机
- 编辑masters 和slaves 文件,告诉hadoop 那一台服务器是NameNode 哪一台是DataNode
hduser@master:~$ sudo vim /usr/local/hadoop/etc/hadoop/masters
hduser@master:~$ sudo vim /usr/local/hadoop/etc/hadoop/slaves
- 用master ssh 连接到slaves ,创建HDFS目录:
分别连接data1、data2、data3
先删除hdfs目录
sudo rm -rf /usr/local/hadoop/hadoop_data/hdfs
创建Datanode 目录
mkdir -p /usr/local/hadoop/hadoop_data/hdfs/datanode
将目录的所有者更改为用户
sudo chown -R hduser:hduser /usr/local/hadoop
- 然后用 exit 命令回到master主机,
作同样修改,只是hdfs下创建的是namenode文件夹
先删除hdfs目录
sudo rm -rf /usr/local/hadoop/hadoop_data/hdfs
创建Datanode 目录
mkdir -p /usr/local/hadoop/hadoop_data/hdfs/namenode
将目录的所有者更改为用户
sudo chown -R hduser:hduser /usr/local/hadoop
红色字体加下划线的两个步骤对于namenode he datanode 的成功部署非常重要,如果部署过程中,出现节点丢失或livenode 数量不同的情况,一般是datanode/current 文件夹下 VERSION文件中的namespaceID 跟namenode/current下面的不一致.
hduser@master:~$ sudo vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/hadoop_data/hdfs/namenode</value>
</property>
启动hadoop
- 格式化namenode
hadoop namenode -format
- start-all.sh
- jps 查看进程:
resourcemanager web 界面:
HDFS web 界面: