有基础的读者,可以直接跳到第三章:环境搭建。前面两章都是一些相关的理论基础和准备工作。而对于完全是第一次搭建Hadoop高可用HA集群的读者,强烈建议花几分钟看一看这些理论基础和准备工作,便于后面更好地理解和搭建集群环境。
本章将从进程间的通信机制RPC,Hadoop基础理论和ZooKeeper基础理论来阐述,首先对此有一定的理论理解基础,便于后面的环境快速搭建。
关于RPC、Hadoop和ZooKeeper的基础理论和角色说明,都只是简单的阐述一些基础理论和几个常见的角色,而不是只有这些角色,想要更加深入了解每一个模块的机制,了解每一个模块的工作机制和其对应的角色功能,可以查看Apache关于Hadoop的官方文档说明。
Hadoop内部的所有通信机制都是采用RPC通信,每一个进程都有对应的RPC通信端口,与TCP和UDP的通信端口不同。注意区分RPC内部通信端口和HTTP通信端口。
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
有多种 RPC模式和执行。最初由 Sun 公司提出。IETF ONC 宪章重新修订了 Sun 版本,使得 ONC RPC 协议成为 IETF 标准协议。现在使用最普遍的模式和执行是开放式软件基础的分布式计算环境(DCE)。
Hadoop就是一个分布式计算的解决方案,也就是帮助我们把一个任务分到很多台计算机来计算。Hadoop是Apache基金会开源的一个框架,可编写和运行分布式应用处理大规模数据,是专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式。
Apache关于Hadoop简介点击这里
Hadoop1.x版本:分布式文件系统(HDFS)和分布式计算框架(MapReduce)
Hadoop2.x版本:分布式文件系统(HDFS)、分布式计算框架(MapReduce)和分布式资源调度(YARN)
Hadoop3.x版本:HDFS+MapReduce+YARN,在2.x版本上进行一系列的更改。详细的更改文档请点击这里
分布式文件系统HDFS是主从架构模型系统,一个HDFS集群和GFS文件系统集群一样有Master和Slave两种角色,而HDFS的Master就是NameNode(NN),在HDFS中还有一个SecondaryNameNode角色,Slave就是DataNode(DN),其NameNode的作用就是管理整个文件系统的命令空间(储存数据的索引)和客户端对文件的访问(建立文件系统与外界进行交流),而Slave的作用就是以块的形式真正的储存数据。块(Block)是分布式文件系统的文件储存的逻辑单元,每一个块有对个副本(在不同的DataNode)上以达到容错效果。
分布式计算框架MapReduce是一个并行的编程计算框架,主要思想是将一个任务拆分为多个Mapper和Reducer阶段,从而达到一个输入一个输出,而却是分布式的计算处理,提高效率和利用率。
分布式资源调度YARN可以理解类似HDFS理解,也是一个主从架构模型,一个YARN有ResouceManager和NodeManager,分别映射YARN物理节点的主节点(资源调度和分配)和计算节点(常与DataNode一起)。ResourceManager节点的功能由Secheduler和ApplicationManager协调完成。NodeManager对应集群中的计算节点,但是他的功能仅仅只是抽象本节点的资源(如cpu,内存,磁盘,网络)并且定时向ResourceManager的Secheduler汇报。
ZooKeeper是一个分布式的协调框架,主要的分布式特性:顺序一致性、原子性、单一视图、可靠性、实时性。
简单来说ZooKeeper使得分布式程序能够通过一个共享的、树形结构的名字空间来进行相互协调,组成这个树形结构的数据节点被称作ZNode,它们之间的层级关系就像文件系统的目录结构一样;构建集群,也就是Zookeeper服务的可复制性,一般3-5(奇数)台机器就可以构建一个Zookeeper的集群,只要确保一半以上的服务器能够正常工作,整个机器就能够正常对外服务。相互之间可以进行通信,在内存中维护当前服务器状态,客户可以与任意一台服务器建立TCP连接进行通信,当与此服务器连接断开之后,客户端会自动连接到集群中的其他服务器继续工作;顺序访问,客户端的每一个更新请求ZooKeeper都会分配一个全局唯一的递增编号,通过这个编号可以确保事物操作的先后顺序;高性能,ZooKeeper将全量数据存储于内存之中,并直接服务于客户端的所有非事物请求,因此在读操作的应用上优势更为明显。可以在千台服务器组成的读写比例大约为10:1的分布系统上表现优异。
ZooKeeper的角色说明,主要有Leader(领导者),其作用是为客户端提供读和写的服务,负责投票的发起和决议,更新系统状态;Follower(跟随者),其作用是为客户端提供读服务,如果是写服务则转发给Leader。在选举过程中参与投票;Observe(观察者),其作用是为客户端提供读服务器,如果是写服务则转发给Leader。不参与选举过程中的投票,也不参与“过半写成功”策略。在不影响写性能的情况下提升集群的读性能。此角色于ZooKeeper3.3版本以以后版本的新增角色。Client(客户端) 连接zookeeper服务器的使用着,请求的发起者。独立于zookeeper服务器集群之外的角色。
本章将从Hadoop的高可用HA搭建理论,主机的分配和角色分配,软件和硬件准备来进行阐述,做到环境搭建前的准备工作,以便于后面有条不紊的进行。
Hadoop高可用HA的部署,需要有2个NameNode,一个是活跃状态active的,一个是备用状态standby的,两个NameNode需要有一个管理员来协调管理,来决定决定谁处于active状态,谁处于standby状态,如果处于active状态的的NameNode宕机了,立即启动standby状态的NameNode转换为active状态,而这个具有协调功能的管理员就是ZooKeeper。
这样配置一主一从的主备NameNode之间通过一组JournalNode(JournalNode是Hadoop层面的,主流使用JournalNode集群进行数据共享)同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode。同时为了满足高可用HA,那么,只有一个管理员ZooKeeper也不行,万一这个管理员坏了呢。所以需要配置一个ZooKeeper集群,同样只有一个JournalNode也不行,要配置多个JournalNode。
集群规划
主机名 | IP地址 | 软件安装 | 部署后运行的进程 |
---|---|---|---|
master01 | 192.168.92.2 | JDK、Hadoop | NN、RM、ZKFC |
master02 | 192.168.92.2 | JDK、Hadoop | NN、RM、ZKFC |
slave01 | 192.168.92.2 | JDK、Hadoop、ZooKeeper | DN、DM、JN |
slave02 | 192.168.92.2 | JDK、Hadoop、ZooKeeper | DN、DM、JN |
slave03 | 192.168.92.2 | JDK、Hadoop、ZooKeeper | DN、DM、JN |
备注说明:
JDK
Oracle的JDK下载官网点击这里
OpenJDK下载官网点击这里
jdk-8u201-linux-x64.tar.gz
Hadoop
Apache的Hadoop各个版本下载点击这里
hadoop-2.7.7.tar.gz
hadoop-3.2.0.tar.gz
CDH的Hadoop各个版本下载点击这里
在Chrome浏览器中,直接使用快捷键Ctrl+g启动页面搜索,输入hadoop回车即可查找到相关信息。注意版本的匹配问题(Hadoop版本、JDK版本和ZooKeeper版本之间的匹配支持问题)
hadoop-2.6.0-cdh5.13.2.tar.gz
hadoop-2.5.0-cdh5.2.0.tar.gz
ZooKeeper
Apache的ZooKeeper各个版本下载点击这里
apache-zookeeper-3.5.5.tar.gz
zookeeper-3.4.14.tar.gz
新建主机
备注说明:
每一台主机配置好登录的用户名和密码,静态IP地址,主机名与IP地址的域名绑定,网卡信息的修改和防火墙的关闭(可以按需要关闭端口,也可以整个关闭防火墙)。
配置免密登录
先在每一台主机上执行生成RSA算法的秘钥
ssh-keygen –t rsa
从master01以root用户登录master01、master02、slave01、slave02、slave03免密。在master01主机上进行一下操作命令即可,其他主机类似操作即可,实现所有主机之间相互免密登录,都是在内部的局域网下,安全问题不考虑,这样操作方便,不需要考虑各个进行之间的通信问题。
ssh-copy-id -i ~/.ssh/id_rsa.pub root@master01
ssh-copy-id -i ~/.ssh/id_rsa.pub root@master02
ssh-copy-id -i ~/.ssh/id_rsa.pub root@slave01
ssh-copy-id -i ~/.ssh/id_rsa.pub root@slave02
ssh-copy-id -i ~/.ssh/id_rsa.pub root@slave03
本章将从JDK的安装配置,Hadoop的安装配置和ZooKeeper的安装配置来进行阐述,一步一步地按照集群的规划来部署好我们规划中的集群。
本节从JDK的下载、解压、环境变量和集群分发方面进行阐述
将下载好的jdk版本上传到master01主机上(当前操作所在路径root用户目录下~),指定解压到/usr/,命令如下
tar -zxvf jdk-8u201-linux-x64.tar.gz -C /usr/
编辑系统的环境变量配置,将jdk添加到环境变量中,用vi/vim打开/etc/profile,并添加一下内容,然后保存退出,并重新生效一下环境变量。命令以内容如下
# VI/VIM命令
vim /etc/profile
# 添加一下内容
JAVA_HOME=/home/java/jdk1.8.0_131
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export JRE_HOME
export PATH
export CLASSPATH
# 保存退出后重新生效环境变量
source /etc/profile
配置好master01主机上的JDK后进行集群分发到master02、slave01、slave02和slave03。
scp –r /usr/jdk1.8.0_201/ root@master02:/usr/
scp –r /usr/jdk1.8.0_201/root@slave01:/usr/
scp –r /usr/jdk1.8.0_201/root@slave02:/usr/
scp –r /usr/jdk1.8.0_201/root@slave03:/usr/
分发master01主机上的环境变量配置文件
scp –r /etc/profile root@master02:~/
scp –r /etc/profile root@slaver01:~/
scp –r /etc/profile root@slaver02:~/
scp –r /etc/profile root@slaver03:~/
本节从ZooKeeper的下载、解压、环境变量和集群分发方面进行阐述
将下载好的ZooKeeper版本上传到slaver01主机上(当前操作所在路径root用户目录下~),指定解压到/usr/,命令如下
tar -zxvf zookeeper-3.4.14.tar.gz -C /usr/
编辑系统的环境变量配置,将ZooKeeper(ZK)添加到环境变量中,用vi/vim打开/etc/profile,并添加一下内容,然后保存退出,并重新生效一下环境变量。命令以内容如下
# VI/VIM命令
vim /etc/profile
# 在末尾添加
export ZOOKEEPER_HOME=/usr/zookeeper-3.4.14
export PATH=$ZOOKEEPER_HOME/bin:$PATH
export PATH
# 保存退出后重新生效环境变量
source /etc/profile
ZooKeeper的配置文件全部在$ZOOKEEPER_HOME/conf下,首先进入到这里配置文件路径下,然后查看所有的配置文件,对应着一个一个地配置。
# 进入ZK配置文件路径
cd $ZKHOME/conf
# 重命名配置文件
cp zoo_sample.cfg zoo.cfg
# 打开配置文件
vim zoo.cfg
# 修改内容
dataDir=$ZKHOME/tmp
# 在最后添加内容
server.1=slave01:2888:3888
server.2=slave02:2888:3888
server.3=slave03:2888:3888
# 保存退出后重新生效环境变量
source /etc/profile
# 再在dataDir设置的位置创建一个空文件myid
touch dataDir/myid
# 最后向该文件写入唯一ID编码
echo 1 > $ZKHOME/tmp/myid
配置好slave01主机上的zookeeper后进行集群分发到slave02和slave03。
# 集群分发
scp –r /usr/zookeeper-3.4.14/ root@slave02:/usr/
scp –r /usr/zookeeper-3.4.14/ root@slave03:/usr/
# 特别注意:修改slave02、slave03对应dataDir设置的位置/tmp/myid内容
# 在slave02:
echo 2 > $ZKHOME/tmp/myid
# slave03:
echo 3 > $ZKHOME/tmp/myid
分发slaver01主机上的环境变量配置文件
# 集群分发
scp –r /etc/profile root@slaver02:~/
scp –r /etc/profile root@slaver03:~/
# 可以用命令启动zookeeper
zkServer.sh start来启动
# 用命令来查看三个ZK集群上,哪个是leader,哪两个是follower
zkServer.sh status
本节从Hadoop的下载、解压、添加环境变量、修改配置文件和集群分发方面进行阐述
将下载好的hadoop版本上传到master01进行解压(当前操作所在路径root用户目录下~),指定解压到/usr/。
tar -zxvf hadoop-2.7.7.tar.gz -C /usr/
用编辑器打开系统环境配置文件,用VI/VIM打开/etc/profile,然后添加一下内容,方便后面直接使用一些hadoop的shell命令,当然也是可以不用配置的,直接找到hadoop的shell命令所在路径,然后再执行shell命令,这样有时候不是很方便。
# vim打开/etc/profile
vim /etc/profile
# 文件尾部添加内容
export HADOOP_HOME=/usr/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export PATH
hadoop2.x的配置文件全部在$HADOOP_HOME/etc/hadoop下,首先进入到这里配置文件路径下,然后查看所有的配置文件,对应着一个一个地配置。
# 进入hadoop配置文件路径
cd $HADOOP_HOME/etc/hadoop
# 修改hadoop-env.sh
export JAVA_HOME=$JAVA_HOME
# 修改slaves文件,添加如下内容,作用是指定hadoop的datanode节点。
slave01
slave02
slave03
# 修改mapred-site.xml
<configuration>
<!-- 指定mr框架为yarn方式 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
修改配置文件core-site.xml
# 修改core-site.xml(其他property不改)
<configuration>
<!-- 指定hdfs的nameservice为mycluster -->
<!-- mycluster 后面配置hdfs.site要用到 -->
<property>
<name>fs.defaultFS</name>
<value>mycluster</value>
</property>
<!-- 指定hadoop临时目录 -->
<!-- 需要提前在指定路径创建好空目录tmp -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/hadoop-2.7.7/tmp</value>
</property>
<!-- 指定zookeeper地址 -->
<property>
<name>ha.zookeeper.quorum</name>
<value>slave01:2181,slave02:2181,slave03:2181</value>
</property>
</configuration>
修改配置文件hdfs-site.xml
# 修改hdfs-site.xml(其他property不改)
<configuration>
<!--指定hdfs的nameservice为mycluster需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>master01,master02</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>master01:8020</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>master01:50070</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>master02:8020</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>master02:50070</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://slave01:8485;slave02:8485;slave03:8485/mycluster</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/hadoop-2.7.7/journaldata</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制方法-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
</configuration>
修改配置文件yarn-site.xml
# 修改yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 开启RM高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定RM的cluster id -->
<!-- 该cluster-id不能与nameService相同-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 指定RM的名字 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 分别指定RM的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master01</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>master02</value>
</property>
<!-- 启用RM重启的功能-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
value>true</value>
<!--description>启用RM重启的功能,默认为false</description-->
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
<!--description>用于状态存储的类,采用ZK存储状态类</description-->
</property>
<!-- 指定zk集群地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>slave01:2181,slave02:2181,slave03:2181</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>master:8088</value>
<!--description>提供给web页面访问的地址,可以查看任务状况等信息</description-->
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hostbb:8088</value>
<!--description>提供给web页面访问的地址,可以查看任务状况等信息</description-->
</property>
<!-- 配置通讯的地址和端口,有多少个RM就配置多少组property -->
<!-- RM1-->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>master01:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>master01:8031</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>master01:8032</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm1</name>
<value>master01:8033</value>
</property>
<!-- RM2 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>master02:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>master02:8031</value>
</property>
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>master02:8032</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm2</name>
<value>master02:8033</value>
</property>
</configuration>
配置好master01主机上的hadoop后进行集群分发到master02、slave01、slave02和slave03。
scp –r /usr/hadoop-2.7.7/ root@master02:/usr/
scp –r /usr/hadoop-2.7.7/root@slave01:/usr/
scp –r /usr/hadoop-2.7.7/root@slave02:/usr/
scp –r /usr/hadoop-2.7.7/root@slave03:/usr/
分发master01主机上的环境变量配置文件,这个环境变量记得每次配置完成后都要集群分发一次,并重新生效,也可以整个所有集群环境搭建好了之后,只需要集群分发一次并生效即可。
在master01上执行分布式文件系统HDFS的格式化命令:
hdfs namenode -format
格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是 H A D O O P H O M E / t m p , 然 后 将 HADOOP_HOME/tmp,然后将 HADOOPHOME/tmp,然后将HADOOP_HOME/tmp拷贝到#master02的$HADOOP_HOME下。
# 格式化主从NameNode
scp -r tmp/ master02:$HADOOP_HOME
# 建议使用命令进行主从NameNode格式化
# 在执行此命令前先启动master01的namenode:sbin/hadoop-daemon.sh start namenode
hdfs namenode -bootstrapStandby
# 格式化ZKFC
# 格式化ZKFC(在master01上执行即可)
hdfs zkfc -formatZK
# 或者直接到hadoop的bin和sbin下调相应命令
bin/hdfs zkfc -formatZK
# 在zookeeper的三个节点上执行命令启动zookeeper
zkServer.sh start
# 然后在master01上执行启动HDFS、YARN
start-dfs.sh
start-yarn.sh
检测进程
在每一台主机上执行jps命令,查看运行在Java虚拟机KVM的进程。可以采用批量化命令,即打开远程连接软件的交互窗口,只输入一次命令在所有主机上都运行该命令,然后根据每一台主机运行后的进程和我们预先的进程是否一致,若相同则集群成功了。
检测浏览器访问
# 查看分布式文件系统HDFS
http://192.168.92.2:50070
NameNode 'master01:9000' (active)
http://192.168.92.3:50070
NameNode 'master02:9000' (standby)
#查看分布式资源调度YARN任务信息(ResourceManager运行节点的IP)
http://192.168.92.2:8088(端口号是上面文件中配置的,默认是8088)
测试集群的高可用性
# 先向hdfs上传一个文件
hadoop fs -put /etc/profile /
hadoop fs -ls /
# 然后再kill掉active的NameNode
kill -9 <pid of NN>
# 通过浏览器访问:http://192.168.92.3:50070
# NameNode 'master02:9000' (active)
# 这个时候master02上的NameNode变成了active
# 在执行命令,发现刚才上传的文件依然存在
hadoop fs -ls /
# 手动启动那个挂掉的NameNode
sbin/hadoop-daemon.sh start namenode
# 通过浏览器访问:http://192.168.92.2:50070
NameNode 'weekend01:9000' (standby)
Q:不能完成主备NameNode节点之间的自动切换?
A:查看配置hdfs-site.xml密匙文件位置是否配置正确!
Q:出现找不到命令的情况?
A:看环境变量是否配置好了,或者直接到hadoop的bin和sbin下调相应命令!
Q:出现访问不了哪一个节点?
A:节点之间是要相互通信的,所以要检查在各节点之间配置ssh免密登陆!
Q:出现找不到主机名错误提示?
A:查看主机名与IP的映射域名文件/etc/hosts是否配置准确!注意配置文件/etc/sysconfig/network配置的是该主机的主机名!
Q:运行过程中出现莫名其妙错误?
A:首先应该检查一下集群的必要进程是否还在,有可能莫名其妙的在后台挂掉了!
Q:浏览器访问出现端口冲突?
A:所有进行的HTTP端口或者RPC通信端口采用默认方式,如果有冲突则修改端口即可!
Q:感觉看到不是很懂的,感觉有错误的?
A:首先本篇文章要求读者有一定的Linux基础和Hadoop集群基础,然后可能版本的原因,部分配置信息有不同,详情请以官方配置文档为主!