准备 Hadoop 运行环境
更新日期:
一、安装所必须的软件
首先,Hadoop 需要 Java 运行环境。
Base | |
---|---|
openjdk-7-jdk |
这里,我们使用系统自带的 OpenJDK 7。关于是否应该使用 Oracle 的 JDK 的问题,在这里完全没有必要。在 Java 6 的年代,由于 Java 的开放源代码进程问题,OpenJDK 6 和 Oracle JDK 6 还是有一些不一致的,所以在 JAVA 6 的年代,推荐使用 Oracle JDK 以避免不必要的麻烦。在进入到 Java 7后,OpenJDK 和 Oracle JDK 已经一致了,而且,这一点 Hadoop 官方已经明确给出确认,所以可以放心的使用 OpenJDK 7。 |
openssh-server |
Hadoop 需要使用 SSH 连接各个主机。即使是伪分布模式,也需要连接本机。所以需要安装 SSH 服务器。 |
nano |
我们编辑配置文件的时候,我将使用 nano 编辑器。我知道许多人会选择使用 vi ,但是从易用性上,nano 要比 vi 简单。使用 nano 不需要去背那些 vi 命令和快捷键,很适合新手。nano 在许多 ubuntu 系统里都是默认安装的,不需要额外的安装的。在此写进安装命令只是以防万一 (比如在使用 vmbuilder 构建的精简版的 Ubuntu 中,很多命令都不会被安装)。 |
和 Windows 不同,在 Ubuntu 里,安装软件非常简单,只需要一条命令即可,系统会从网上找到需要的软件包进行下载并安装。而且,你不需要担心版本之间的依赖关系、是否互相有冲突、安装位置等等。
安装上面的软件,只需执行:
1 | sudo apt-get install openjdk-7-jdk openssh-server nano |
除了上面所必需的软件外,为了方便调试,我们还会安装如下软件:
Extra | |
---|---|
unzip |
我们将来会用它对下载的 .zip 数据文件进行解压缩。 |
htop |
使用 htop 对节点负载进行分析与观察是非常有帮助的。 |
tree |
使用 tree 命令可以很方便的列出目录内部的树形结构。 |
dnsutils |
其中包括两个在调试 DNS 时很常用的命令 nslookup 和 dig 。 |
tcptrack |
监视 TCP 连接的变化情况,方便调试。 |
command-not-found |
这是一个帮助类的软件包,当你你使用的命令未安装的时候,它会告诉你命令在哪个软件里,以及如何安装。 |
1 | sudo apt-get install htop tree dnsutils tcptrack command-not-found
|
当询问是否安装的时候,按 y
回车
如果虚拟机是从另一个虚拟机克隆出来的,其网卡的MAC地址应该会被重置。重置MAC地址之后会导致 Linux 安全固化部分的机制启动,会让新的MAC地址使用下一个eth编号。因此,当使用
ifconfig -a
的时候,会发现原来的eth0
没有了,多了一个新的eth1
。而且会因此导致默认的/etc/network/interfaces
针对eth0
的配置失效,引导的时候会出现无谓的等待120秒网络配置的情况,并且最关键的是,网络无法访问了。解决办法很简单,直接删除掉规则文件
sudo rm /etc/udev/rules.d/70-persistent-net.rules
,重启一下虚拟机,就会自动生成新的对应于eth0
的规则文件。重启后,网络就可以使用了。
二、配置 SSH 无密码登陆
Hadoop 的 master 在控制 slaves 的时候,比如 NameNode 启动、停止 DataNode 等,需要使用 SSH 连接相应的节点。如果不配置无密码登陆,那么在启动停止的时候,都需要人工手动输入各个节点的密码。这是不现实的。
那么既保证安全,又能够避免麻烦的办法有两种,一种是使用 ssh-agent
,在生产环境中可以考虑使用,配置较复杂;另一种则是使用 SSH 密钥登陆,这个操作非常简单,很适合实验环境配置,也是绝大多数网上教程使用的方法。
其原理很简单,只是简单的非对称加密,大学学过应用密码学课程的人都应该很熟悉,记不清的可以搜索关键字,非对称加密、RSA 等。在这里不赘述了。
在 Ubuntu 上配置无密码登陆非常容易。只需要两条命令。
首先,我们需要生成一对儿密钥:公钥和私钥。只需要使用命令:
1 | ssh-keygen |
一路回车即可,不需要输入任何东西,就生成好了。这条命令会将生成的密钥对放入 ~/.ssh
目录下,因此,可以执行 ls ~/.ssh
去确认该文件夹里面是否已经成功存在所生成的密钥。
然后,我们需要将公钥添加到目标主机的授权列表里。比如,在这里我们将先配置 Hadoop 伪分布模式,因此我们需要保证 SSH 登录本机的时候,不需要密码。如果之前没有配置过使用密钥登录的,ssh localhost
会提示用户输入密码。这是我们不希望出现的。于是我们用下面的这一条命令来将公钥添加到本地的授权列表。
1 | ssh-copy-id -i localhost |
提示输入本机密码,输入密码后回车,这样就把公钥添加到本机的授权列表了。可以执行 ls ~/.ssh
,会发现,目录里面多了一个 authorized_keys
文件,这个文件就是授权公钥列表文件。这里面包含的就是我们刚刚提交的公钥。有了这个,我们登录本机就不需要密码了。
在命令行里再登录一下试试看:
1 | ssh localhost |
如果配置都是正确的,会发现,没有刚才的密码提示了。
注意到网上许多教程在配置无密码登录的时候,都是用的是命令
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authroized_keys
这将直接手动修改授权文件authroized_keys
。这是比较古老的方法,可以工作,但是已不推荐使用了,因为如果命令敲错,比如少打了一个大于号,就会导致认证密钥列表被覆盖,从而导致其它的一些应用登录可能出现问题,又或者授权文件的文件名敲错,而不会有任何提示,结果还是无法无密码登录等。而且,这个方法在跨主机的时候就更复杂了,还需要把文件先复制到目标主机上。因此,除非有什么特殊的原因,推荐使用刚才所描述的ssh-copy-id
。
三、配置主机名及静态IP地址
对于单节点的伪分布模式,本步骤可以忽略,只要在 Hadoop 配置文件中使用 localhost
就可以启动。完全不会有问题。但是,在多节点全分布模式下,这一步就是必须的了。在这里配置的原因是考虑到将来还会用这个节点做多节点实验。
此外,还有一个原因是,如果你的 Ubuntu 是运行于虚拟机中的,那么配置好了静态IP和主机名,就会很方便外部主机通过浏览器访问 Hadoop 的界面,比如查看 Hadoop 状态、浏览 HDFS 之类的。如果没有配置那些,也可以访问,但是会有一些麻烦。
在配置之前,我们先定义一下将要配置网络环境。
我们的 Ubuntu 是安装在 VirtualBox 虚拟机中的,网卡连接方式的是 VirtualBox 虚拟机的桥接网卡,桥接表明虚拟机和实际的物理机处于同级的位置,也就是说从外部看来,虚拟机和主机是局域网中两台机器,因此同属局域网的网段。
该网络的网段是: 10.0.1.0/24
网关是: 10.0.1.1
该网关同时也有 DNS 转发的功能。
我们今天配置的伪分布的单节点,以及将来配置的全分布的各个节点将都在这个网络下,为了方便起见,我们先定义一下各个节点的 IP 和主机名:
1 2 3 4 5 | 10.0.1.110 hadoop-master 10.0.1.111 hadoop-secondary 10.0.1.121 hadoop-data1 10.0.1.122 hadoop-data2 10.0.1.123 hadoop-data3 |
前面是该节点应该使用的IP,后面是该节点的主机名。今天我们将在 hadoop-master
上面配置单节点伪分布模式。
下面开始配置。
3.1 修改本机主机名
1 | sudo nano /etc/hostname
|
这是一个一行内容的文本文件,将其修改为 hadoop-master
。
然后按 Ctrl+x
,会提示已修改,是否保存,输入 y
回车,还会再确认一下文件名,直接回车即可,文件就保存了。
3.2 配置静态 IP
1 | sudo nano /etc/network/interfaces
|
将其中的
1 2 | auto eth0 iface eth0 inet dhcp |
替换为
1 2 3 4 5 6 | auto eth0 iface eth0 inet static address 10.0.1.110 netmask 255.255.255.0 gateway 10.0.1.1 dns-nameservers 10.0.1.1 8.8.8.8 |
和刚才一样,Ctrl+x
,保存退出。
我们此处配置的都是 Ubuntu 服务器版,如果配置的是 Ubuntu 桌面版,则很有可能
/etc/network/interfaces
中没有auto eth0
项。这是由于eth0
由图形界面配置工具NetworkManager
所接管。我们要取代NetworkManager
管理的办法很简单,就是添加上面要替换的内容即可。
3.3 配置主机名和 IP 对应关系
1 | sudo nano /etc/hosts
|
在文件尾部添加:
1 2 3 4 5 | 10.0.1.110 hadoop-master 10.0.1.111 hadoop-secondary 10.0.1.121 hadoop-data1 10.0.1.122 hadoop-data2 10.0.1.123 hadoop-data3 |
保存退出。
3.4 使配置生效
1 | sudo ifdown eth0 && sudo ifup eth0 |
可以用 ifconfig
来检查自己的网络配置,或者直接 ssh hadoop-master
试一下。如果碰到错误,检查一下配置文件。
从这里开始,我们就可以不用在虚拟机窗口中配置了,我们可以使用 SSH 客户端(即终端),如Putty、Bitvise SSH Client、WinSCP、Xshell等工具来连接 hadoop-master
。
使用终端的好处是显而易见的,比如我们可以方便的复制、粘贴文字到终端窗口,也可以将里面的内容复制、粘贴出来。此外,上面的许多 SSH 客户端支持 SFTP,通过 SFTP 我们可以很轻松的将文件上传到 Linux 主机上。
需要注意的是,在主机上也需要配置上述主机名和IP地址对应关系的,对于 Linux 来说,和第三步一样,配置 /etc/hosts
文件;对于 Windows 而言,是编辑 C:\Windows\System32\drivers\etc\hosts
文件,都是将第3步的内容追加到文件末尾。
四、禁用 IPv6
由于 Hadoop 只在 IPv4 开发,因此对 IPv6 的兼容性目前还存在问题。因此,最好禁用系统的 IPv6,防止不必要的麻烦。
1 | sudo nano /etc/sysctl.d/10-disable-ipv6.conf |
在文件中添加如下内容:
1 | net.ipv6.conf.all.disable_ipv6=1
|
使配置文件生效:
1 | sudo sysctl -p /etc/sysctl.d/10-disable-ipv6.conf |
可以使用命令 ifconfig | grep inet6
检查是否已经禁用了 IPv6。如果没有任何结果返回,则说明 IPv6 已经成功禁用了;否则,则说明禁用 IPv6 没有成功。
五、配置 JAVA_HOME
环境变量
Hadoop 需要在使用 JAVA_HOME
环境变量。由于该环境变量将在多处使用,并会在 ssh + 主机名 + 命令
的形式使用,因此,我们将在全局环境变量中配置:
1 | sudo nano /etc/environment
|
在文件最后添加:
1 | JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/
|
Ctrl+x
,保存退出。
这里虽然也有 PATH 环境变量,但是不要在这里修改它,这里是全局变量。
有些教程建议修改
/etc/profile
文件,可是修改该文件后,JAVA_HOME
依旧是无法出现在ssh
命令模式下的环境中,就导致了还必须同时设置conf/hadoop-env.sh
文件中的JAVA_HOME
,否则,将会出现Error: JAVA_HOME is not set.
的故障。可能是写教程的人不熟悉/etc/profile
和/etc/environment
的加载时间所致。这里我们只需修改/etc/environment
文件即可。
然后,sudo reboot
,重新启动虚拟机,以让全局环境变量生效。
可以使用命令
ssh localhost env | grep JAVA_HOME
来判断是否设置正确,如果设置正确会看到JAVA_HOME
的配置,如果返回为空,则说明设置依旧有错。
【该文档最新版本请查看: http://twang2218.github.io/tutorial/hadoop-install/prepare-hadoop-runtime-environment.html 】