实战Hadoop
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 Hadoop安装

本节分别介绍在Linux和Windows环境中如何安装Hadoop刘鹏.云计算[M].北京:电子工业出版社,2010

1.4.1 在Linux系统中安装Hadoop

1.安装环境配置

Linux系统有两种安装方式。一种是直接在裸机上安装Linux操作系统,另一种是在安装了Windows操作系统的机器上,通过安装Linux虚拟机,在Windows操作系统上虚拟一个Linux环境。对于已经安装了Linux的用户可以跳过步骤1)直接从步骤2)开始。

1)安装Linux虚拟机

首先,安装软件VMware Workstation v7.1.3。按照提示一步步完成Linux虚拟机的安装,方法与Linux操作系统的安装类似。软件安装完成后,可以打开Linux虚拟机,进入虚拟Linux环境。需要注意的是,必须安装虚拟机工具。

通过VMware Workstation v7.1.3软件的虚拟机设置选项,可以在Windows主机和Linux虚拟机之间建立共享文件夹,如图1-5所示。

图1-5 虚拟机设置

添加共享文件夹之后,便可以在Linux虚拟机的/mnt/hgfs目录下看到对应Windows主机的共享文件夹。

2)安装SSH

Hadoop运行过程中需要管理远端Hadoop守护进程,如果在安装Linux虚拟机时没有安装SSH Server,可以使用下面的命令来安装:

$ sudo apt-get install ssh

3)安装Java

实验使用jdk-6u24-linux-i586.bin,软件放在共享文件夹下。把Java安装到目录/usr/ java/jdk1.6.0_24,使用如下命令:

$ cd /usr/java/
$ /mnt/hgfs/share/jdk-6u24-linux-i586.bin

4)解压Hadoop安装包

实验使用Hadoop-0.20.2.tar.gz,软件放在共享文件夹下。把Hadoop解压到Linux usr目录,命令如下:

$ tar -zxvf /mnt/hgfs/share/hadoop-0.20.2.tar.gz

5)编辑conf/hadoop-env.sh文件

把JAVA_HOME设置为Java安装的根路径,可通过如下命令进行设置:

export JAVA_HOME=/usr/java/jdk1.6.0_24:

$ vi conf/hadoop-env.sh

2.安装步骤

Hadoop集群支持三种运行模式:单机模式、伪分布式模式和完全分布式模式。

1)单机模式

默认情况下,Hadoop被配置成一个以非分布式模式运行的独立Java进程,适合开始时做调试工作。

2)伪分布式模式

Hadoop可以在单节点上以伪分布式模式运行,用不同的Java进程模拟分布式运行中的各类节点(NameNode、DataNode、JobTracker、TaskTracker、Secondary NameNode)。

(1)Hadoop配置。

Hadoop-0.20.2以前版本(不含Hadoop-0.20.2)的配置文件是conf/hadoop-default.xml;而之后的版本中,该配置文件被拆分为coresite.xml、hdfs-site.xml和mapred-site.xml。其中core-site.xml和hdfs-site.xml是站在HDFS角度上的配置文件;core-site.xml和mapred-site.xml是站在MapReduce角度上的配置文件。实验使用如图1-6、图1-7、和图1-8所示的配置文件。

core-site.xml文档内容:

图1-6 实验用core-site.xml配置文档

hdfs-site.xml文档内容:

图1-7 实验用hdfs-site.xml配置文档

mapred-site.xml文档内容:

图1-8 实验用mapred-site.xml配置文档

(2)免密码SSH设置。

生成密钥对,执行如下命令:

$ ssh-keygen -t rsa

然后一直按<Enter>键,就会按照默认的选项将生成的密钥对保存在.ssh/id_rsa文件中,如图1-9所示。

图1-9 将密钥对保存在.ssh/id.rsa文件中

进入.ssh目录,执行如下命令:

$ cp id_rsa.pub authorized_keys

此后执行$ ssh localhost,可以实现用SSH 连接并且不需要输入密码。

(3)Hadoop运行。

(a)格式化分布式文件系统。使用如下命令进行格式化:

$ bin/hadoop namenode -format

