Hadoop版本:hadoop-2.5.1-x64.tar.gz
学习参考了给力星http://www.powerxing.com/install-hadoop-cluster/的两个节点的hadoop搭建过程,我用VirtualBox开了四个Ubuntu(版本15.10)虚拟机,搭建了四个节点的Hadoop分布式集群,并配置了HA,适合首次搭建的同学参考,节点设计如下:
sudo useradd -m hadoop -s /bin/bash
为hadoop用户设置密码,建议所有密码都设置为hadoop:
sudo passwd hadoop
为hadoop用户增加管理员权限:
sudo adduser hadoop sudo
最后注销当前用户(点击屏幕右上角的齿轮,选择注销),在登陆界面使用刚创建的 hadoop用户进行登陆。用 hadoop 用户登录后,我们先更新一下 apt,方便后续安装软件:
sudo apt-get update
安装Vim进行文本编辑:
sudo apt-get install vim
集群、单节点模式都需要用到 SSH 登陆(类似于远程登陆,你可以登录某台 Linux 主机,并且在上面运行命令),Ubuntu 默认已安装了 SSH client,此外还需要安装 SSH server:
sudo apt-get install openssh-server
配置ssh无密码登录的步骤我们后边再做。
直接通过命令安装 OpenJDK7:
sudo apt-get install openjdk-7-jre openjdk-7-jdk
安装好 OpenJDK 后,需要找到相应的安装路径,这个路径是用于配置 JAVA_HOME 环境变量的。执行如下命令:
dpkg -L openjdk-7-jdk | grep '/bin/javac'
该命令会输出一个路径,除去路径末尾的 “/bin/javac”,剩下的就是正确的路径了。如输出路径为/usr/lib/jvm/java-7-openjdk-amd64/bin/javac,则我们需要的路径为/usr/lib/jvm/java-7-openjdk-amd64。接着配置 JAVA_HOME 环境变量,为方便,我们在 ~/.bashrc 中进行设置:
vim ~/.bashrc
在文件最前面添加如下单独一行(注意 = 号前后不能有空格),将“JDK安装路径”改为上述命令得到的路径,并保存:
export JAVA_HOME=JDK安装路径
接着还需要让该环境变量生效,执行如下代码:
source ~/.bashrc # 使变量设置生效
【在 Linux系统中,~代表的是用户的主文件夹,即“/home/用户名”这个目录,如你的用户名为hadoop,则 ~就代表 “/home/hadoop/”。】
我把Master节点在Virtualbox中克隆了3次,分别命名Slave1,Slave2和Slave3,网络连接方式改为桥接,在所有节点上都要做如下2件事:
修改主机名,和我们设定的节点名称对应(重启系统生效):vim /etc/hostname
把你的所有主机名和对应的ip地址加进去(ifconfig查看本机ip)
vim /etc/hosts
所有节点都完成后,测试一下能不能ping通。
ping Slave1 -c 3 # ping Slave1节点,-c3表示只ping 3次,按Ctrl+c中断命令
cd ~/.ssh/ # 若没有该目录,请先执行一次ssh localhost,然后使用exit退出
ssh-keygen -t rsa # 会有提示,都按回车就可以
cat ./id_rsa.pub >> ./authorized_keys # 加入授权
此时再用 ssh localhost 命令,无需输入密码就可以直接登陆了。scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/
然后在Slave1节点上操作,将 ssh 公匙加入授权:
mkdir ~/.ssh # 如果不存在该文件夹需先创建,若已存在则忽略
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
rm ~/id_rsa.pub # 用完就可以删掉了
在别的Slave节点上也要做传输和授权公钥的步骤!
这样,在 Master 节点上就可以无密码 SSH 到各个 Slave 节点了。
【scp 是 secure copy 的简写,用于在 Linux 下进行远程拷贝文件,类似于 cp 命令,不过 cp 只能在本机中拷贝。如果在scp传文件时报错,出现permission denied,到目标文件修改权限就行了:
sudo chown –R hadoop 路径
如果修改权限时报错:/etc/sudoers属于用户id1000应为0或没有找到有效的sudoers资源,把上述命令中的sudo去掉就行了】
我使用的是2.5.1的64位版本,安装包放在了“~/下载”这个路径下,Master节点下执行:
sudo tar -zxf ~/下载/hadoop-2.6.0.tar.gz -C /usr/local # 解压到/usr/local中
cd /usr/local/
sudo mv ./hadoop-2.6.0/ ./hadoop # 将文件夹名改为hadoop
sudo chown -R hadoop ./hadoop # 修改文件权限
【./为当前的路径下的文件,而/为根目录,比如我在/usr/local/hadoop路径下执行cd ./bin就是进入/usr/local/hadoop/bin/hadoop目录。Ps:cd ..是回上一层目录】vim core-site.xml
添加如下内容(myhadoop这一项是自己随便取的,叫什么都可以):
fs.defaultFS
hdfs://myhadoop
ha.zookeeper.quorum
Master:2181,Slave1:2181,Slave2:2181
hadoop.tmp.dir
/opt/hadoop2
然后修改另一个:
vim hdfs-site.xml
添加如下内容:
dfs.nameservices
myhadoop
dfs.ha.namenodes. myhadoop
nn1,nn2
dfs.namenode.rpc-address.myhadoop.nn1
Master:8020
dfs.namenode.rpc-address.myhadoop.nn2
Slave1:8020
dfs.namenode.http-address. myhadoop.nn1
Master:50070
dfs.namenode.http-address. myhadoop.nn2
Slave1:50070
dfs.namenode.shared.edits.dir
qjournal://Slave1:8485;Slave2:8485;Slave3:8485/ myhadoop
dfs.client.failover.proxy.provider. myhadoop
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
dfs.ha.fencing.methods
sshfence
dfs.ha.fencing.ssh.private-key-files
/home/hadoop/.ssh/id_rsa
dfs.journalnode.edits.dir
/opt/jn/data
dfs.ha.automatic-failover.enabled
true
最后修改这个:
vim slaves
添加如下内容(标示DataNode节点):
Slave1
Slave2
Slave3
cd /usr/local
sudo rm -r ./hadoop/tmp # 删除 Hadoop 临时文件
sudo rm -r ./hadoop/logs/* # 删除日志文件
tar -zcf ~/hadoop.master.tar.gz ./hadoop # 先压缩再复制
cd ~
scp ./hadoop.master.tar.gz Slave1:/home/hadoop
scp ./hadoop.master.tar.gz Slave2:/home/hadoop
scp ./hadoop.master.tar.gz Slave3:/home/hadoop
然后在所有Slave节点执行:
sudo rm -r /usr/local/hadoop # 删掉旧的(如果存在)
sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local
sudo chown -R hadoop /usr/local/hadoop
下载zookeeper包(我用的3.4.6版本)解压到/user/local并改成简单的名子zookeeper(这个过程的操作和装Hadoop包那一步是一样的),复制这个目录下的conf目录里的zoo_sample.cfg文件,重命名为zoo.cfg保存在同目录,命令如下:
cp -a zoo_sample.cfg zoo.cfg
然后修改zoo.cfg,命令如下:
vim zoo.cfg
修改dataDir后的路径为/opt/zookeeper(这是在opt目录创建一个zookeeper的文件),接着在最后添加如下三行(就是在这三个节点上配置zookeeper):
server.1=Master:2888:3888
server.2=Slave1:2888:3888
server.3=Slave2:2888:3888
然后在opt目录下创建zookeeper文件,在文件内新建一个myid文件并修改:
mkdir /opt/zookeeper
cd /opt/zookeeper/
vim myid
添加一个数字1就行,然后把zookeeper目录传到别的zk节点(即slave1和2)的相同目录(和传ssh公钥的操作相同),并修改myid.(Slave1修改为2,Slave2修改为3)
然后给zk添加Path变量(这一步各个zk节点都要做,也就是要做3次):
vim /etc/profile
添加这么一行:
export PATH=$PATH:/usr/local/zookeeper/bin
然后使之生效:
source /etc/profile
然后就能在任意目录下启动zk了(这也就是给zk添加PATH变量的原因):
zkServer.sh start
输入jps命令查看一下,有QuorumPeerMain就说明zookeeper启动成功了。
【如果防火墙没关,可能会报错,关防火墙指令:service iptables stop】
可在所有Slave节点上启动journalnode:
hadoop-daemon.sh start journalnode
因为hadoop很多命令都是在安装目录下执行的,所以我们可以将 Hadoop 安装目录加入 PATH 变量中,这样就可以在任意目录中直接使用hdfs等命令了,如果还没有配置的,需要在 Master 节点上进行配置。首先执行 vim ~/.bashrc,加入一行:
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
保存后执行 source ~/.bashrc 使配置生效。
首次启动hadoop需要先在 Master 节点执行 NameNode 的格式化:
hdfs namenode -format # 首次运行需要执行初始化,之后不需要
因为Slave1是备用的NameNode节点,它要复制主节点的元数据(存储在Master的/opt/hadoop2/dfs/name/current中),在复制之前,要先开启Master节点的NameNode:
hadoop-daemon.sh start namenode
然后再Slave1节点执行:
hdfs namenode -bootstrapStandby
然后Slave1可以启动NameNode了。
启动前要先格式化:
hdfs zkfc -formatZK
没有error就行,然后可以把所有的都启动起来了:
start-dfs.sh
各个节点执行jps,Master节点应该有jps、NameNode、QuorumPeerMain、DFSZKFailoverConteroller四个服务,Slave1节点应该有前边4个外加DataNode和journalnode共6个,Slave2节点应该有jps、QuorumPeerMain、DataNode和journalnode四个服务,Slave3节点应该有jps、DataNode和journalnode三个服务。
【如果出现所有的datanode节点没有启动,别的正常启动的情况,把你的每个Slave节点的/opt/hadoop2/dfs/目录下的data文件删除,然后再开启试试。】
hdfs dfs -mkdir -p /usr/file #新建hdfs一个目录
hdfs dfs -put /home/hadoop/test /usr/file #put上传
可在浏览器中查看,地址为http://Master:50070或者http://Slave1:50070
mapreduce.framework.name
yarn
再找到yarn-site.xml文件(和core-site.xml文件在一个目录),添加如下内容:
yarn.resourcemanager.hostname
master
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.nodemanager.aux-services.mapreduce.shuffle.class
org.apache.hadoop.mapred.ShuffleHandler