1.4 Hadoop安装
本节分别介绍在Linux和Windows环境中如何安装Hadoop。
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 运行结果