hadoop简直神烦,在centos64位中0.2.0和1.2都在安装的最后一步出了问题。node和name都启动了,log没有错误,就是report里各项均为零。折腾了好几天换到2.2.0需要编译才能使用同样是因为各种dependencies版本不兼容编译不通过。最终确定下来的配置是
- centos6.5的32位系统3台,其中两台安装在同一台物理机的虚拟机上 &另一台物理机则安装第三个centos虚拟机
- 两台机子分别是:
- master 192.168.199.111
- slave1 192.168.199.212
- slave1 192.168.199.184
- 机子间的网络靠路由器连接的内部IP,由于内部分配的IP不是静态的,需要改成静态的(需要保证ip不会冲突)
一 在VMware下安装centos6.5 32bit
这个自己解决,在http://wiki.centos.org/Download 中选择镜像下载centos6.5,centos7由于刚发布,有些兼容不好。在安装的时候,自定义硬件-网络适配器 选择桥接模式,复制物理网络状态不要勾选。
安装默认是的是NAT模式,与主机共用同一个IP地址,这样虚拟机下无法分离出更多的IP。安装后启动centos6.5,键入
su root
输入密码,进入root最高权限用户。在键入
vi /etc/hosts
可将原来的清空,在hosts文件中添加本机的主机名和IP以便不同节点之间识别,我的如下
192.168.199.111 master 192.168.199.212 slave1 192.168.199.184 slave2
更改主机名
vi /etc/sysconfig/network
我的主机更改如下
NETWORKING=yes HOSTNAME=master
更改内部自动分配的IP地址
vi /etc/sysconfig/network-scripts/ifcfg-eth0
如下图,其中IPADDR 192.168.199需要与物理机的前缀相同,111自己设一个没有冲突的ip地址,netmask和gateway和物理机完全一致。这些可以在物理机的命令行窗口执行命令
ipconfig
进行查看。再键入
service iptables status
查看虚拟机防火墙状态。若显示firewall is off则表示防火墙已关闭,若显示有内容,则输入
chkconfig iptables off
关闭防火墙自启动,再输入
service iptables stop
关闭防火墙。同时关闭物理机的防火墙和安全软件,这时候可以用ping 测试一下几台配好的机子是否相通。
二 配置ssh无密码访问
ssh是为了在不同节点之间传输文件和消息不用频繁的输入密码。在centos6.5中默认集成了ssh,因此不用安装ssh服务。首先在主节点master上键入
ssh-keygen -t rsa
生成主节点信息的rsa密钥。进入/root/.ssh隐藏目录可发现生成了一个id_rsa和id_rsa.pub,将主节点信息注入授权key
cd /root/.ssh ls cp id_rsa.pub authorized_keys cat id_rsa.pub>>authorized_keys
对authorized_keys进行附权操作(可省略,针对新建立的非root权限用户,例如很多例子里的hadoop用户)
chmod 600 authorized_keys
配置sshd_config文件,并将下列项的注释去掉(其余物理机也要进行这样的操作)
vim /etc/ssh/sshd_config RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
将包含master密钥的授权key发送给slave1节点。
scp root@slave1 :/root/.ssh/authorized_keys.pub /root/.ssh/
这里会需要输入slave1的root密码,进行确认。在slave1登陆,同样的步骤生成id_rsa和id_rsa.pub。
ssh-keygen -t rsa cd /root/.ssh ls mv id_rsa.pub slave1.pub cat slave1.pub>>authorized_keys
将包含master和slave1密钥信息的文件传给slave2(此后每加一个节点都需要这么做,把新生成的密钥加入到先前所有人信息的authorizd_keys中)
scp root@slave2 :/root/.ssh/authorized_keys.pub /root/.ssh/
重复上面的操作,最后将slave2生成的authorized_keys.pub传回给master和slave1.
scp root@master :/root/.ssh/authorized_keys.pub /root/.ssh/ scp root@slave1 :/root/.ssh/authorized_keys.pub /root/.ssh/
最后重启ssh服务
service sshd restart
这时候可以在master上直接键入
ssh slave1
登陆slave1主机,第一次登陆的时候需要输入root密码,之后就不需要了。这样就可以直接对slave1的文件进行读写操作,记得退出的时候要输入exit
三 JDK和Hadoop路径的安装
这两个文件的安装都是下载和路径配置,跟目录分别为
/usr/java /usr/hadoop
这两个路径简单的目的就是为了以后码得少一点
Java
Java最新版本的路径可在http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
下载java8或java7,这里选择的是jdk7,即jdk-7u15-linux-i586.tar.gz。可在物理机下载后直接复制到虚拟机桌面,解压、复制、改文件名
tar -zxf jdk-7u15-linux-i586.tar.gz ls cp -rf jdk1.7.0_15 /usr mv jdk1.7.0_15 java
配置一下全局的环境
vi /etc/profile
在文件末添加如下代码,配置JAVA安装目录,JRE目录,CLASSPASTH和PATH
JAVA_HOME=/usr/java/ JRE_HOME=/usr/java/jre PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib export JAVA_HOME JRE_HOME PATH CLASSPATH
里面的冒号与windows下系统环境的分号相通。更新一下配置的java环境,查看java版本,出现如下则配置成功。
source /etc/profile java -version
hadoop
hadoop2.2.0在64位下需要源码编译,比较繁琐且容易出错,在32位下则可直接使用。因此选择在http://www.apache.org/dyn/closer.cgi/hadoop/common/官方网站下下载2.2.0版本的tar.gz包,即hadoop-2.2.0.tar.gz,放在虚拟机桌面,解压并复制到usr目录下,改名
tar -zxf hadoop-2.2.0.tar.gz cp -rf hadoop-2.2.0 /usr/ mv hadoop-2.2.0 hadoop
在/etc/profile中添加hadoop的信息
vi /etc/profile export HADOOP_HOME=/usr/hadoop/ export PAHT=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export HADOOP_LOG_DIR=/usr/hadoop/logs export YARN_LOG_DIR=$HADOOP_LOG_DIR
以上便完成了前期安装工作。
四 Hadoop全分布的配置
在hadoop中加入java的路径,修改的是hadoop目录下etc/hadoop的hadoop-env.sh
vi /usr/hadoop/etc/hadoop/hadoop-env.sh
将java路径添加在#export java home那里。
修改core-site.xml,添加在configuration里,下同。
vi /etc/hadoop/etc/hadoop/core-site.xml
<property> <name>fs.default.name</name> <value>hdfs://master:9000/</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/hadoop/tmp</value> </property>
其中,master是主节点的host名fs.default.name与之前的版本名字有所不同。
修改hdfs-site.xml,定义数据节点和名称节点的路径,dfs.replication是datanode的数量,默认为3,小于3的必须写上确切的数目否则会出错。
<property> <name>dfs.datanode.data.dir</name> <value>/usr/hadoop/hdf/data</value> <final>true</final> </property> <property> <name>dfs.namenode.name.dir</name> <value>/usr/hadoop/hdf/name</value> <final>true</final> </property> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property>
修改mapred-site.xml 定义Mapreduce应用的jobtracker。由于系统并未自带,但提供了模板,因此复制一下
mv mapred-site.xml.template mapred-site.xml
<property> <name>mapred.job.tracker</name> <value>master:9001</value> </property>
修改yarn-site.xml,配置resourcemanager和nodemanager,这个是2.0以上版本才有的通过yarn管理资源和节点的功能,
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master:8025</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master:8030</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>master:8040</value> </property>
创建并未存在的目录,在hadoop目录下的tmp hdf/data hdf/name logs等
配置完后直接启动,则进行的是单节点操作。若要进行多节点,编辑同目录下的slaves文件,默认自带的是localhost,将其删除,将slave1和slave2一行一个写在文件中。
配置完以上信息就拍一个快照吧!之后就可以进行格式化和启动了,但是在运行自带程序中发现它并没有将任务分配到不同的节点,而是只在master本机的localjobrunner中做,
因此若需要在不同的节点分配资源,需要再进行一下配置。
修改yarn-env.sh,同样将java的目录配置在export java_home中。
再次修改mapred-site.xml,保留之前的配置,在后面加入如下属性
<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>master:19888</value> </property>
实际上就是利用yarn来管理和配置资源,如果配置了yarn,则之前的jobtracker就不起作用。最后修改yarn-site.xml
<property> <name>yarn.resourcemanager.address</name> <value>master:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master:8030</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>master:8088</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>master:8033</value> </property> <property> <nameyarn.nodemanager.address</name> <value>master:10000</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property>
好了基本的配置完毕了。。。再照一次快照吧!进行格式化(切记不要进行多次格式化!若出现X node are exclued 。。的错误,把tmp 和hdf目录全删了再重建,再进行格式化)
cd /usr/hadoop/bin ./hdfs namenode -format
随后启动namenode和yarn
cd /usr/hadoop/ ./start-hdf.sh ./start-yarn.sh
若是没有报错就基本成功了!键入jps查看服务。如果没有出现nodemanager就需要手动启动
cd /usr/hadoop/sbin/ ./yarn-daemon.sh start nodemanager
查看到的jps如下
Jps NameNode ResourceManager SecondaryNameNode NodeManager
这就表示启动成功了,可以查看节点状况
cd /usr/hadoop/bin ./hdfs dfsadmin -report
也可以通过http://master:50070 查看节点状况。
这样hadoop就配置好全分布了。
五 运行自带测试程序
- wordcount
这是一个检测目标文本中所含词数的自带程序。可在http://www.gutenberg.org/files/20417/20417.txt下载一篇英文文章,或者自己选择其他的文章。命名为aaa.txt 并放在虚拟机/etc/hadoop目录下。键入
cd /usr/hadoop bin/hdfs dfs -mkdir /tmp bin/hdfs dfs -copyFromLocal /usr/hadoop/aaa.txt /tmp bin/hdfs dfs -ls /tmp bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /tmp/ /tmp-output
tmp是建立hdfs的目录空间,在tmp-output中输出结果。运行过程中可以看到进程是由mapreduce.job完成。如图为任务开始时同时可以登陆http://master:8088观看正在运行的application的信息。如图是结束时候的网页信息。
如图是结束时候的命令行信息。
执行完毕后可以查看刚才job的执行结果。
cd /usr/hadoop bin/hdfs dfs -ls /tmp-output hdfs dfs -cat /tmp-output-00000
第二行的目录是输出目录,列出所有的输出信息后,找到名字头相同,后面添加了-0000等数字的就是输出结果。
- randomwriter
一葫芦画瓢,操作基本相同,randomwriter的任务是随机生成数到dfs中,每个map输入单个文件名,再随机写到键值对中,基本上是一个性能测试。
cd /usr/hadoop bin/hdfs dfs -mkdir /rdw bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar randomwriter rdw
时间跨度比较久,机子较旧可能会非常慢。参考各类博客,版权不究。