分布式HDFS集群搭建

伪分布式搭建过程

概述

在一个节点上,完成HDFS各个组件的搭建。
如不熟悉HDFS各个组件及功能,可参阅如下博客。

个人博客: xzy

步骤

  • 首先编辑网络环境
    通过这个命令 # vi /etc/sysconfig/network-scripts/ifcfg-eth0 查看当前网络状态,若想配置ip重启后不自动更改,可以设置 ONBOOT=yes # 把网卡设置成开机启动。也可以设置静态ip,这里不再累述。
  • 关闭防火墙
sudo service iptables stop      # 关闭防火墙服务。
sudo chkconfig iptables off     # 禁止防火墙开机自启。
  • 安装jdk配置环境变量
#安装jdk
sudo tar -zxvf jdk1.8.0_151_linux-x64_bin.tar -/home/software
	#sudo 代表使用管理员权限	 路径为自己的安装路径
#配置环境变量
vim ~/.bashrc

# 在文件最后添加
export JAVA_HOME=/home/software/jdk-1.8
export PATH=$JAVA_HOME/bin:$PATH

# 接下来需要使环境变量生效.
source ~/.bashrc

若配置正确可以使用 java -version查看版本

  • 修改hosts映射

    # 在文件中添加本机Ip(ifconfig可以查看ip) 和用户名
    sudo vi /etc/hosts
    #例如
    192.168.23.196	node01
  • 配置免密登录
    若使用mini版Linux 则需先下载ssh工具包

    sudo yum install openssh-clients
    sudo yum install openssh-server
    #生成自己的公钥**
    ssh-****** -t rsa
    #把自己的公钥给node01(这里也就是自己)
    ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
    #验证
    ssh 主机ip 或 主机名(前提有hosts映射)
  • 安装配置Hadoop

    • 下载hadoop
    • 解压到当前目录
      tar -zxvf hadoop-2.6.5.tar.gz
      mv hadoop-2.6.5 hadoop #更改文件夹名 方便操作
    • 配置环境变量
    vim ~/.bashrc
    # 在文件最后添加:
    export HADOOP_HOME=/home/software/hadoop
    export HADOOP_INSTALL=$HADOOP_HOME
    export HADOOP_MAPRED_HOME=$HADOOP_HOME
    export HADOOP_COMMON_HOME=$HADOOP_HOME
    export HADOOP_HDFS_HOME=$HADOOP_HOME
    export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
    
    # 使用source命令,是环境变量生效.
    source ~/.bashrc

    若配置成功可使用hadoop version 查看版本信息

  • 修改配置文件

    • 修改hdfs-site.xml配置文件
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>     
    	<name>dfs.namenode.secondary.http-address</name>
     	<value>node01:50090</value>
    </property>
    • 修改core-site.xml配置文件
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://node01:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
     #临时文件夹 名字可自取 如果启动失败 可以删除abc目录再次启动
        <value>/var/abc/hadoop/local</value>
    </property>
    • 修改slaves配置文件
      localhost改为node01
  • 格式化NameNode(创建目录以及文件)

    • hdfs namenode -format
  • 启动HDFS

    • start-dfs.sh 关闭为 stop-dfs.sh
    • 启动成功可以看到 successful formatted和"Exitting with status 0"等字样
  • 启动后就可以操作HDFS啦
    创建目录 例 hdfs dfs -mkdir -p /home/test
    上传文件 例 hdfs dfs -D dfs.blocksize=1048576 -put

完全分布式搭建

概述

将各个角色的进程(角色=进程)在不同的节点启动
例如

node01 node02 node03 node04
NameNode DataNode SecondaryNameNode DataNode DataNode

步骤

  • 时间同步
    • 这里使用阿里云的时间服务器
    • 每个节点使用命令
      yum install ntp # 安装ntp
      ntpdate ntp1.aliyun.com # 使用阿里云同步时间
      成功后可通过date来查看时间
  • 配置免密登录
    与伪分布式不同的是,分布式搭建需要NN与控制多个节点
    node01>node01 ; node01>node02 ; node01>node03 ; node01>node04
  • 对所有节点配置JDK(同伪分布式)
  • 修改配置文件
    • hdfs-site.xml

      <property>
        	<name>dfs.replication</name>
      	<value>3</value>
      </property>
      <property>   
       	<name>dfs.namenode.secondary.http-address</name>
       	<value>node02:50090</value>
      </property>
    • core-site.xml

      <property>
      	<name>fs.defaultFS</name>
      	<value>hdfs://node01:9000</value>
      </property>
      <property>
       	<name>hadoop.tmp.dir</name>
      	<value>/var/abc/hadoop/cluster</value>
      </property>
    • 修改slaves文件
      修改为

      node02
      	node03
      	node04
    • 将配置好的安装包分发到其他节点上

    scp -r hadoop-2.6.5 [email protected]:/home/software/hadoop/
    scp -r hadoop-2.6.5 [email protected]:/home/software/hadoop/
    scp -r hadoop-2.6.5 [email protected]:/home/software/hadoop/
    # 注意一点 发送目录必须与接收目录一致
  • 将所有的HDFS相关的进程关闭
    stop-dfs.sh
  • 格式化NameNode
    hdfs namenode -format
  • 启动HDFS
    start-dfs.sh

