本文尝试在CentOS上搭建10台HDFS集群,不会搭建YARN和Hive, 因为之后会采用Spark。先安装jdk 1.8, 此处不细说。
服务器有12块磁盘,因此这是一个真实场景下的集群搭建,只是规模较小。HDFS集群支持HA,因此配置略复杂一些。
集群架构
1.3.1 HDFS cluster
IP | installed binary | hardware info | usage | admin | data folder | gcc/g++ |
---|---|---|---|---|---|---|
×.152 | /data/slot0/hadoop | NN1 | lisa | 4.9.1 | ||
×.153 | NN2 | |||||
×.154 | DN1/JN1 | |||||
×.155 | DN2/JN2 | |||||
×.156 | DN3/JN3 | |||||
×.157 | DN4 | |||||
×.158 | DN5 | |||||
×.159 | DN6 | |||||
×.160 | DN7 | |||||
×.161 | DN8 |
下载
首先下载hadoop binary包
wget http://apache.mesi.com.ar/hadoop/common/hadoop-2.7.1/hadoop-2.7.1.tar.gz
解压后放在/data/slot0/目录下,并建立软链接/data/slot0/hadoop
创建帐号
创建管理hadoop集群的帐号
useradd lisa
会出现/home/lisa目录,lisa帐号无需密码,因为不能直接用密码登录,不过可以通过ssh证书登录。
可以用批处理的方式对10台服务器都创建lisa帐号,主要通过ssh -t 这里不再细说
修改目录拥有者
chown -R lisa:lisa hadoop-2.7.1/
chown -R lisa:lisa hadoop
ll
total 8
drwxr-xr-x 3 root root 4096 Sep 25 18:02 download
lrwxrwxrwx 1 lisa lisa 13 Sep 25 17:42 hadoop -> hadoop-2.7.1/
drwxr-xr-x 9 lisa lisa 139 Jun 29 14:15 hadoop-2.7.1
lrwxrwxrwx 1 root root 24 Sep 25 16:50 java -> /data/slot0/jdk1.8.0_45/
drwxr-xr-x 8 root root 4096 Sep 25 14:01 jdk1.8.0_45
打通帐号间SSH认证
切换到hadoop系统使用的帐号,然后生成ssh key
su - lisa
ssh-keygen -t rsa -P ''
Generating public/private rsa key pair.
Enter file in which to save the key (/home/lisa/.ssh/id_rsa):
Created directory '/home/lisa/.ssh'.
Your identification has been saved in /home/lisa/.ssh/id_rsa.
Your public key has been saved in /home/lisa/.ssh/id_rsa.pub.
The key fingerprint is:
15:44:c6:4e:bb:cd:b9:09:e7:50:c7:ae:dd:92:56:57 lisa@10-149-11-152
The key's randomart image is:
+--[ RSA 2048]----+
| += |
| .o. |
| o.. . |
| .o . o E|
|S = + .|
| + = . o|
| = = +.|
|= = .|
| . . |
+-----------------+
将公钥放入各个节点的authorized_keys文件, 目前看来这是个体力活,还没有特别好的方法批处理。
注意authorized_keys必须用于744权限。
chmod 744 ./authorized_keys
配置/etc/hosts
10台服务器的/etc/hosts要一样,便于互相通过hostname通信。
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.149.11.152 10-149-11-152
10.149.11.153 10-149-11-153
10.149.11.154 10-149-11-154
10.149.11.155 10-149-11-155
10.149.11.156 10-149-11-156
10.149.11.157 10-149-11-157
10.149.11.158 10-149-11-158
10.149.11.159 10-149-11-159
10.149.11.160 10-149-11-160
10.149.11.161 10-149-11-161
配置core-site.xml
切换到lisa帐号,编辑core-site.xml文件
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://10-149-11-152:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>10.149.11.146:2181,10.149.11.147:2181,10.149.11.148:2181</value>
</property>
</configuration>
说明:
1.fs.default.name 的值包含了两类信息:
URL Schema, 这里是hdfs://,表明实现是hdfs文件系统
authority, 这是是namenode的hostname (10-149-11-152) 和 端口号 (9000)
当使用hdfs 命令时,如果没有使用文件协议和前缀,这个hdfs://... 会自动作为前缀使用。
2.ha.zookeeper.quorum
这里启用了namenode的Quorum Journal Manager的HA方案,使用了三台zookeeper。
配置hdfs-site.xml
先创建一系列目录用于存放namenode、journalnode和datanode数据, 这些目录不需要在每台服务器上都必须创建的,为了图省事,我都建了,只是有些不用而已。
mkdir -p /data/slot0/lisa/hdfs/namenode
mkdir -p /data/slot0/lisa/hdfs/journalnode
mkdir -p /data/slot0/lisa/hdfs/datanode
mkdir -p /data/slot1/lisa/hdfs/datanode
mkdir -p /data/slot2/lisa/hdfs/datanode
mkdir -p /data/slot3/lisa/hdfs/datanode
mkdir -p /data/slot4/lisa/hdfs/datanode
mkdir -p /data/slot5/lisa/hdfs/datanode
mkdir -p /data/slot6/lisa/hdfs/datanode
mkdir -p /data/slot7/lisa/hdfs/datanode
mkdir -p /data/slot8/lisa/hdfs/datanode
mkdir -p /data/slot9/lisa/hdfs/datanode
mkdir -p /data/slot11/lisa/hdfs/datanode
mkdir -p /data/slot10/lisa/hdfs/datanode
chown -R lisa:lisa /data/slot0/lisa
chown -R lisa:lisa /data/slot1/lisa
chown -R lisa:lisa /data/slot2/lisa
chown -R lisa:lisa /data/slot3/lisa
chown -R lisa:lisa /data/slot4/lisa
chown -R lisa:lisa /data/slot5/lisa
chown -R lisa:lisa /data/slot6/lisa
chown -R lisa:lisa /data/slot7/lisa
chown -R lisa:lisa /data/slot8/lisa
chown -R lisa:lisa /data/slot9/lisa
chown -R lisa:lisa /data/slot10/lisa
chown -R lisa:lisa /data/slot11/lisa
可以用我之前的博客介绍的方法批量创建。
现在修改/data/slot0/hadoop/etc/hadoop/hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/slot0/lisa/hdfs/namenode</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/data/slot0/lisa/hdfs/journalnode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/slot0/lisa/hdfs/datanode,/data/slot1/lisa/hdfs/datanode,/data/slot2/lisa/hdfs/datanode,/data/slot3/lisa/hdfs/datanode,/data/slot4/lis\
a/hdfs/datanode,/data/slot5/lisa/hdfs/datanode,/data/slot6/lisa/hdfs/datanode,/data/slot7/lisa/hdfs/datanode,/data/slot8/lisa/hdfs/datanode,/data/slot\
9/lisa/hdfs/datanode,/data/slot10/lisa/hdfs/datanode,/data/slot11/lisa/hdfs/datanode</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
</property>
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>vehicle</value>
</property>
<property>
<name>dfs.ha.namenodes.vehicle</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.vehicle.nn1</name>
<value>10-149-11-152:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.vehicle.nn2</name>
<value>10-149-11-153:9000</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.vehicle</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/lisa/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://10-149-11-154:8485;10-149-11-155:8485;10-149-11-156:8485/vehicle</value>
</property>
</configuration>
环境变量
/etc/profile文件中添加五行设置
export JAVA_HOME=/data/slot0/java
export PATH=$JAVA_HOME/bin:$PATH
export HADOOP_HOME=/data/slot0/hadoop
export PATH=$HADOOP_HOME/bin:$PATH
export PATH=$HADOOP_HOME/sbin:$PATH
启动
1.先启动zookeeper, 不在本文赘述
2.启动所有的journalnode服务154,155,156
注意,切换到lisa帐号后运行命令,
$ hadoop-daemon.sh start journalnode
starting journalnode, logging to /data/slot0/hadoop-2.7.1/logs/hadoop-lisa-journalnode-10-149-11-152.out
3.在第一台namenode(152)上运行format命令
注意,切换到lisa帐号后运行命令,
hdfs namenode -format
4.将namenode信息同步到journalnode服务器
hdfs namenode -initializeSharedEdits
5.启动namenode 服务
hadoop-daemon.sh --config $HADOOP_HOME/etc/hadoop --script hdfs start namenode
6.将 aceive namenode的元数据同步到对应的standby namenode上
在namenode 2 (153) 上运行命令
hdfs namenode -bootstrapStandby
7.启动第二个namenode
hadoop-daemon.sh --config $HADOOP_HOME/etc/hadoop --script hdfs start namenode
查看下日志,一切正常。
8.启动datanode
在154-161机器上,执行下面的命令, 可以借助之前博客中的批处理技术,前提是用lisa帐号登录,互相帐号ssh认证要打通。
su - lisa
hadoop-daemon.sh --config $HADOOP_HOME/etc/hadoop --script hdfs start datanode
Ubuntu上使用Hadoop 2.x+HDFS Federation:http://www.linuxdiyf.com/linux/10740.html