平台:centOS6.4 ,hadoop版本:1.2.1
网上有大量ubuntu的安装教程,在centos上大致相同,只是在jdk安装和ssh无密码登录方面有些许差别,本文记录了安装的大致过程。
1. jdk安装
检验系统原版本
# java -version
# rpm -qa | grep java
centOS默认会安装OpenJdk,首先我们要卸载OpenJDK,执行以下操作(不同版本的openjdk信息会有所不同,请根据自己的信息修改):
# rpm -e --nodeps tzdata-java-2012c-1.el6.noarch
# rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.45.1.11.1.el6.x86_64
从官网上下载jdk,安装:
# rpm -ivh jdk-7-linux-x64.rpm //JDK默认安装在/usr/java中。
# java -version
更新环境变量
#vi + /etc/profile
向文件里面追加以下内容:
JAVA_HOME=/usr/java/jdk1.7.0
JRE_HOME=/usr/java/jdk1.7.0/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
使修改生效
# source /etc/profile //使修改立即生效
# echo $PATH //查看PATH值
2.创建hadoop用户
不建议使用root用户直接运行hadoop,因为hadoop间需要互相访问,创建普通用户运行;将hadoop.tar.gz放到该用户下,tar-zxvf 解压缩即可 。
3. 修改hosts文件
为方便访问,修改/etc/hosts文件
4. 无密码登录
hadoop也不是必须要求无密码登录,但是每次登录slaves都会要去输入密码,所以还是设上好点。
网上有大量ubuntu的设置方法,但是centOS中要稍微复杂一些。
无密码登录(host A的用户userA 无密码登录 host B,使用B的用户 userB):
userA在自己的.ssh目录下生成一对密钥;
将公钥放到userB的./ssh目录下;
首先查看/etc/ssh/sshd_config 文件,将下面三行的注释去掉,重启sshd服务:
#RSAAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile .ssh/authorized_keys
登录时userA使用私钥去匹配userB下的公钥 ,配置如下:
[userA@A ~]$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa //生成密钥,-t:加密算法;-P 密码,此处为空; -f:路径;
[userA@A ~]$ cat id_dsa.pub ~/.ssh/authorized_keys //将公钥放到授权访问key队列中,这样ssh localhost也可以接受本地该用户的无密码登录,可用于测试;
[userA@A ~]$ scp ~/.ssh/authorized_keys userB@B:~/.ssh/ //将authorized_keys传到B的userB目录下
[userB@B ~]$ chmod 700 ~/.ssh //将.ssh目录权限改为700,默认是775;否则认证会失败,sshd要求安全性高,只允许用户本身有该目录的访问权限
[userB@B ~]$ chmod 600 ~/.ssh/authorized_keys //修改 authorized_keys 权限;否则同样会认证失败;同样是安全性问题。
[userA@A ~]$ ssh userB@B //测试,如还是需要密码说明配置有问题,ssh
-v 打开debug;tail /var/log/secure -n 20
查看日志,具体处理
在hadoop安装中,nameNode要访问其他的机器,所以用namenode生成密钥放到其他的slaves上。
/**
采用了vmware虚拟机克隆的方式,需要注意两个问题:
(1) 记得修改hostname: /etc/sysconfig/network
(2) 当时修改了一下网卡的设置,造成network重启时,报网卡貌似不存在Device does not seem to be present;
这是因为克隆之后eth*中的mac信息和系统文件不符:/etc/udev/rules.d/70-persistent-net.rules;将该文件删除,重启即可;可以再查看该文件然后配置相应的eth*;
**/
5.安装hadoop
hadoop的安装现在已经非常简单,只需要将hadoop.*.*.tar.gz 解压缩即可(tar -zxvf hadoop-1.2.1.tar.gz),然后修改一下配置文件,基本的环境就可以搭建好了。
hadoop分为3种运行模式:单机,伪分布,全分布。3种模式的配置方式不一样,我们看一下主要的参数配置区别:
I 单机模式
hadoop默认单机模式,适合调试开发,只需要将hadoop-env.sh的JAVA_HOME配置好就可以了:
conf/hadoop-env.sh:
export JAVA_HOME= //指向本地jdk目录
II 伪分布式
是在一台机器上模拟一个cluster,配置文件如下:
conf/core-site.xml:
<configuration>
<property>
< name>fs.default.name</name>
< value>hdfs://localhost:9000</value>
</property>
</configuration>
conf/hdfs-site.xml:
<configuration>
<property>
< name>dfs.replication</name>
< value>1</value>
</property>
</configuration>
conf/mapred-site.xml:
<configuration>
<property>
< name>mapred.job.tracker</name>
< value>localhost:9001</value>
</property>
</configuration>
III 分布式
修改hadoop配置文件(所有机器都一样)
(1) conf/hadoop-env.sh
export JAVA_HOME= //指向本地jdk目录
(2)conf/core-site.xml (NameNode 配置)
在<configuration>标签下插入:
<property>
<name>fs.default.name</name>
<value>hdfs://hadoopNN:49000</value>
</property>
<property>
< name>hadoop.tmp.dir</name>
< value>/home/jeff/data/hadoop/var</value>
</property>
fs.default.name :
NameNode的URI。hdfs://主机名:端口/
hadoop.tmp.dir:Hadoop的默认临时路径,此文件夹需手工创建;
这个最好配置,如果在新增节点或者其他情况下莫名其妙的DataNode启动不了,就删除此文件中的tmp目录即可。
不过如果删除了NameNode机器的此目录,那么就需要重新执行NameNode格式化的命令。
(3) conf/mapred-site.xml (job-tracker 配置
)
<property>
<name>mapred.job.tracker</name>
<value>hadoopNN:49001</value>
</property>
<property>
< name>mapred.local.dir</name>
< value>/home/jeff/data/hadoop/var</value>
</property>
mapred.job.tracker :job-tracker的主机和端口
(4)conf/hdfs-site.xml (hdfs层的配置)
<property>
<name>dfs.name.dir</name>
<value>/home/jeff/data/hadoop/name1, /home/jeff/data/hadoop/name2</value>
</property>
<property>
< name>dfs.data.dir</name>
< value>/home/jeff/data/hadoop/data1, /home/jeff/data/hadoop/data2</value>
</property>
<property>
<name>dfs.replication</name>
< value>2</value>
</property>
dfs.name.dir: NameNode 存储名字空间及事务日志路径;逗号代表复制到所有目录做冗余备份
dfs.data.dir: DataNode的数据存储空间,数据将存储在所有目录中
前两个参数中的目录name1,name2,data1,data2系统会自动创建,预先建立可能会报错。
dfs.replication: 数据复制的数量,默认为3
(5) 修改 conf/masters, conf/slaves,一行对应一个机器
conf/masters:
hadoopNN
conf/slaves:
hadoop2
hadoop3
hadoop4
....
6 准备,测试环境
配置好hadoop后,首先需要格式化hdfs文件系统,进到hadoop/bin目录下(方便以后操作,将bin放到$PATH更方便):
hadoop namenode -format
正确格式化后,hadoop就可以运行了:
start-all.sh //同时启动hdfs和mapreduce
测试:
在hadoop目录下,我们用自带的example.jar中的wordcount测试hadoop的运行:
hadoop jar hadoop-examples-1.2.1.jar worldcount README.txt output //注意,这里不是 -jar,没有前面的- ,否则会报错,说一个类找不到
统计README.txt文件中的词频,输出在当前目录下的output/part-r-0000