(b)启动Hadoop守护进程。启动守护进程的命令如下:

$ bin/start-all.sh

成功执行后将在本机上启动NameNode、DataNode、JobTracker、TaskTracker和Secondary NameNode五个新的Java进程。

(c)停止Hadoop守护进程。最后需要停止Hadoop守护进程,命令如下:

$ bin/stop-all.sh

3)完全分布式模式

对于Hadoop,不同的系统会有不同的节点划分方式。在HDFS看来,节点分为NameNode和DataNode,其中NameNode只有一个,DataNode可以有多个;在MapReduce看来,节点又分为JobTracker和TaskTracker,其中JobTracker只有一个,TaskTracker可以有多个。NameNode和JobTracker可以部署在不同的机器上,也可以部署在同一机器上。部署NameNode和/或JobTracker的机器是Master(主服务器),其余的都是Slaves(从服务器)。用户甚至可以将NameNode、DataNode、JobTracker和TaskTracker全部部署在一台机器上。详细的配置方法介绍如下。

(1)配置NameNode和DataNode。

配置成功的关键在于确保各机器的主机名和IP地址之间能正确解析。修改每台机器的/etc/hosts,如果该台机器作NameNode用,则需要在文件中添加集群中所有机器的IP地址及其对应的主机名;如果该台机器仅作DataNode用,则只需要在文件中添加本机和NameNode的IP地址及其对应的主机名。

假设把ubuntunamenode作为NameNode,配置该节点的/etc/hosts,如图1-10所示。

图1-10 配置ubuntunamenode的/etc/hosts

把ubuntudata1,ubuntudata2作为DataNode,分别配置它们的/etc/hosts,如图1-11所示。

图1-11 ubuntudata1和ubuntudata2的hosts配置

(2)在所有的机器上建立相同的用户grid。

这一步通过以下命令实现:

$ useradd -m grid
$ passwd grid

成功建立grid用户后,输入的密码就是该用户的密码。

(3)SSH配置。

该配置主要是为了实现在机器之间执行指令时不需要输入密码。在所有机器上建立.ssh目录,执行:

$ mkdir .ssh

在ubuntunamenode上生成密钥对,执行:

$ ssh-keygen -t rsa

然后一直按<Enter>键,就会按照默认的选项将生成的密钥对保存在.ssh/id_rsa文件中。接着执行如下命令:

$cd ~/.ssh
$cp id_rsa.pub authorized_keys
$scp authorized_keys ubuntudata1:/home/grid/.ssh
$scp authorized_keys ubuntudata2:/home/grid/.ssh

最后进入所有机器的.ssh目录,改变authorized_keys文件的许可权限:

$chmod 644 authorized_keys

这时从ubuntunamenode向其他机器发起SSH连接,只有在第一次登录时需要输入密码,以后则不再需要。

(4)在所有机器上配置Hadoop。

首先在ubuntunamenode上配置,执行如下的解压缩命令:

$ tar -zxvf /mnt/hgfs/share/hadoop-020.2.tar.gz

(a)编辑core-site.xml、hdfs-site.xml和mapred-site.xml,如图1-6、图1-7(副本数根据集群中Slave节点的数目而定,一般小于Slave节点数)和图1-8所示。

(b)编辑conf/masters,修改为Master的主机名,每个主机名一行,此外即为ubuntunamenode。

(c)编辑conf/slaves,加入所有Slaves的主机名,即ubuntudata1和ubuntudata2。

(d)把Hadoop安装文件复制到其它机器上:

$ scp -r hadoop-0.20.2 ubuntudata1:/home/grid
$ scp -r hadoop-0.20.2 ubuntudata2:/home/grid

(e)编辑所有机器的conf/hadoop-env.sh文件,将JAVA_HOME变量设置为各自Java安装的根目录,不同机器可以使用不同的Java版本。

至此,Hadoop已经在集群上部署完毕。如果要新加入或删除节点,仅需修改NameNode的Master和Slaves。

(5)Hadoop运行。

格式化分布式文件系统,操作命令如下:

$bin/hadoop namenode -format

