三种模式
1.伪分布式:只有一台服务器,运行所有节点(仅用于测试学习)
2.完全分布式:各个节点分布在不同服务器上,资源使用不冲突
3.高可用的完全分布式:提高HDFS的可用性
伪分布式
仅使用hadoop01一台服务器
搭建步骤
1. 配置免密登录 hadoop01->hadoop01
在~/.ssh目录下
生成私钥
ssh-keygen -t rsa
将公钥传给自己
ssh-copy-id -i ~/.ssh/id_rsa.pub root@node01
2. 配置JDK
在/etc/profile写入
export JAVA_HOME=/opt/software/jdk/jdk1.8.0_151
export PATH=\$PATH:$JAVA_HOME/bin
3. 修改hdfs-site.xml配置文件
<property>
<-- 副本数量 默认3 -->
<name>dfs.replication</name>
<value>1</value>
</property>
<-- SNN节点地址 伪分布式配置在当前地址-->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hadoop01:50090</value>
</property>
4. 修改core-site.xml配置文件
<property>
<-- 前缀 -->
<name>fs.defaultFS</name>
<value>hdfs://hadoop01:9000</value>
</property>
<property>
<-- 存储目录 没有则创建 -->
<name>hadoop.tmp.dir</name>
<value>/var/abc/hadoop/local</value>
</property>
5. 修改slaves配置文件
即从节点名,伪分布式从节点为自己,所以写
hadoop01
6. 配置hadoop环境变量
在用户配置~/.bashrc内添加
export HADOOP_HOME=/opt/hadoop/hadoop-2.6.5
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
7. 格式化NameNode(创建目录以及文件)
hdfs namenode -format
8. 启动HDFS
start-dfs.sh
遇到的问题
- 找不到JAVA_HOME --> 在用户配置文件~/.bashrc中也配置JAVA_HOME
- 找不到hadoop01的错误 --> 未修改/etc/hosts,写入ip+主机名
- 初始化时找不到namenode主类 --> 检查命令是否正确,或重新解压文件
完全分布式
node01 NameNode
node02 SecondaryNameNode和DataNode
node03 DataNode
node04 DataNode
搭建步骤
1. 时间同步
在各个节点安装ntp命令
yum install ntp
查找最新的时间服务器
ntp1.aliyun.com
同步时间
ntpdate ntp1.aliyun.com
2. 配置免密登录
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
3. 所有节点配置JDK
略
4. 修改hdfs-site.xml配置文件
<property>
<-- 副本数量 默认3 -->
<name>dfs.replication</name>
<value>3</value>
</property>
<-- SNN节点地址 -->
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node02:50090</value>
</property>
5. 修改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>
6. hadoop环境变量
略
7. 修改slaves配置文件
修改为
node02
node03
node04
8. 将配置好的安装包分发到其他节点上
在hadoop的上级目录
scp -r hadoop-2.6.5 root@node02:/opt/software/hadoop/
scp -r hadoop-2.6.5 root@node03:/opt/software/hadoop/
scp -r hadoop-2.6.5 root@node03:/opt/software/hadoop/
或简写为
scp -r hadoop-2.6.5 root@node02:`pwd`
9. 将所有的HDFS相关的进程关闭
格式化NameNode(创建目录以及文件)
在node01节点执行
hdfs namenode -format
- 启动HDFS
start-dfs.sh
遇到的问题
- 分发公钥时找不到节点 --> 未配置hosts
- 启动后找不到存活节点 --> 所有节点都应该配置hosts
- 外部无法访问hdfs --> 关闭防火墙
临时关闭
service iptables stop
永久关闭
chkconfig iptables off
高可用的完全分布式
集群规划
搭建步骤
- 配置免密登录
node01->node01 | node01->node02 | node01->node03 | node01->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>
- 修改slaves配置文件
修改为
node02
node03
node04
- 将配置好的HDFS安装包拷贝到node02 node03 node04
scp -r hadoop-2.6.5 root@node02:/opt/software/hadoop/
scp -r hadoop-2.6.5 root@node03:/opt/software/hadoop/
scp -r hadoop-2.6.5 root@node03:/opt/software/hadoop/
- 格式化NameNode(创建目录以及文件)
- 在node01、node02、node03分别执行如下命令
hadoop-daemon.sh start journalnode
- 随机选择一台NameNode执行:
hdfs namenode -format
单独启动NN1
hadoop-daemon.sh start namenode
- 另外一台NameNode节点执行:
同步元数据
hdfs namenode -bootstrapStandby
- 搭建zookeeper集群
- 解压
- 修改conf目录下的zoo_sample.cfg的名称,改为zoo.cfg
mv zoo_sample.cfg zoo.cfg - 修改zoo.cfg
dataDir=/var/abc/zookeeper
server.1=node02:2888:3888
server.2=node03:2888:3888
server.3=node04:2888:3888 - 在dataDir目录下创建一个myid文件,在这个文件中写上当前节点ID号
- 将配置好的zookeeper安装包拷贝到node03 node04
- 拷贝完毕后,在各自节点上创建myid号,ID号要依次递增
- 三台zk在bin内执行serverZK.sh start
- 启动zkfc
hdfs zkfc -formatZK
- 关闭所有节点上的进程
(将零散开启的、用于初始化集群的进程关闭)
stop-dfs.sh
- 启动HDFS
start-dfs.sh
遇到的问题
- dataDir目录需手动创建,并在其下创建myid
- 未在三台zookeeper节点上启动ZK服务,在启动zkfc时报错找不到zk进程
*虚拟机的配置
- 查看虚拟机ip
ifconfig
- 根据查询到的ip修改ipcfg文件
cd /etc/sysconfig/network-scripts/
vim ifcfg-eth0
修改
ONBOOT=yes
BOOTPROTO=none
添加
IPADDR=192.168.180.128 (查询到的ip)
PREFIX=24
GATEWAY=192.168.180.2 (根据ip修改)
DNS1=8.8.8.8
- 复制虚拟机,并重新执行1和2
(可将JAVA_HOME和HADOOP_HOME一并配置好后再复制) - 修改hostname
cd /etc/sysconfig/
vim network
- 修改hosts
vim /etc/hosts