最近需要紧急搭建Hadoop集群,以前搭建都没留下文档和记录,导致这次忙的晕头转向。现在终于搞定了,决定将全部过程记录下来,方便下次使用。
软件环境
- 操作系统:Centos 6.4
- JDK:1.6.0_27
- Hadoop:1.0.4
- HBase:0.94.17
- Zookeeper:3.4.5
前置步骤
范围:Hadoop集群所有机器
操作身份:root用户
创建Hadoop用户
1 2 |
adduser hadoop passwd hadoop |
关闭SELINUX
1 |
vi /etc/sysconfig/selinux |
修改:
1 |
SELINUX=disabled |
关闭防火墙
1 |
chkconfig --level 345 iptables off |
修改最大句柄数等限制
1 |
vi /etc/security/limits.conf |
加入:
1 2 3 4 5 |
hadoop soft nproc 20470 hadoop hard nproc 163840 hadoop soft nofile 10240 hadoop hard nofile 655360 hadoop soft stack 10240 |
1 |
vi /etc/pam.d/login |
加入:
1 |
session required pam_limits.so |
修改Hosts+关闭IPv6
1 |
vi /etc/hosts |
加入并修改,其中当前机器名需要放在
1 2 3 4 5 |
192.168.60.3 master 127.0.0.1 master localhost localhost.localdomain localhost4 localhost4.localdomain4 192.168.60.4 slave01 192.168.60.5 slave02 ... ... |
修改主机名+关闭IPv6
1 |
vi /etc/sysconfig/network |
加入并修改主机名:
1 2 |
NETWORKING_IPV6=no HOSTNAME=master |
关闭IPv6
1 |
vi /etc/modprobe.d/dist.conf |
加入:
1 2 |
alias net-pf-10 off alias ipv6 off |
挂载硬盘(可选)
可用
将sdb挂载到
1 2 3 4 |
mkdir /opt/hdfs mkfs -t ext3 /dev/sdb mount /dev/sdb /opt/hdfs chown -R hadoop /opt/hdfs |
1 |
vi /etc/fstab |
加入:
1 |
/dev/sdb /opt/hdfs ext3 defaults 0 0 |
安装JDK
1 2 3 4 |
chmod +x jdk-6u27-linux-x64.bin ./jdk-6u27-linux-x64.bin mv jdk1.6.0_27/ /usr/share/ rm jdk-6u27-linux-x64.bin |
重启
1 |
reboot |
ssh免密码登录
范围:Hadoop集群所有机器
操作身份:hadoop用户
在master机器上操作,将生成的authorized_keys拷贝至slaves机器上,可能需要预先创建
1 2 3 4 |
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys chmod 600 authorized_keys scp ~/.ssh/authorized_keys hadoop@slaves:~/.ssh/ |
此时可以免密码登录,若不能,需至slaves机器上运行:
1 2 |
chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh |
安装Hadoop
范围:Hadoop集群所有机器
操作身份:hadoop用户
解压Hadoop至/home/hadoop目录下。
1 |
tar zxvf hadoop-1.0.4.tar.gz |
配置mapred-site.xml
添加:
1 2 3 4 5 6 7 8 |
<property> <name>mapred.job.tracker</name> <value>master:9001</value> </property> <property> <name>mapred.child.java.opts</name> <value>-Xmx2000m</value> </property> |
配置core-site.xml
添加:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<property> <name>fs.default.name</name> <value>hdfs://master:9000</value> </property> <property> <name>fs.checkpoint.period</name> <value>3600</value> </property> <property> <name>fs.checkpoint.size</name> <value>67108864</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/hdfs/hdfs_data/tmp</value> </property> |
配置hdfs-site.xml
添加:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<property> <name>dfs.name.dir</name> <value>/opt/hdfs/hdfs_data/name</value> </property> <property> <name>dfs.data.dir</name> <value>/opt/hdfs/hdfs_data/data</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.datanode.max.xcievers</name> <value>4096</value> </property> <property> <name>dfs.datanode.socket.write.timeout</name> <value>1800000</value> </property> <property> <name>dfs.socket.timeout</name> <value>1800000</value> </property> <property> <name>dfs.block.size</name> <value>268435456</value> </property> |
配置masters
添加:
1 |
master |
配置slaves
添加,这里把master也当做slave(虽然我一直反对这么做,但为了节约资源,只能这么妥协):
1 2 3 4 5 |
master slave01 slave02 slave03 ... ... |
配置hadoop-env.sh
添加,ssh的端口为18933:
1 2 3 4 5 6 7 |
export JAVA_HOME=/usr/share/jdk1.6.0_27 export HADOOP_HOME_WARN_SUPPRESS=1 export HADOOP_HEAPSIZE=2048 export HADOOP_OPTS=-server export HADOOP_PID_DIR=/home/hadoop/hadoop-1.0.4/pids export HADOOP_SSH_OPTS="-p 18933" export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/hadoop/hadoop-1.0.4/lib/native/Linux-amd64-64/:/usr/local/lib/ |
分发
将配置好的Hadoop分发到其它节点上去。
安装Zookeeper
范围:Zookeeper集群所有机器
操作身份:zookeeper用户
解压Zookeeper至/home/zookeeper目录下。
配置zoo.cfg
1 |
cp zoo-sample.cfg zoo.cfg |
添加:
1 2 3 4 5 |
dataDir=/opt/hdfs/zookeeper/data dataLogDir=/opt/hdfs/zookeeper/log server.1=192.168.60.19:2888:3888 server.2=192.168.60.20:2888:3888 server.3=192.168.60.21:2888:3888 |
在
分发
将配置好的Zookeeper分发到其它节点上去,注意修改myid的值即可。
安装HBase
范围:Hadoop集群所有机器
操作身份:hadoop用户
解压HBase至/home/hadoop目录下。
配置hbase-env.sh
添加:
1 2 3 4 5 6 7 |
export JAVA_HOME=/usr/share/jdk1.6.0_27 export HBASE_MANAGES_ZK=false export HADOOP_HOME=/home/hadoop/hadoop-1.0.4/ export HBASE_HOME=/home/hadoop/hbase-0.94.17/ export HBASE_SSH_OPTS="-p 18933" export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/hadoop/hadoop-1.0.4/lib/native/Linux-amd64-64/:/usr/local/lib/ export HBASE_LIBRARY_PATH=$HBASE_LIBRARY_PATH:/home/hadoop/hbase-0.94.17/lib/native/Linux-amd64-64/:/usr/local/lib/ |
配置hbase-site.xml
添加:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<property> <name>hbase.rootdir</name> <value>hdfs://master:9000/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.master</name> <value>master:60000</value> </property> <property> <name>hbase.master.port</name> <value>60000</value> </property> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> </property> <property> <name>hbase.zookeeper.quorum</name> <value>zookeeper01,zookeeper02,zookeeper03</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/opt/hdfs/zookeeper/data</value> </property> |
配置regionservers
1 2 3 4 5 |
master slave01 slave02 slave03 ... ... |
分发
将配置好的HBase分发到其它节点上去。
后置操作
范围:Hadoop集群所有机器
操作身份:hadoop用户
配置.bashrc
添加:
1 2 3 4 5 6 7 8 9 10 11 |
export HADOOP_PREFIX=/home/hadoop/hadoop-1.0.4 export HADOOP_CONF_DIR=$HADOOP_PREFIX/conf JAVA_HOME=/usr/share/jdk1.6.0_27 PATH=$JAVA_HOME/bin:$HADOOP_PREFIX/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME export PATH export CLASSPATH export HBASE_HOME=/home/hadoop/hbase-0.94.17 export HBASE_CONF_DIR=$HBASE_HOME/conf export PATH=$PATH:$HBASE_HOME/bin |
1 |
source ~/.bashrc |
启动Hadoop
master机器上:
1 |
.~/hadoop-1.0.4/bin/start-all.sh |
启动Zookeeper
所有zookeeper机器上:
1 |
.~/zookeeper-3.4.5/bin/zkServer.sh start |
启动HBase
master机器上:
1 |
.~/hbase-0.94.17/bin/start-hbase.sh |
最后
要是有自动化部署工具该多好,虽然有了ambari这个东西,但完全不好用有木有,反而使问题变得更多,而且大部分集群都是离线的吧。
补充——时间同步
由于HBase的原因,集群的机器必须时间同步,至少不能差太远,不然会导致无法启动。
范围:Hadoop集群所有机器
操作身份:root用户
master机器上:
若master机器可以联网,可以先与中国国家授时中心服务器同步下时间
1 |
vi /etc/ntp.conf |
修改并添加:
1 2 3 4 5 6 |
server 127.127.1.0 fudge 127.127.1.0 stratum 8 #server 0.rhel.pool.ntp.org #server 1.rhel.pool.ntp.org #server 2.rhel.pool.ntp.org restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap |
启动ntpd服务
1 |
service ntpd start |
slaves机器上:
1 2 |
ntpdate master /sbin/hwclock -w |
设置每小时和master机器同步一次时间:
1 |
crontab -e |
添加:
1 |
0 */1 * * * /usr/sbin/ntpdate master |
你好 你这个文章里有点小错误 你在 ssh免密码登录 上写的是
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
其实应该是 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa 这条命令用的是dsa。当然你也可以用rsa,那后面就相应的如你所说用rsa。