启动Hadoop守护进程。在ubuntunamenode上启动NameNode、JobTracker和Secondary NameNode,在ubuntudata1和ubuntudata2上启动DataNode和TaskTracker,并用如下jps命令检测启动情况:

$ bin/start-all.sh
$/usr/java/jdk1.6.0_24/bin/jps

启动正常结果如图1-12所示。

用户也可以根据自己的需要来执行如下命令:

(a)start-all.sh:启动所有的Hadoop守护进程,包括NameNode、DataNode、JobTracker和TaskTracker。

图1-12 启动Hadoop守护进程

(b)stop-all.sh:停止所有的Hadoop守护进程。

(c)start-mapred.sh:启动Map/Reduce守护进程,包括JobTracker和TaskTracker。

(d)stop-mapred.sh:停止Map/Reduce守护进程。

(e)start-dfs.sh:启动Hadoop DFS守护进程,包括NameNode和DataNode。

(f)stop-dfs.sh:停止DFS守护进程。

修改C:\WINDOWS\system32\drivers\etc\hosts文件,加入三台虚拟机的IP地址及其对应的主机名,即:

127.0.0.1 localhost

192.168.11.100 ubuntunamenode

192.168.11.101 ubuntudata1

192.168.11.102 ubuntudata2

(g)停止Hadoop守护进程。使用下面的命令即可停止守护进程:

$ bin/stop-all.sh

1.4.2 在Windows系统中安装Hadoop

虽然Hadoop支持Windows平台,但其官方网站声明,Hadoop的分布式操作尚未在Windows平台上严格测试。所以,在这里建议读者只把它作为开发平台。

1.安装环境配置

1)下载安装Cygwin

在Windows系统中安装Hadoop,需要安装Cygwin。Cygwin是一个在Windows平台上运行的Unix模拟环境,提供shell支持。下载Cygwin安装包的时候要选中Net category里的openssh,如图1-13所示。

图1-13 下载Cygwin安装包

编辑系统变量,新建系统变量CYGWIN,变量值为ntsec tty,如图1-14所示。

编辑系统变量里的Path变量,加入C:\cygwin\bin,如图1-15所示。

图1-14 编辑系统变量(1)

图1-15 编辑系统变量(2)

2)安装Java

实验使用jdk-6u13-windows-i586-p.exe,默认的安装目录为C:\Program Files\Java\ jdk1.6.0_13。

新建系统变量JAVA_HOME,如图1-16所示。

编辑系统变量里的Path变量,加入%JAVA_HOME%\bin;%JAVA_ HOME%\jre\bin,如图1-17所示。

图1-16 编辑系统变量(3)

图1-17 编辑系统变量(4)

新建系统变量CLASSPATH,值为.;%JAVA_HOME%\lib;%JAVA_ HOME%\lib\tools.jar,如图1-18所示。

图1-18 编辑系统变量(5)

2.安装步骤

与Linux系统一样,在Windows系统上运行Hadoop集群也支持三种运行模式:单机模式、伪分布式模式和完全分布式模式。

1)单机模式

启动Cygwin,解压缩Hadoop安装包。通过cygdrive(位于Cygwin根目录中)可以直接映射到Windows下的各个逻辑磁盘分区。例如Hadoop安装包放在目录D:\下,则解压缩命令为$ tar -zxvf /cygdrive/d/hadoop-0.20.2.tar.gz,解压后可使用ls命令查看,如图1-19所示。

图1-19 用户解压缩后的Hadoop目录

默认的解压缩目录为用户的根目录,即C:\cygwin\home\Administrator。

编辑conf/hadoop-env.sh文件,将JAVA_HOME变量设置为Java安装的根目录。例如Java安装在目录C:\Program Files\Java\jdk1.6.0_13,如果路径中没有空格,直接配置即可。但是因为本例中安装路径中存在空格,所以需要把Program Files缩写成Progra~1,如图1-20所示。

图1-20 编辑conf/hadoop-env.sh文件

2)伪分布式模式

(1)编辑文件conf/core-site.xml和mapred-site.xml。

编辑过程如图1-21、图1-22和图1-23所示。

