围绕Hadoop而形成的生态圈中Hadoop扮演了重要的角色,学习大数据Hadoop自然是必经之路,本节基于Hadoop官方文档简述Hadoop 集群环境的搭建,单机版,伪分布式可自行参考文档.建议准备至少五台物理机或者虚拟机,且能够互相通信.在此之前建议不熟悉网络防火墙的朋友自行关闭防火墙,避免带来不必要的麻烦.自行安装JDK并配置PATH,JAVA_HOME等环境变量.

  • 下载Hadoop , http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.8.0/hadoop-2.8.0.tar.gz  大概410M左右.
  • 统一机器域名,以笔者为例,master20,master25,master57,master63,master64 ,且指定20,25规划为NameNode HA节点,其余为DataNode 数据存储节点
  • 鉴于多机安装的重复性,暂选择一台主机为目标机器待配置项目完成后进行安装文件分发.
  • 这里选 20为目标机器,将下载的hadoop安装包上传至 /app路径下 解压,tar -zxf hadoop-2.8.0.tar.gz
  • 由于Hadoop的NameNode要通过网络连接与DataNode进行通信且需要远程启动DataNode,为方便使用了SSH免密登录操作,所以集群中的每个机器上都应该安装SSH,可使用yum install openssh-server [CentOS 7] 安装,如以安装无视即可.
  • 配置到本机的免密登录可执行以下命令,在所有集群主机上. 下述操作生成公钥,并将公钥存入authorized_keys文件,均在当前用户下.
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
  • 接下来开始配置HDFS集群环境,仍然以20为目标机器,进入hadoop主目录,即bin同级目录.
  • 修改etc/hadoop/hadoop-env.sh    ,如下其它暂不做改动,此处etc/hadoop目录下是hadoop的配置文件所在地
export JAVA_HOME=/app/jdk1.8
  • 修改etc/hadoop/core-site.xml ,做如下修改,该配置文件为Hadoop的核心公共配置文件. 显然如下配置的fs.defaultFS并不合理!!!单节点及为分布式如下配置就可以,在最后的NameNode HA配置中我们将修改该配置项.
<configuration>
	<!--HDFS的访问路径-->
	<property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
	<!--HDFS 数据库复本数-->
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>
  • 修改etc/hadoop/hdfs-site.xml
<configuration>
	<!--HDFS NameNode 元数据存储位置,其中最后一个目录不能主动创建,前面的目录需要主动创建-->
	<property>
        <name>dfs.namenode.name.dir</name>
        <value>/data/hadoop/name</value>
    </property>
	<!--HDFS DataNode 元数据存储位置,其中最后一个目录不能主动创建,前面的目录需要主动创建-->
	<property>
        <name>dfs.datanode.data.dir</name>
        <value>/data/hadoop/data</value>
    </property>
	<!--HDFS块大小 这里设置为64M-->
	<property>
        <name>dfs.blocksize</name>
        <value>67108864</value>
    </property>
</configuration>
  • 修改etc/hadoop/slaves 文件,该文件中枚举了所有可用的DataNode节点,如下,这里如果NameNode节点也允许存储数据也可以加入该列表,不建议加入.
master57
master63
master64
  • 至此HDFS的基本配置完成,由于NadeNode存在单点故障的可能,在将Hadoop安装文件分发到其它节点之前最好配置好NameNode的HA
  • NameNode HA参考官方文档  http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
  • NameNode采用主备节点的方式实现HA,主备节点的数据同步通过一组分散在集群中的JNS进程 以JournalNode 为守护进程,JournalNode节点的个数应该不少于三个.
  • 配置实现,修改hdfs-site.xml 做如下调整,