高可用的分布式搭建

概述

首先从Hadoop的缺陷说起

  • 如果NN发生故障 那么整个集群将进入瘫痪状态。
    由此 NN需要一个备用的NN,这个备用的NN将代替之前SecondaryNN的功能。两个NN只用一个是活跃状态也就是active状态,另一个为standby状态。当集群运行时,只有active状态的NameNode是正常工作的,standby状态的NameNode是处于待命状态的,时刻同步active状态NameNode的数据。一旦active状态的NameNode不能工作,standby状态的NameNode就可以转变为active状态的,就可以继续工作了。
  • 同时新增了一个JN集群进行相互通信,当active状态的NameNode有任何修改时,会告知大部分(少数服从多数)的JournalNodes。standby状态的NameNode从JN中读取的edits,把变化应用于自己的NN。standbyNN可以确保在集群出错时,命名空间状态已经完全同步了。
  • 为了保证控制两个NN的轮换或者说选举,因为两个NN会导致数据的分歧,也称为脑裂;这时就会引入ZooKeeper,ZooKeeper相当于监视者,通过两个组件(ZKFC)监控着NN的运行状态,两个组件分别监控两个NN。一旦出现故障,就可以立马通知Zookeeper,ZooKeeper决定去切换NN。
  • 如果其中有一个ZKFC出现故障,那么他对应的NN将会被弃用,置为StandBy状态。
    HA完全分布式

步骤

集群规划

NN NN DN ZK ZKFC JN
node01
node02
node03
node04
  • 配置免密
    在完全分布式的基础上 新增 node02>node01

  • 配置JDK

  • 修改配置文件

    • hdfs-site.xml
    <property>
    	    <name>dfs.nameservices</name>
    	    <value>mycluster</value>
    </property>
    <property>
    		<name>dfs.ha.namenodes.mycluster</name>
    		<value>nn1,nn2</value>
    </property>
    <property>
     		<name>dfs.namenode.rpc-address.mycluster.nn1</name>
    		  <value>node01:8020</value>
    </property>
    <property>
     	 <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    	  <value>node02:8020</value>
    </property>
    <property>
     	 <name>dfs.namenode.http-address.mycluster.nn1</name>
    	  <value>node01:50070</value>
    </property>
    <property>
    	  <name>dfs.namenode.http-address.mycluster.nn2</name>
    	 <value>node02:50070</value>
    </property>
    <property>
      	<name>dfs.namenode.shared.edits.dir</name>
    	<value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
    </property>
    <property>
    	<name>dfs.journalnode.edits.dir</name>
    	 <value>/var/sxt/hadoop/ha/jn</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>
    <property>
    	 <name>dfs.ha.fencing.ssh.private-key-files</name>
     	 <value>/root/.ssh/id_rsa</value>
    </property>
    <property>
    	 <name>dfs.ha.automatic-failover.enabled</name>
     	  <value>true</value>
     </property>
    • core-site.xml
    <property>
       <name>fs.defaultFS</name>
       <value>hdfs://mycluster</value>
    </property>
    <property>
      <name>ha.zookeeper.quorum</name>
     <value>node02:2181,node03: 2181,node04:2181</value>
    </property>
    <property>
       	 <name>hadoop.tmp.dir</name>
       	 <value>/var/abc/hadoop/local</value>
    </property>
    • slaves 同完全分布式
  • 把配置好的HDFS安装包拷贝到其他节点

  • 搭建zookeeper集群

    • 解压
    • 修改conf目录下的zoo_sample.cfg的名称,改为zoo.cfg
  • 格式化NameNode

    • 在 node02 03 04 启动zookeeper
      在zookeeper目录的bin下输入./zkServer.sh start
    • 在node 01 02 03分别执行如下指令
      hadoop-daemon.sh start journalnode
    • 选择一台NameNode执行:
    hdfs namenode -format
     	hadoop-daemon.sh start namenode
    • 另外一台NN执行(备用NN)
      hdfs namenode -bootstrapStandby
    • 在主NN中执行
      hdfs zkfc -formatZK
    • 接着关闭所有节点上的进程
      stop-dfs.sh
    • 再重新启动HDFS
      start-dfs.sh

遇见的问题

  • Zookeeper启动失败
    • 防火墙没有关
    • myid没有配置好
    • myid旁生成的zookeeper_server.pid结尾的文件在重启前最好删了,怕有缓存.
    • hosts文件没有配置好 无法进行映射连接
  • DataNode启动不起来
    • 主要是hosts 文件没有配置好