图1-21 编辑文件conf/core-site.xml

图1-22 编辑文件conf/mapred-site.xml

图1-23 编辑文件hdfs-site.xml

(2)安装配置SSH。

启动Cygwin,执行命令:$ ssh-host-config,如图1-24所示。

图1-24 安装配置SSH(1)

当询问“Should privilege separation be used?”时,输入no,如图1-25所示。

图1-25 安装配置SSH(2)

当询问“Do you want to install sshd as a service?”,选择yes,把sshd作为一项服务安装,如图1-26所示。

图1-26 安装配置SSH(3)

当提示“Enter the value of CYGWIN for the daemon:[ntsec]”时,选择ntsec,如图1-27所示。

图1-27 安装配置SSH(4)

则提示sshd服务已经在本地系统安装好。

输入命令$ net start sshd,启动SSH,如图1-28所示。

图1-28 启动SSH(1)

也可以通过服务启动Cygwin sshd,如图1-29所示。

图1-29 启动SSH(2)

执行$ ssh-keygen来生成密钥对,然后一直按<Enter>键,就会按照默认的选项将生成的密钥对保存在.ssh目录下。将RSA公钥加入到公钥授权文件authorized_keys中,命令如下:

$ cd .ssh
$ cat id_rsa.pub >> authorized_keys

最后执行$ ssh localhost,就可以实现无需密码的SSH连接。

(3)Hadoop运行。

(a)格式化分布式文件系统。使用如下的命令来格式化:

$ bin/hadoop NameNode -format

(b)启动Hadoop守护进程。用下面的命令启动守护进程:

$ bin/start-all.sh

(c)停止Hadoop守护进程。最后需要停止所有的Hadoop守护进程,命令如下:

$ bin/stop-all.sh

3)完全分布式模式

在完全分布式模式下运行Hadoop需要经历以下5个步骤。

(1)修改相应文件。

修改所有机器的C:\WINDOWS\system32\drivers\etc\hosts文件,加入各机器IP地址及其对应的主机名,即:

127.0.0.1 localhost

192.168.11.100 zhen

192.168.11.101 zhen1

192.168.11.102 zhen2

(2)在所有机器上建立相同的账户。

(3)在所有机器上进行SSH配置。

执行$ ssh-keygen生成密钥对。然后一直按<Enter>键,就会按照默认的选项生成密钥对,并保存在.ssh/id_rsa文件中。执行下面的命令将RSA公钥加入到公钥授权文件authorized_keys中:

$cd ~/.ssh
$cat id_rsa.pub >> authorized_keys

接着在zhen上执行如下代码:

$cd ~/.ssh
$scp authorized_keys cloud @zhen1:/home/cloud/.ssh
$scp authorized_keys cloud @zhen2:/home/cloud/.ssh

分别进入zhen、zhen1和zhen2的.ssh目录,改变authorized_keys文件的许可权限,命令如下:

$chmod 644 authorized_keys

这样从zhen到其他机器的SSH 连接不需要输入密码就可以实现。

(4)在所有机器上配置Hadoop。

首先在zhen上配置,执行如下解压缩命令和修改目录命令:

$ tar -zxvf /cygdrive/d//hadoop-0.20.2.tar.gz
$ mv hadoop-0.20.2 hadoop

编辑conf/core-site.xml、conf/mapred-site.xml、conf/hdfs-site.xml,如图1-21、图1-22和图1-23(副本数根据集群中Slave节点的数目而定,一般小于Slave节点数)所示。

编辑conf/master,修改为Master的主机名,每个IP一行,在这里就是192.168.11.100。编辑conf/slaves,加入所有Slaves的主机名,即192.168.11.101和192.168.11.102。把Hadoop复制到其他机器,命令如下:

$scp ~/hadoop cloud@zhen1:/home/ cloud /
$scp ~/hadoop cloud@zhen2:/home/ cloud /

编辑所有机器的conf/hadoop-env.sh文件,将JAVA_HOME变量设置为Java安装的根目录,不同机器可以使用不同的Java版本,但需要jdk1.5版本以上。

