安装步骤如下:
1.1 机器说明
VMware总共虚拟3台机器:h1、h2、h3
IP地址分别为:192.168.1.109、192.168.1.100、192.168.1.110
操作系统为:Linux的Ubuntu10.04
jdk版本为:jdk-6u41-linux-i586
hadoop版本为:hadoop-0.20.2
h1作为NameNode、JobTracker,其他2台作为DataNode、TaskTracker
1.2 用机器名Ping通机器
用root登录,修改NameNode和DataNode上的/etc/hosts文件,加入三台机器的IP地址和机器名,如下:
192.168.1.109 h1
192.168.1.100 h2
192.168.1.110 h3
设置好后验证下各机器间是否ping通,用机器名或是IP地址都可以,例如ping h2或ping 192.168.1.100
1.3 新建hadoop用户
Hadoop要求所有机器上hadoop的部署目录结构要相同并且有一个相同的用户名的帐户,我的默认路径为 /home/hadoop
注意:新建用户时使用 root@lenovo: adduser,
否则只添加用户信息不全
1.4 ssh设置及关闭防火墙
ssh设置的目的:实现无密码登录
安装ssh服务:sudo apt-get install openssh-server自动安装ssh服务。
1)ubuntu装好后默认启动sshd服务,如果不确定的话可以查一下 [root@h1 hadoop]# service sshd status
如没有启动的话,
启动 [root@h1 hadoop]# service sshd start
启动:sudo /etc/init.d/sshstart
停止:sudo /etc/init.d/sshstop
建立ssh无密码登录,在NameNode上 [hadoop@h1 ~]$ ssh-keygen -t rsa
会在~/.ssh/生成两个文件:id_rsa和id_rsa.pub,这两是成对出现的,把id_rsa.pub文件追加到DataNode上的authorized_keys
[hadoop@h1 ~]$ scp id_rsa.pub h2:/home/hadoop/ (注意其中目标机器后面的:与要传到的文件路径之间没有空格,即h1:与/home/hadoop/之间没有空格)
scp id_rsa.pub h3:/home/hadoop/
登录到DataNode上,
[hadoop@h2 ~]$ cat id_rsa.pub >> ~/.ssh/authorized_keys
,其余一台一样,NameNode上也要追加。
修改 /etc/ssh/sshd_config ssh的配置文件
其中#行指注释掉得
主要的几个:
Protocol 2 ←去掉# 修改后变为此状态,仅使用SSH2
ServerKeyBits 1024 ← 修改后变为此状态,将ServerKey强度改为1024比特
PermitRootLogin no ← 修改后变为此状态,不允许用root进行登录,只能切换回非root用户才能登陆
PasswordAuthentication no ← 修改后变为此状态,不允许密码方式的登录,开始设置成yes也可以,就可以在服务器用ssh密码登陆到本机,将公钥认证文件复制过去然后添加到公钥本文件再传回来,再设置成 no
PubkeyAuthentication yes ← 大家一定注意这个,非常关键,必须设置成yes,允许从公钥认证文件登录,搞了一下午加一晚上才整明白,这个文件里设置的东西太多,出现了 permission denied就改这个文件,无头苍蝇般,一会好用一会不好用,绝大多数不好用
关于密钥生成后权限配置
好像默认的id_rsa就是400,其他的就不知道了,大家可以玩玩看,反正最后的正确设置参考如下:
(1)id_rsa 400,即user只读,g o无权限(2)id_rsa.pub rm 删除
(3)authorized_keys :u必须有r权限,g o必须没有w权限,其他的都随便,为安全考虑,最终将其设置成400,开始需要设置成600,如上所说,需要服务器传过来公钥本覆盖此文件,覆盖之后再设置成 400
最后别忘了,将公钥本覆盖了以后设置两个东西,
一个是 /etc/ssh/sshd_config的PasswordAuthentication no 然后重启ssh服务(前面说过);
chmod 400 ~/.ssh/authorized_keys
随便输入 ssh localhost,哈哈
OK了,成功也安全了
注意:追加完后必须修改NameNode和DataNode上的.ssh和authorized_keys的权限,chmod命令,参数不确定,完成后测试下,例如ssh h2时不需要密码就可以登录,就可以知道ssh设置成功。
2)关闭防火墙(NameNode和DataNode都必须关闭,没用到)
[root@h1 ~]# service iptables stop
注意:每次重新开机启动hadoop前都必须关闭
1.5 安装jdk1.6(几台机子都一样)
在官网http://www.oracle.com/technetwork/java/javase/downloads/jdk6downloads-1902814.html下载jdk-6u41-linux-i586.bin,之后直接安装
[root@h1 java]#chmod +x jdk-6u41-linux-i586.bin
[root@h1 java]# ./jdk-6u41-linux-i586.bin
我的安装路径为:/usr/lib/java/jdk1.6.0_41,安装后添加如下语句到/etc/profile中:
export JAVA_HOME=/usr/java/jdk1.6.0_41
export JRE_HOME=/usr/java/jdk1.6.0_41/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
1.6 安装hadoop
在官网http://apache.etoak.com//hadoop/core/下载hadoop-0.20.2.tar.gz
[hadoop@h1 ~]$ tar xzvf hadoop-0.20.2.tar.gz
将hadoop的安装路径添加到/etc/profile中:
export HADOOP_HOME=/home/hadoop/hadoop-0.20.2
export PATH=$HADOOP_HOME/bin:$PATH
为了让/etc/profile生效,source一下 [hadoop@h1 ~]$ source /etc/profile
1.7 配置hadoop
其配置文件在/conf目录下
1)配置JAVA环境
[hadoop@h1 ~]$ vim hadoop-0.20.2/conf/hadoop-env.sh
末行加入
export JAVA_HOME=/usr/java/jdk1.6.0_41
2)配置conf/core-site.xml、conf/hdfs-site.xml、conf/mapred-site.xml文件
[hadoop@h1 ~]$ vim hadoop-0.20.2/conf/core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://h1:9000</value>
</property>
</configuration>
[hadoop@h1 ~]$ vim hadoop-0.20.2/conf/mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>hdfs://h1:9001</value> <!--注意:h1前能不能加hdfs://不太清楚,本人配了两个集群,一个加了一个不加都能用-->
</property>
</configuration>
[hadoop@h1 ~]$ vim hadoop-0.20.2/conf/hdfs-site.xml
<configuration>
<property>
<name>dfs.name.dir</name>
<value>/home/hadoop/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value><!--注意:如果设为1,数据只有一个副本,假如其中一个datanode出问题,将会导致整个job失败-->
</property>
</configuration>
3)
配置NameNode上的conf/masters和conf/slaves
masters:
192.168.1.109
slaves:
192.168.1.100
192.168.1.110
4)将NameNode上完整的hadoop拷贝到DataNode上,可先将其进行压缩后直接scp过去或是用盘拷贝过去
(1)将本地文件拷贝到远程:scp 文件名 用户名@计算机IP或者计算机名称:远程路径
(2)从远程将文件拷回本地:scp 用户名@计算机IP或者计算机名称:文件名本地路径
(3)将本地目录拷贝到远程:scp -r目录名 用户名@计算机IP或者计算机名称:远程路径
(4)从远程将目录拷回本地:scp-r 用户名@计算机IP或者计算机名称:目录名本地路径
1.8 运行hadoop
1)格式化文件系统
[hadoop@h1 hadoop-0.20.2]$ hadoop namenode -format
注意:格式化时要防止NameNode的namespace ID与DataNode的namespace ID的不一致,因为每格式化一次会产生Name、Data、tmp等临时文件记录信息,多次格式化会产生很多,会导致ID的不同,造成hadoop不能运行
2)启动hadoop
[hadoop@h1 hadoop-0.20.2]$ bin/start-all.sh
3)用jps命令查看进程,NameNode上的结果如下:
25325 NameNode
25550 JobTracker
28210 Jps
25478 SecondaryNameNode
4)查看集群状态
[hadoop@h1 hadoop-0.20.2]$ hadoop dfsadmin -report
确保运行的DataNode个数是正确的,我的是2个,这样可以查看哪个DataNode没有运行
5)用hadoop的web方式查看
[hadoop@h1 hadoop-0.20.2]$ links http://192.168.1.109(即为master):500701.9 运行Wordcount.java程序
1)先在本地磁盘上建立两个文件f1和f2
[hadoop@h1 ~]$ echo ”hello Hadoop goodbye hadoop” > f1
[hadoop@h1 ~]$ echo ”hello bye hadoop hadoop” > f2
2)在hdfs上建立一个input目录
[hadoop@h1 ~]$ hadoop dfs -mkdir input
3)将f1和f2拷贝到hdfs的input目录下
[hadoop@h1 ~]$ hadoop dfs -copyFromLocal /home/hadoop/f* input
4)查看hdfs上有没有input目录
[hadoop@h1 ~]$ hadoop dfs -ls

5)查看input目录下有没有复制成功f1和f2
[hadoop@h1 ~]$ hadoop dfs -ls input
6)执行wordcount(确保hdfs上没有output目录)
[hadoop@h1 hadoop-0.20.2]$ hadoop jar hadoop-0.20.2-examples.jar wordcount input output
7)运行完成,查看结果
[hadoop@h1 hadoop-0.20.2]$ hadoop dfs -cat output/part-r-00000