说明:本文以HDFS High Availability Using the Quorum Journal Manager模式搭建hadoop3.2.0集群。

环境

  • CentOS7.5.1804、jdk1.8.0_181、zookeeper3.6.2、hadoop3.2.2
  • 虚拟机安装CentOS7五台,如下: 
hostnameIProles
node-1192.168.56.129QuorumPeerMain、NameNode、JournalNode、DFSZKFailoverController、ResourceManager
node-2192.168.56.130QuorumPeerMain、NameNode、JournalNode、DFSZKFailoverController、ResourceManager
node-3192.168.56.131QuorumPeerMain、NameNode、JournalNode、DFSZKFailoverController、DataNode、NodeManager、JobHistoryServer
node-4192.168.56.132DataNode、NodeManager
node-5192.168.56.133DataNode、NodeManager

      注意:安装前关闭防火墙,执行如下命令:

           systemctl stop firewalld           

           systemctl disable firewalld

           systemctl status firewalld

  • 安装jdk,省略安装步骤。
  • 三台虚拟机配置免密登录,省略配置过程。
配置免密登录可以使用如下命令:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
ssh-copy-id -p <port> -i ~/.ssh/id_rsa.pub "<user>@<hostname>" // 根据自己的环境补全命令
chmod 0600 ~/.ssh/authorized_keys

搭建zookeeper集群

  • 上传到虚拟机,解压后修改conf/zoo.cfg文件,配置如下:
tickTime=3000
initLimit=10
syncLimit=5
dataDir=/opt/env/zookeeper-3.6.2/data/data
dataLogDir=/opt/env/zookeeper-3.6.2/data/logs
clientPort=2181
autopurge.snapRetainCount=3
autopurge.purgeInterval=1
server.1=node-1:2888:3888
server.2=node-2:2888:3888
server.3=node-3:2888:3888

     在dataDir定义的目录下创建文件myid,把虚拟机各自对应的id存储到myid,即上面的server.id,每台虚拟机只存储自己的id值即可。

    启动zookeeper:bin/zkServer.sh start。

 搭建hadoop

  • 修改../hadoop-3.2.2/etc/hadoop下的配置文件:
  • hdfs-site.xml文件配置如下:
<configuration>
  <property>
    <name>dfs.nameservices</name>
    <value>vmcluster</value>
  </property>
  <property>
    <name>dfs.ha.namenodes.vmcluster</name>
    <value>nn1,nn2,nn3</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.vmcluster.nn1</name>
    <value>node-1:8020</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.vmcluster.nn2</name>
    <value>node-2:8020</value>
  </property>
  <property>
    <name>dfs.namenode.rpc-address.vmcluster.nn3</name>
    <value>node-3:8020</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.vmcluster.nn1</name>
    <value>node-1:9870</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.vmcluster.nn2</name>
    <value>node-2:9870</value>
  </property>
  <property>
    <name>dfs.namenode.http-address.vmcluster.nn3</name>
    <value>node-3:9870</value>
  </property>
  <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://node-1:8485;node-2:8485;node-3:8485/vmcluster</value>
  </property>
  <property>
    <name>dfs.client.failover.proxy.provider.vmcluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
  </property>
  <property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
  </property>
  <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/bigdata/.ssh/id_rsa</value>
  </property>
  <property>
    <name>dfs.ha.fencing.ssh.connect-timeout</name>
    <value>30000</value>
  </property>
  <property>
    <name>dfs.namenode.handler.count</name>
    <value>100</value>
  </property>
  <property>
    <name>dfs.safemode.threshold.pct</name>
    <value>1</value>
  </property>
  <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/opt/env/hadoop-3.2.2/data/jn</value>
  </property>
  <property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>dfs.namenode.name.dir</name>
    <value>file://${hadoop.tmp.dir}/dfs/nn</value>
  </property>
  <property>
    <name>dfs.datanode.data.dir</name>
    <value>file://${hadoop.tmp.dir}/dfs/dn</value>
  </property>
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>
  <property>                                        
    <name>dfs.permissions.enabled</name>
    <value>false</value>
  </property>
  <property>                                        
    <name>dfs.blocksize</name>
    <value>67108864</value>
  </property>
</configuration>
  • core-site.xml文件配置如下:
<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://vmcluster</value>
  </property>
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>node-1:2181,node-2:2181,node-3:2181</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/opt/env/hadoop-3.2.2/data</value>
  </property>
  </property>
    <property>
    <name>hadoop.http.staticuser.user</name>
    <vaule>bigdata</vaule>
  </property>
  <property>
    <name>hadoop.proxyuser.bigdata.hosts</name>
    <vaule>*</vaule>
  </property>
  <property>
    <name>hadoop.proxyuser.bigdata.groups</name>
    <value>*</value>
  </property>
  <property>
    <name>hadoop.proxyuser.bigdata.users</name>
    <value>*</value>
  </property>
</configuration>
  • yarn-site.xml文件配置如下:
<configuration>
  <property>
    <name>yarn.resourcemanager.ha.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>yarn.resourcemanager.cluster-id</name>
    <value>yarnCluster</value>
  </property>
  <property>
    <name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>yarn.resourcemanager.ha.automatic-failover.embedded</name>
    <value>true</value>
  </property>
  <property>
    <name>yarn.resourcemanager.connect.retry-interval.ms</name>
    <value>2000</value>
  </property>
  <property>
    <name>yarn.resourcemanager.ha.rm-ids</name>
    <value>rm1,rm2</value>
  </property>
  <property>
    <name>yarn.resourcemanager.hostname.rm1</name>
    <value>node-1</value>
  </property>
  <property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>node-2</value>
  </property>
  <property>
    <name>yarn.resourcemanager.webapp.address.rm1</name>
    <value>node-1:8088</value>
  </property>
  <property>
    <name>yarn.resourcemanager.webapp.address.rm2</name>
    <value>node-2:8088</value>
  </property>
  <property>
    <name>yarn.resourcemanager.address.rm1</name>
    <value>node-1:8032</value>
  </property>
  <property>
    <name>yarn.resourcemanager.address.rm2</name>
    <value>node-2:8032</value>
  </property>
  <property>
    <name>yarn.resourcemanager.scheduler.address.rm1</name>
    <value>node-1:8030</value>
  </property>
  <property>
    <name>yarn.resourcemanager.scheduler.address.rm2</name>
    <value>node-2:8030</value>                                    
  </property>
  <property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>node-1:2181,node-2:2181,node-3:2181</value>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
  <property>
    <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
    <value>org.apache.hadoop.mapred.ShuffleHandler</value>
  </property>
  <property>
    <name>yarn.nodemanager.env-whitelist</name>
    <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
  </property>
  <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
  </property>
  <property>  
    <name>yarn.log.server.url</name>  
    <value>http://node-3:19888/jobhistory/logs</value>  
  </property> 
  <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>604800</value>
  </property>
  <property>
    <name>yarn.resourcemanager.scheduler.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
  </property>
  <property>
    <name>yarn.resourcemanager.recovery.enabled</name>
    <value>true</value>
  </property>
  <property>
    <name>yarn.resourcemanager.store.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
  </property>
  <property>
    <name>yarn.resourcemanager.zk.state-store.address</name>
    <value>node-1:2181,node-2:2181,node-3:2181</value>
  </property>
  <property>
    <name>yarn.application.classpath</name>
    <value>
      $HADOOP_CONF_DIR,
      $HADOOP_COMMON_HOME/share/hadoop/common/*,
      $HADOOP_COMMON_HOME/share/hadoop/common/lib/*,
      $HADOOP_HDFS_HOME/share/hadoop/hdfs/*,
      $HADOOP_HDFS_HOME/share/hadoop/hdfs/lib/*,
      $HADOOP_YARN_HOME/share/hadoop/yarn/*,
      $HADOOP_YARN_HOME/share/hadoop/yarn/lib/*
    </value>
  </property>
  <property>
    <name>yarn.nodemanager.pmem-check-enabled</name>
    <value>false</value>
  </property>
  <property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
  </property>
</configuration>
  • mapred-site.xml文件配置如下:
<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
  <property>
    <name>mapreduce.jobhistory.address</name>
    <value>node-3:10020</value>
  </property>
  <property>
    <name>mapreduce.jobhistory.webapp.address</name>
    <value>node-3:19888</value>
  </property>
  <property>
    <name>yarn.app.mapreduce.am.env</name>
    <value>HADOOP_MAPRED_HOME=/opt/env/hadoop-3.2.2</value>
  </property>
  <property>
    <name>mapreduce.map.env</name>
    <value>HADOOP_MAPRED_HOME=/opt/env/hadoop-3.2.2</value>
  </property>
  <property>
    <name>mapreduce.reduce.env</name>
    <value>HADOOP_MAPRED_HOME=/opt/env/hadoop-3.2.2</value>
  </property>
  <property>
    <name>mapreduce.application.classpath</name>
    <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*,$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
  </property>
</configuration>

    workers文件件配置如下:

node-3
node-4
node-5
  • hadoop-env.sh文件配置如下:
export JAVA_HOME=${JAVA_HOME}
export HDFS_NAMENODE_USER=bigdata
export HDFS_DATANODE_USER=bigdata
export HDFS_JOURNALNODE_USER=bigdata
export HDFS_ZKFC_USER=bigdata
export YARN_RESOURCEMANAGER_USER=bigdata
export YARN_NODEMANAGER_USER=bigdata

初始化与启动

五台虚拟机所有配置完成后,依次执行如下命令:

->  ${HADOOP_HOME}/bin/hdfs --daemon start journalnode  # journalnode的节点都执行该命令
执行完成后,查看HADOOP_HOME目录下的logs目录的journalnode日志,是否正常。


->  ${HADOOP_HOME}/bin/hdfs namenode -format  # 格式化,在其中一台namenode虚拟机执行即可
->  ${HADOOP_HOME}/bin/hdfs --daemon start namenode # 启动namenode
执行完成后,查看HADOOP_HOME目录下的logs目录的namenode日志,是否正常


->  ${HADOOP_HOME}/bin/hdfs namenode -bootstrapStandby # 副节点同步主节点格式化文件
其余namenode节点执行该命令

->  ${HADOOP_HOME}/bin/hdfs zkfc -formatZK   # 格式化zkfc,在其中一台namenode虚拟机执行即可
执行完成后,将在ZooKeeper中创建一个znode,自动故障转移系统存储数据。


->  ${HADOOP_HOME}/sbin/stop-dfs.sh

->  ${HADOOP_HOME}/sbin/start-dfs.sh

->  ${HADOOP_HOME}/sbin/start-yarn.sh

->  ${HADOOP_HOME}/bin/mapred --daemon start historyserver
启动配置historyserver的服务器, (node-3)

运行一个mapreduce的自带例子测试

hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.2.jar wordcount /input/README.txt /output/

查看historyserver

注意:安装centos7的时候如果是最小化安装(默认的选择就是最小化安装),是不安装psmisc包,此时hadoop的HA无法正常切换,需要安装yum install psmisc -y包后,重启。

说明一下:psmisc工具包含了pstree、killall、fuser

pstree:以树状图显示程序;

killall:用于kill指定名称的进程;

fuser:用来显示所有正在使用着指定的file, file system 或者 sockets的进程信息。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