(5)Hadoop运行。

格式化分布式文件系统,执行如下命令:

$bin/hadoop namenode -format

启动Hadoop守护进程。下面的命令用来启动守护进程:

$ bin/start-all.sh

同样的,访问http://zhen:50070或者http://192.168.11.100:50070可以查看NameNode及整个分布式文件系统的状态,浏览分布式文件系统中的文件及日志等;访问http://zhen:50060可以查看 TaskTracker的运行状态。

停止Hadoop守护进程,可用如下命令停止所有的Hadoop守护进程:

$ bin/stop-all.sh

1.4.3 站在象背上说“hello”

成功安装了Hadoop,试试让神象奔跑起来的感觉吧。Hadoop自带的WordCount实例可以统计一批文本文件中各单词出现的次数,这样就可以让读者轻松地站在象背上说“hello”了。下面介绍如何执行WordCount实例。

首先,新建一个目录,在这里以“input”命名:

$ mkdir input
$ cd input

然后,在input里新建“test1”、“test2”文本文件并在文件中分别写入“hello world”、“hello hadoop”:

$ echo “hello world” >test1.txt
$ echo “hello hadoop” >test2.txt

注意:在Cygwin上运行WordCount的步骤和上面介绍的基本相同,只需要注意在输入目录input中新建几个文本文件的格式稍有变化即可:

file1.txt:hello world
file2.txt:hello hadoop

接下来,将本地文件系统上input目录复制到HDFS的根目录下,重命名为“in”。“out”为数据处理完成后的输出目录(需要注意的是执行之前out目录必须为空,或者不存在这个目录,否则会出错),默认存放在分布式文件系统用户的根目录下。执行以下的命令:

$ bin/hadoop dfs -put input in
$ bin/hadoop jar hadoop-0.20.2-examples.jar wordcount in out

任务执行完毕后,查看Hadoop分布式文件系统上数据处理的结果,执行:

$ bin/hadoop dfs -cat out/*

另外,用户也可以把输出文件从Hadoop分布式文件系统复制到本地文件系统查看,具体命令如下:

$ bin/hadoop dfs -get out output
$ cat output/*

运行结果如图1-30所示。

图1-30 Word Count实例运行结果

1.4.4 Eclipse下的Hadoop应用开发

Hadoop安装包contrib/目录下有一个插件hadoop-*-eclipse-plugin.jar,使用这个插件,用户可以配置基于Eclipse的Hadoop应用开发环境,并在Eclipse中创建MapReduce应用程序。下面为读者介绍如何在Eclipse环境下进行Hadoop的应用开发。

(1)配置基于Eclipse的Hadoop应用开发环境。

启动Eclipse,打开Window->Open Perspective,单击Map/Reduce,会打开一个新的Perspective,如图1-31所示。

打开Window->Show View->Other,选择Map/Reduce Tools,单击Map/Reduce Locations,会打开一个View,如图1-32所示。

图1-31 配置基于Eclipse的Hadoop应用开发环境(1)

图1-32 配置基于Eclipse的 Hadoop应用开发环境(2)

添加Hadoop location,其中Host和Port的内容根据conf/hadoop-site的配置填写,User name是用户名,如图1-33所示。

图1-33 配置基于Eclipse的Hadoop应用开发环境(3)

配置完成之后,可以在DFS Locations看到分布式文件系统下的文件,并且可以进行文件的上传、下载等操作,如图1-34所示。

图1-34 配置基于Eclipse的Hadoop应用开发环境(4)

(2)简单编译实例。

新建一个Map/Reduce Project,命名为Proj,如图1-35所示。

加入Hadoop根目录,如图1-36所示。

图1-35 新建项目(1)

图1-36 新建项目(2)

新建一个类,命名为“WordCount”,如图1-37所示。

图1-37 新建一个类

WordCount.java的代码如图1-38所示。

图1-38 WordCount.java的代码

运行之前需配置工作路径,如图1-39所示。

图1-39 配置工作路径

配置工作路径完毕即可运行程序。运行结束后,用户可以通过控制台查看运行结果,如图1-40所示。

图1-40 运行结果