伪分布式搭建过程
概述
在一个节点上,完成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-keygen -t rsa #把自己的公钥给node01(这里也就是自己) ssh-copy-id -i ~/.ssh/id_rsa.pub root@node01 #验证 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- 对所有的节点执行
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
- 在node01下执行,将node01的公钥添加到其他节点白名单中
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node01 ssh-copy-id -i ~/.ssh/id_rsa.pub root@node02 ssh-copy-id -i ~/.ssh/id_rsa.pub root@node03 ssh-copy-id -i ~/.ssh/id_rsa.pub root@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 root@node02:/home/software/hadoop/ scp -r hadoop-2.6.5 root@node03:/home/software/hadoop/ scp -r hadoop-2.6.5 root@node04:/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状态。
步骤
集群规划
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
- 在 node02 03 04 启动zookeeper
遇见的问题
- Zookeeper启动失败
- 防火墙没有关
- myid没有配置好
- myid旁生成的zookeeper_server.pid结尾的文件在重启前最好删了,怕有缓存.
- hosts文件没有配置好 无法进行映射连接
- DataNode启动不起来
- 主要是hosts 文件没有配置好