<configuration>

	<!--定义NameNode 服务名称,需要在core-site.xml中引用-->
	<property>
		 <name>dfs.nameservices</name>
			<value>xiaofen</value>
	</property>
	<!--两个NameNode 各自的标识-->
	<property>
		<name>dfs.ha.namenodes.xiaofen</name>
		<value>nn1,nn2</value>
	</property>
	
	<!--NameNode 节点RPC通信地址配置-->
	<property>
	  <name>dfs.namenode.rpc-address.xiaofen.nn1</name>
	  <value>master20:8020</value>
	</property>
	<property>
	  <name>dfs.namenode.rpc-address.xiaofen.nn2</name>
	  <value>master25:8020</value>
	</property>

	<!--NameNode主备同步共享的编辑日志存储位置
		qjournal://*host1:port1*;*host2:port2*;*host3:port3*/*journalId*
		其中journalId 为 NameNode 服务ID
	-->
	<property>
	  <name>dfs.namenode.shared.edits.dir</name>
	  <value>qjournal://master57:8485;master63:8485;master64:8485/xiaofen</value>
	</property>

	<!--编辑日志文件的路径,如果当前机器在上述的编辑日志机器列表中则进行存储-->
	<property>
	  <name>dfs.journalnode.edits.dir</name>
	  <value>/data/hadoop/journal/</value>
	</property>

	<!--客户端故障切换,客户端可自动切换到Active状态的节点-->
	<property>
	  <name>dfs.client.failover.proxy.provider.mycluster</name>
	  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>
       <!--配置自动故障转移,该模块由ZK支持-->
    <property>
           <name>dfs.ha.automatic-failover.enabled</name>
           <value>true</value>
     </property>
    <property>
           <name>ha.zookeeper.quorum</name>
           <value>master:13,master20:2181,master25:2181</value>
    </property>
    <!--sshfence 隔离机制配置-->
    <property>
          <name>dfs.ha.fencing.methods</name>
          <value>sshfence</value>
    </property>
    <!--SSH key 地址-->
    <property>
          <name>dfs.ha.fencing.ssh.private-key-files</name>
          <value>/root/.ssh/id_dsa</value>
    </property>

	<!--HDFS NameNode 元数据存储位置,其中最后一个目录不能主动创建,前面的目录需要主动创建-->
	<property>
        <name>dfs.namenode.name.dir</name>
        <value>/data/hadoop/name/</value>
    </property>
	<!--HDFS DataNode 元数据存储位置,其中最后一个目录不能主动创建,前面的目录需要主动创建-->
	<property>
        <name>dfs.datanode.data.dir</name>
        <value>/data/hadoop/data/</value>
    </property>
	<!--HDFS块大小 这里设置为64M-->
	<property>
        <name>dfs.blocksize</name>
        <value>67108864</value>
    </property>
</configuration>




  • 修改core-site.xml 至此NameNode 的HA配置基本完成,需要修改core-site中的fs.defaultFS 为NameNode 服务ID而不在指具体的某个机器的IP地址
<configuration>
	<!--HDFS的访问路径-->
	<property>
        <name>fs.defaultFS</name>
        <value>hdfs://xiaofen</value>
    </property>
	<!--HDFS 数据库复本数-->
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
</configuration>
  • 这一步,基本的配置项已经完成进行Hadoop安装文件的分发, 将20主机的hadoop-2.8.0 目录直接发送到 25,57,63,64主机,示例scp -r root@master25:/app ,其它类似.
  • 接下来!! 在处理NameNode之前一定要创建之前配置项目中所设计的目录中的倒数第二级,此处以笔者的/data/hadoop为例, 其它name data journal.
  • 初始化ZK节点 执行 hdfs zkfc -formatZK
  • 在启动namenode并格式化namenode 之前 需要启动JournalNode 节点在每个配置的JournalNode节点中,在hadoop 主目录下执行 sbin/hadoop-daemon.sh  start journalnode ; 这里需要将上述配置的JournalNode节点皆启动不少于三个节点.可通过JPS确认.
  • 为方便统一集群管理,需要将所有NamaeNode节点的公钥加入到DadeNode节点的authorized_keys 文件中. 当然不配置可以单个启动集群.
  • 格式化集群,选一个namenode 为初始节点执行 bin/hdfs  namenode  -format ,
  • 启动当前NameNode 使用  sbin/hadoop-daemon.sh start namenode
  • 进入第二个NameNode 节点主目录 执行 拷贝操作,同步第一个NameNode 的状态到当前节点.执行  bin/hdfs namenode -bootstrapStandby 至此两个NameNode 节点数据同步
  • 关停所有已经启动的节点包括NameNode ,JournalNode. 重新启动集群.使用 任选一NameNode 执行 sbin/start-dfs.sh 操作启动集群.
  • HDFS管理端口50070 ,可登录查看 HA机制将自动选举一个Active节点一个standby节点.