最近用最新的hadoop2.6.0 版本搭了一个环境
步骤如下:
首先介绍一下软硬件:台式机win8.1,用VMware11.1建了三个Linux centos 6.5 64位的虚拟机。三个虚拟机的用户名和主机名
用户名 主机名
ckj1 hadoop-master
ckj2,ckj1 hadoop-slave1
ckj3,ckj1 hadoop-slave2
但是,建议大家建虚拟机时就把用户名选成一样的。 我现在还不知道不同用户名之间怎么在不同节点中用hadoop通信。
一开始,我是拒绝用同一用户名的,觉得太low。但是现实duang的一下把我脆弱的自尊给击碎。所以我在hadoop-slave1和 hadoop-slave2上又创建了一个用户ckj1。具体原因后面再说。
正式开始:
第一部分:编译hadoop2.6.0的native库
一、准备
1.1下载依赖包、jdk、hadoop 2.6.0-src.tar.gz、hadoop2.6.0.tar.gz
前提是虚拟机能连外网,只要在VMware编辑菜单里,选择虚拟机编辑,在里面选上桥接,而不是NAT。ping一下外网检测是不是连上外网了。
本人下的是jdk1.7版本,为啥不是jdk1.8,因为我亲测jdk1.8出错,网上说是因为jdk1.8脚本注释尾部有<\ul>,hadoop识别错误会报错。虽然还可以改,但是比较麻烦。
具体怎么解压我就不说了,tar -zxvf .......
下载依赖包:
yum install gcc
yum intall gcc-c++
yum install make
yum install cmake
yum install openssl-devel
yum install ncurses-devel
yum install autoconf automake libtool lzo-devel zlib-devel
为啥要装这些依赖包,因为没他们编译无法正常进行。
我把这些软件都安装在了/opt/modules/;安装包都放在了/opt/softwares/下
其实这些信息可以在hadoop 2.6.0-src.tar.gz、BUILDING.txt下有介绍。
1.2 安装maven
我安装的是apache-maven-3.3.1-bin.tar.gz,而不是传说中的apache-maven-3.0.5-bin.tar.gz。因为老版本可能是跟jdk1.8(最初装的是这个版的jdk)不兼容,总是不能正确安装。换了一个新版本,问题就解决了。然后是添加全局变量:MAVEN_HOME和PATH。然后是. /etc/profile,使修改生效。
然后修改vi /opt/modules/apache-maven-3.0.5/conf/settings.xml
在
这里必须注意的是:在
1.3、安装protobuf-2.5.0
先解压缩,然后执行./configure 再执行make 最后是make install;
装它依赖一些包,比如:gcc gcc-c++ make等
这个不用设置环境变量
1.4、安装ant(可以不装)
记得设环境变量(跳过不叙);
1.5安装findbugs-3.0.0.tar.gz
记得设环境变量;
二、编译
进入源码文件夹:/opt/softwares/hadoop 2.6.0-src.tar.peiz(我解压缩到这了)
mvn clean
mvn package -Pdist,native,docs -DskipTests -Dtar
然后是漫长的等待。。。。。。
编译当然会出问题,我已在之前的博客中说了,在此不废话了。
第二部分:安装
1.1解压缩
1.2配置主机名,配置hosts文件,将ip地址和主机名绑定,这里包括三个主机名对应的ip地址;并且要把这份hosts远程拷贝到其他两台虚拟机上相应的目录下。用scp命令。主机名在/etc/sysconfig/network下改HOSTNAME=hadoop-master
1.3配置ssh 无密码登陆
这里要着重讲啦!
ssh是一个加密的通信协议。在用户主目录下的隐藏文件中~/.ssh 创建公钥和私钥。生成密钥的算法有两个,rsa和dsa
步骤:
1.ssh-keygen -t rsa
2.一路回车(三次好像)
3.将公钥拷贝到当前目录下的authorized_keys文件里。cat .ssh/id_rsa.pub >>.ssh/authorized_keys
4.以上操作在其他两台虚拟机的用户下都操作一遍。
5.若是A远程访问B,则将A的公钥添加到B的authorized_keys里。authorized_keys里存放的都是可以免密码登陆的机器的公钥。具体协议可以问度娘。这里需要使用scp命令。
6.重点:本人此前理解错误。之前,我认为A的用户ckj1远程登陆B机,可以用ckj1 的用户去访问。其实是不行的。这就像QQ里的远程控制一样,是别人在他的电脑上,以你的用户账号对你的电脑进行操作。具体的说:A台机子用户ckj1,B机子用户ckj2,则在A机上命令ssh ckj1@B-ip 则登陆失败;而ssh ckj2@B-ip则成功。ssh B-ip的操作其实就是ssh ckj1@B-ip。但是hadoop上运行命令star-dfs.sh,是默认的以ckj1的用户名去访问B机,结果是访问失败,于是HDFS启动失败。所以我只好在B机和C机上重新建了一个用户ckj1。然后在ckj1下重新生成密钥,重复上面过程。
7重点:这里面.ssh和改目录下的文件权限是非常重要的,千万不能弄错。
chmod 700 .ssh
我犯的错是:./ssh/的权限为760,系统认为这个存在安全漏洞,然后拒绝了正常用户的登陆请求
1.4修改hadoop文件目录下文件的用户
chown -R ckj1 hadoop-2.6.0
所以我觉得,当时把hadoop安装在用户目录下就好了
1.5修改配置文件
hadoop配置过程:要实现分布式环境,配置过程是最为重要的,
这里要涉及到的配置文件有7个:
~/hadoop/etc/hadoop/hadoop-env.sh
~/hadoop/etc/hadoop/yarn-env.sh
~/hadoop/etc/hadoop/slaves
~/hadoop/etc/hadoop/core-site.xml
~/hadoop/etc/hadoop/hdfs-site.xml
~/hadoop/etc/hadoop/mapred-site.xml
~/hadoop/etc/hadoop/yarn-site.xml
之后会分别介绍各个配置的的作用和配置关键
配置文件1:hadoop-env.sh
该文件是hadoop运行基本环境的配置,需要修改的为java虚拟机的位置。
故在该文件中修改JAVA_HOME值为本机安装位置(如,export JAVA_HOME=/usr/lib/jvm/java-1.7.0)
配置文件2:yarn-env.sh
该文件是yarn框架运行环境的配置,同样需要修改java虚拟机的位置。
在该文件中修改JAVA_HOME值为本机安装位置(如,export JAVA_HOME=/usr/lib/jvm/java-1.7.0)
该文件里面保存所有slave节点的信息,以本篇为例
写入以下内容(hosts里从机的主机名):
Slave1
Slave2
配置文件4:core-site.xml
这个是hadoop的核心配置文件,这里需要配置的就这两个属性,fs.default.name配置了hadoop的HDFS系统的命名,位置为主机的9000端口;hadoop.tmp.dir配置了hadoop的tmp目录的根位置。这里使用了一个文件系统中没有的位置,所以要先用mkdir命令新建一下。
配置文件5:hdfs-site.xml
这个是hdfs的配置文件,dfs.http.address配置了hdfs的http的访问位置;dfs.replication配置了文件块的副本数,一般不大于从机的个数。
配置文件6:mapred-site.xml
这个是mapreduce任务的配置,由于hadoop2.x使用了yarn框架,所以要实现分布式部署,必须在mapreduce.framework.name属性下配置为yarn。mapred.map.tasks和mapred.reduce.tasks分别为map和reduce的任务数,至于什么是map和reduce,可参考其它资料进行了解。
其它属性为一些进程的端口配置,均配在主机下。
配置文件7:yarn-site.xml
该文件为yarn框架的配置,主要是一些任务的启动位置
将配置好的hadoop复制到其他节点
scp –r ~/hadoop hadoop@Slave1:~/
scp –r ~/hadoop hadoop@Slave2:~/
以上都是盗图,啦啦啦,很正常嘛,大家互相盗。不过我还是要很感谢这位原创大神的图。祝你事业顺利!
当然这些配置文件要根据自己的主机名做下修改
三、启动
格式化namenode:
./bin/hdfs namenode –format
若出现如图所示提示,则格式化成功
启动hdfs: ./sbin/start-dfs.sh
此时在Master上面运行的进程有:namenode secondarynamenode
Slave1和Slave2上面运行的进程有:datanode
启动yarn: ./sbin/start-yarn.sh
此时在Master上面运行的进程有:namenode secondarynamenode resourcemanager
Slave1和Slave2上面运行的进程有:datanode nodemanaget