在Linux下安装与配置Hadoop
在Linux上安装Hadoop之前,需要安装两个程序:
- JDK1.6或者更高的版本;
- SSH(安全外壳协议),推荐安装OpenSSH
下面简述一下安装这两个程序的原因:
Hadoop使用Java开发的,Hadoop的编译及MapReduce的运行都需要使用JDK。
Hadoop需要通过SSH来启动salve列表中各台主机的守护进程,因此SSH也是必须安装的,即使是安装伪分布式版本(因为Hadoop并没有区分集群式和伪分布式)。对于伪分布式,Hadoop会采用与集群相同的处理方式,即依次序启动文件conf/slaves中记载的主机上进程,只不过伪分布式中salves为localhost(自身),所以对于伪分布式Hadoop,SSH一样是必须的。
1 安装JDK1.7
Linux会自带JDK,如果不使用自带版本的话需要卸载。
(一) 卸载系统自带的jdk版本
查看自带的jdk
#rpm -qa | grep gcj
看到如下信息:
libgcj-4.1.2-44.el5
java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
使用rpm -e --nodeps 命令删除上面查找的内容:
#rpm -e --nodeps java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
(二) 卸载rpm安装的jkd版本
查看安装的jdk:
#rpm -qa|grep jdk
看到如下信息:
java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5
卸载:
#rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5
(三) 安装jdk
首先到sun官网下载安装包,下面是最新的安装包http://java.sun.com/javase/downloads/index.jsp
如果希望找以前的版本,到下面的地址可以找到http://java.sun.com/products/archive/
有jdk-6u7-linux-i586-rpm.bin和jdk-6u7-linux-i586.bin两种版本。bin是二进制包,而rpm是RedHat package 就是红帽的标准安装包。区别就是rpm安装的时候给你自动配置,一般都是lib安装到/usr/lib,bin安装到/usr/bin下边,就算不是,在/usr/bin下也要建立一个软连接。
下边以现有最新版本jdk-7u3-linux-i586.rpm为例进行安装:
将安装文件放到:/usr/java目录下,修改权限,命令如下(需先用cd命令切换到相应目录下):
# chmod +x jdk-7u3-linux-i586.rpm
执行文件的安装:
# rpm-ivh jdk-7u3-linux-i586.rpm
(四) 配置环境变量
修改/etc/profile文件,在该文件最后加上
export JAVA_HOME=/usr/java/jdk1.7.0_03
export PATH=$PATH: /usr/java/jdk1.7.0_03/bin
保存
(五) 执行
cd /etc
source profile
(六) 验证JDK是否安装成功
[root@localhost ~]# java -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) Server VM (build 21.0-b17, mixed mode)
2 配置SSH免密码登陆
首先,确保当前可以连接到互联网。在root下修改/etc/ssh/sshd_config文件(客户端、服务器都需要更改),将
#AuthorizedKeysFile .ssh/authorized_keys
前面的#号去掉,即启用
AuthorizedKeysFile .ssh/authorized_keys
如果需要root也能ssh登录,把“#PermitRootLogin yes”前面的#号也去掉。
同样root账户下,重启sshd服务使之生效
/etc/rc.d/init.d/sshd restart
客户端中,切换到需要ssh登录的帐户下:
ssh-keygen -t dsa
产生公私钥对。回车,采用默认文件保存钥匙。
xxxxx 回车 键入密码短语,直接回车为不建立密码短语。密码短语至少5个字符
xxxxx 回车 重复密码短语,直接回车为不建立密码短语
也可以:
ssh-keygen -t dsa -P ' ' -f /home/账户名/.ssh/id_dsa
ssh-keygen代表生成密钥;-t(注意区分大小写)表示指定生成的迷密钥类型;dsa是dsa密钥认证的意思,即密钥类型;-P用于提供密语;-f指定生成的密钥文件。这个
公私钥产生在此账户的.ssh目录中,id_dsa为私钥,id_dsa.pub为公钥
服务器中,切换到需要ssh登录的帐户下:
如果服务器中尚未建立公私钥对,那么首先按照客户端的方法建立公私钥对
scp 账户名@客户端主机名或ip地址:/home/帐户名/.ssh/id_dsa.pub /home/帐户名/
将客户端账户的公钥拷到服务器中。客户端用主机名或ip地址均可,但是需与ssh登录命令相符,建议将主机名与ip地址写入/etc/hosts中,此处用主机名即可(下同)。
yes 将客户端写入known_hosts中
输入客户端中的账户密码完成复制
将id_rsa.pub中的内容添加到authorized_keys文件中,authorized_keys文件名需与sshd_config中的设置相符
cat /home/帐户名/id_rsa.pub >>/home/帐户名/.ssh/authorized_keys
修改authorized_keys文件的权限,至少为644,也可更为严格(600),不修改的话ssh无密码登录不起作用:
chmod 644 /home/帐户名/.ssh/authorized_keys
客户端中,切换到需要ssh登录的帐户下:
ssh 服务器主机名 --登录服务器,若在服务器与客户端中的帐户名不同,则
ssh 帐户名@服务器主机名
yes --将服务器写入known_hosts中
若产生公私钥时设置了密码短语,还需要输入密码短语,为了方便,可在客户端中ssh-add,然后输入密码短语,下次再ssh登录,无需再输入密码短语。
验证:
[test@localhost ~]$ ssh -version
OpenSSH_4.3p2, OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008
Bad escape character 'rsion'.
显示SSH已经安装成功了。输入命令:
ssh localhost
会有如下显示:
[test@localhost .ssh]$ ssh localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
RSA key fingerprint is 2b:36:6b:23:4d:e4:71:2b:b0:79:69:36:0e:65:3b:0f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
Last login: Tue Oct 30 13:08:33 2012 from localhost.localdomain
这说明已经安装成功,第一次登录时会询问你是否继续链接,输入yes即可进入。
实际上,在Hadoop的安装过程中,是否无密码登陆是无关紧要的,但是如果不配置无密码登录,每次启动Hadoop,都需要输入密码以登陆到每台机器的DataNode上,考虑到一般的Hadoop集群动辄数百台或上千台机器,因此一般来说都会配置SSH的无密码登录。
关于公私钥对的一点理解:公私钥对就像是一套钥匙和锁,公钥是锁,私钥是钥匙。私钥留在客户端中,公钥发给服务器。服务器可以有很多把锁,客户端只有一把钥匙。当客户端ssh登录服务器时,服务器会找到这个客户端发的锁,然后跟客户端要钥匙,如果钥匙是配套的,那么登录成功,反之登录失败。当然,以上是针对同一个用户说的,不同用户的公私钥对也不同,而且每次ssh-keygen产生的公私钥对也不同。
备注将普通用户修改为超级用户的方法:
l 进入超级用户模式。也就是输入"su -",系统会让你输入超级用户密码,输入密码后就进入了超级用户模式。
l 添加文件的写权限。也就是输入命令"chmod u+w /etc/sudoers"。
l 编辑/etc/sudoers文件。也就是输入命令"vim /etc/sudoers",输入"i"进入编辑模式,找到这一行:"root ALL=(ALL) ALL"在起下面添加"xxx ALL=(ALL) ALL"(这里的xxx是你的用户名),然后保存(就是先摁一下Esc键,然后输入":wq")退出。
l 撤销文件的写权限。也就是输入命令"chmod u-w /etc/sudoers"。
3 安装并运行Hadoop
先介绍一下Hadoop对各个节点的角色意义:
Hadoop分别从三个角度将主机划分为两种角色。第一,划分为master和salve,即主人与奴隶;第二,从HDFS的角度,将主机划分为NameNode和DataNode(在分布式文件系统中,目标的管理很重要,管理目录的就相当于主人,而NameNode就是目录管理者);第三,从MapReduce的角度,将主机划分为JobTracker和TaskTracker(一个job经常被划分为多个task,从这个角度不难理解它们之间的关系)。
Hadoop有官方发行版与cloudera版,其中cloudera版是Hadoop的商用版本。下面介绍Hadoop官方发行版的安装方法。
Hadoop有三种运行方式:单节点方式、单击伪分布方式与集群方式。乍看之下,前两种方式并不能体现云计算的优势,在实际应用中并没有什么意义,但是在程序的测试与调试过程中,他们还是很有意义的。
可以通过下面的地址下载获得Hadoop的官方发行版:
http://www.apache.org/dist/hadoop/core/
下载hadoop-1.0.4.tar.gz并将其解压,解压到用户目录下:/home/[用户]/
tar -xzvf hadoop-1.0.4.tar.gz
l 单节点方式配置
安装单节点的Hadoop无须配置,在这种方式下,Hadoop被认为是一个单独的java进程,这种方式经常用来测试。
l 伪分布式配置
可以把伪分布式的Hadoop看作是一个节点的集群,在这个集群中,这个节点既是master,也是salve;既是NameNode也是DataNode;既是JobTracker,也是TaskTracker。
伪分布式的配置过程也很简单,只需要修改几个文件,如下所示。
进入conf文件夹(在解压缩的目录下),修改配置文件。
[test@localhost conf]$ pwd
/home/test/hadoop-1.0.4/conf
[test@localhost conf]$ ls hadoop-env.sh
hadoop-env.sh
[test@localhost conf]$ vim hadoop-env.sh
添加内容:
export JAVA_HOME=/usr/java/jdk1.7.0
指定JDK的安装位置
[test@localhost conf]$ pwd
/home/test/hadoop-1.0.4/conf
[test@localhost conf]$ ls core-site.xml
core-site.xml
修改文件
[test@localhost conf]$ vim core-site.xml
添加内容:
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
这是hadoop核心的配置文件,这里配置的是HDFS的地址和端口号。
[test@localhost conf]$ ls hdfs-site.xml
hdfs-site.xml
修改文件:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
这是Hadoop中的HDFS的配置,配置的备份方式默认为3,��单机版的Hadoop中,需要将其改为1.
[test@localhost conf]$ ls mapred-site.xml
mapred-site.xml
[test@localhost conf]$ vim mapred-site.xml
修改文件:
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
</property>
</configuration>
这是Hadoop中MapReduce的配置文件,配置的是JobTracker的地址和端口。
需要注意的是,如果安装的是0.20之前的版本,那么只有一个配置文件,即为Hadoop-site.xml。
接下来,在启动Hadoop前,需格式化Hadoop的文件系统HDFS(这点与Windows是一样的,重新分区后的卷总是要格式化的)。进入Hadoop文件夹,输入下面的命令:
[test@localhost hadoop-1.0.4]$ bin/hadoop namenode -format
12/11/01 00:20:50 INFO namenode.NameNode: STARTUP_MSG:
Re-format filesystem in /tmp/hadoop-test/dfs/name ? (Y or N) Y
12/11/01 00:20:55 INFO util.GSet: VM type = 32-bit
12/11/01 00:20:55 INFO util.GSet: 2% max memory = 17.77875 MB
12/11/01 00:20:55 INFO util.GSet: capacity = 2^22 = 4194304 entries
12/11/01 00:20:55 INFO util.GSet: recommended=4194304, actual=4194304
12/11/01 00:20:55 INFO namenode.FSNamesystem: fsOwner=test
12/11/01 00:20:55 INFO namenode.FSNamesystem: supergroup=supergroup
12/11/01 00:20:55 INFO namenode.FSNamesystem: isPermissionEnabled=true
12/11/01 00:20:55 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
12/11/01 00:20:55 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
12/11/01 00:20:55 INFO namenode.NameNode: Caching file names occuring more than 10 times
12/11/01 00:20:56 INFO common.Storage: Image file of size 110 saved in 0 seconds.
12/11/01 00:20:56 INFO common.Storage: Storage directory /tmp/hadoop-test/dfs/name has been successfully formatted.
12/11/01 00:20:56 INFO namenode.NameNode: SHUTDOWN_MSG:
格式化文件系统,接下来启动Hadoop。
首先赋予test用户hadoop文件夹的使用权限:
[test@localhost ~]$ chown -hR test /home/test/hadoop-1.0.4
输入命令:
[test@localhost hadoop-1.0.4]$ bin/start-all.sh
starting namenode, logging to /home/test/hadoop-1.0.4/libexec/../logs/hadoop-test-namenode-localhost.localdomain.out
localhost: starting datanode, logging to /home/test/hadoop-1.0.4/libexec/../logs/hadoop-test-datanode-localhost.localdomain.out
localhost: starting secondarynamenode, logging to /home/test/hadoop-1.0.4/libexec/../logs/hadoop-test-secondarynamenode-localhost.localdomain.out
starting jobtracker, logging to /home/test/hadoop-1.0.4/libexec/../logs/hadoop-test-jobtracker-localhost.localdomain.out
localhost: starting tasktracker, logging to /home/test/hadoop-1.0.4/libexec/../logs/hadoop-test-tasktracker-localhost.localdomain.out
利用jps查看已经启动的服务:
[test@localhost ~]$ cd /home/test/hadoop-1.0.4
[test@localhost hadoop-1.0.4]$ jps
[test@localhost hadoop-1.0.4]$ jps
12657 SecondaryNameNode
12366 NameNode
12995 Jps
12877 TaskTracker
12739 JobTracker
12496 DataNode
最后,验证Hadoop是否安装成功。打开浏览器,分别输入网址:
http://localhost:50070/(HDFS的Web页面)
http://localhost:50030/(MapReduce的Web页面)
如果都能看到,说明Hadoop已经安装成功。对于Hadoop来说,安装MapReduce及HDFS都是必须的,但是如果有必要,依然可以只启动HDFS或者MapReduce:
[test@localhost hadoop-1.0.4]$ bin/start-dfs.sh
[test@localhost hadoop-1.0.4]$ bin/start-mapred.sh