2.3 Hadoop的安装与使用
在开始具体操作之前,需要首先选择一个合适的操作系统。尽管 Hadoop 本身可以运行在Linux、Windows以及其他一些类UNIX系统(如FreeBSD、OpenBSD、Solaris等)之上,但是Hadoop官方真正支持的作业平台只有Linux。这就导致其他平台在运行Hadoop时,往往需要安装很多其他的包来提供一些Linux操作系统的功能,以配合Hadoop的执行。例如,Windows在运行Hadoop时,需要安装Cygwin等软件。我们这里选择Linux作为系统平台,来演示在计算机上如何安装Hadoop、运行程序并得到最终结果。当然,其他平台仍然可以作为开发平台使用。对于正在使用Windows操作系统的用户,可以通过在Windows操作系统中安装Linux虚拟机的方式完成实验。在Linux发行版的选择上,我们倾向于使用企业级的、稳定的操作系统作为实验的系统环境,同时,考虑到易用性以及是否免费等方面的问题,我们排除了OpenSUSE和RedHat等发行版,最终选择免费的Ubuntu桌面版作为推荐的操作系统,读者可以到网络上下载Ubuntu系统镜像文件(http://www.ubuntu.org.cn/download/desktop)进行安装。关于 Hadoop 上机实践的更多细节内容,可以参见本书配套学习指南(http://dblab.xmu.edu.cn/post/5663/)。
Hadoop基本安装配置主要包括以下5个步骤。
(1)创建Hadoop用户。
(2)安装Java。
(3)设置SSH登录权限。
(4)单机安装配置。
(5)伪分布式安装配置。
下面将分别介绍每个步骤的具体实现方法,这里使用的操作系统是Ubuntu14.04,Hadoop版本为2.7.3。
2.3.1 创建Hadoop用户
为方便操作,我们创建一个名为“Hadoop”的用户来运行程序,这样可以使不同用户之间有明确的权限区别,同时,也可以使针对 Hadoop 的配置操作不影响其他用户的使用。实际上,对于一些大的软件(如MySQL),在企业中也常常为其单独创建一个用户。
创建用户的命令是 useradd,设置密码的命令为 passwd。此外,可能部分系统还需要为用户创建文件夹,在这里不再详细说明。
2.3.2 Java的安装
由于Hadoop本身是使用Java语言编写的,因此Hadoop的开发和运行都需要Java的支持,一般要求Java 6或者更新的版本。对于Ubuntu本身,系统上可能已经预装了Java,它的JDK版本为openjdk,路径为“/usr/lib/jvm/default-java”,后文中需要配置的JAVA_HOME环境变量就可以设置为这个值。
对于Hadoop而言,采用更为广泛应用的Oracle公司的Java版本,在功能上可能会更稳定一些,因此用户也可以根据自己的爱好,安装Oracle版本的Java。在安装过程中,请记录JDK的路径,即 JAVA_HOME 的位置,这个路径的设置将用在后文 Hadoop 的配置文件中,目的是让Hadoop程序可以找到相关的Java工具。
2.3.3 SSH登录权限设置
对于 Hadoop 的伪分布和全分布而言,Hadoop 名称节点(NameNode)需要启动集群中所有机器的Hadoop守护进程,这个过程可以通过SSH登录来实现。Hadoop并没有提供SSH输入密码登录的形式,因此,为了能够顺利登录每台机器,需要将所有机器配置为名称节点可以无密码登录它们。
为了实现SSH无密码登录方式,首先需要让名称节点生成自己的SSH密钥,命令如下:
ssh-keygen -t rsa -P '' //在后面选择存放位置时,按照默认位置,会存放在用户目录的.ssh/路径下
名称节点生成自己的密钥之后,需要将它的公共密钥发送给集群中的其他机器。我们可以将id_dsa.pub中的内容添加到需要匿名登录的机器的“~/ssh/authorized_keys”目录下,然后,在理论上名称节点就可以无密码登录这台机器了。对于无密码登录本机而言,可以采用以下代码:
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
这时可以通过ssh localhost命令来检测一下是否需要输入密码。对于Ubuntu而言,到这里SSH就配置好了。
2.3.4 安装单机Hadoop
这里使用的Hadoop版本为2.7.3,下载地址为http://hadoop.apache.org/releases.html#Download,在目录中选择hadoop-2.7.3.tar.gz进行下载即可。
将该文件夹解压后,可以放置到自己喜欢的位置,如“/usr/local/hadoop”文件夹下。注意,文件夹的用户和组必须都为hadoop。
在Hadoop的文件夹中(即“/usr/local/hadoop”),“etc/hadoop”目录下面放置了配置文件,对于单机安装,首先需要更改hadoop-env.sh文件,以配置Hadoop运行的环境变量,这里只需要将JAVA_HOME环境变量指定到本机的JDK目录就可以了,命令如下:
$export JAVA_HOME=/usr/lib/jvm/default-java
完成之后,我们可以试着查看Hadoop的版本信息,可以运行如下命令:
$./bin/hadoop version
此时,应该得到如下提示:
Hadoop 2.7.3
........
This command was run using /usr/local/hadoop/share/hadoop/common/hadoop-common- 2.7.3.jar
Hadoop 文档中还附带了一些例子供我们测试,我们可以运行 WordCount 的例子来检测一下Hadoop安装是否成功。
首先,在hadoop目录下新建input文件夹,用来存放输入数据;然后,将etc/hadoop文件夹下的配置文件拷贝进input文件夹中;接下来,在hadoop目录下新建output文件夹,用来存放输出数据;最后,执行如下代码:
$cd /usr/local/hadoop
$mkdir ./input
$cp ./etc/hadoop/ *.xml ./input
$./bin/hadoop jar/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep ./input ./output 'dfs[a-z.]+'
执行之后,我们执行以下命令查看输出数据的内容:
$cat ./output/ *
运行上面命令后,可以得到以下结果:
1 dfsadmin
这意味着,在所有的配置文件中,只有一个符合正则表达式的单词,结果正确。
2.3.5 Hadoop伪分布式安装
伪分布式安装是指在一台机器上模拟一个小的集群,但是集群中只有一个节点。需要说明的是,在一台机器上也是可以实现完全分布式安装的(而不是伪分布式),只需要在一台机器上安装多个 Linux虚拟机,每个Linux虚拟机成为一个节点,这时就可以实现Hadoop的完全分布式安装。这里只介绍伪分布式安装,完全分布式安装方法可以参考本书配套学习指南(http://dblab.xmu.edu.cn/post/5663/)。
当 Hadoop 应用于集群时,不论是伪分布式还是真正的分布式运行,都需要通过配置文件对各组件的协同工作进行设置,最重要的几个配置文件见表2-1。
表2-1 Hadoop中的配置文件
对于伪分布式配置,我们需要修改core-site.xml、hdfs-site.xml这2个文件。
修改后的core-site.xml文件如下:
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
可以看出,core-site.xml配置文件的格式十分简单,<name>标签代表了配置项的名字,<value>项设置的是配置的值。对于core-site.xml文件,我们只需要在其中指定HDFS的地址和端口号,端口号按照官方文档设置为9 000即可。
修改后的hdfs-site.xml文件如下:
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
对于hdfs-site.xml文件,我们设置replication值为1,这也是Hadoop运行的默认最小值,它限制了HDFS文件系统中同一份数据的副本数量。因为这里采用伪分布式,集群中只有一个节点,因此副本数量replication的值也只能设置为1。
对于本书的实验,我们这样配置后就已经满足运行要求了。这里再给出一个官方文档的详细地址,感兴趣的读者可以查看文档配置的其他项目,网址如下:http://hadoop.apache.org/docs/stable。
在配置完成后,首先需要初始化文件系统,由于 Hadoop 的很多工作是在自带的 HDFS 文件系统上完成的,因此需要将文件系统初始化之后才能进一步执行计算任务。执行初始化的命令如下:
$./bin/hadoop namenode -format
执行结果如下:
15/01/14 18:04:15 INFO namenode.NameNode: STARTUP_MSG:
/ ************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = ubuntu/127.0.1.1
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.7.3
*************************************************************/
......
16/09/08 11:30:04 INFO util.ExitUtil: Exiting with status 0
16/09/08 11:30:04 INFO namenode.NameNode: SHUTDOWN_MSG:
/ ************************************************************
SHUTDOWN_MSG: Shutting down NameNode at ubuntu/127.0.1.1
*************************************************************/
在看到运行结果中出现“Exiting with status 0”之后,就说明初始化成功了。
然后,用如下命令启动所有进程,可以通过提示信息得知所有的启动信息都写入对应的日志文件。如果出现启动错误,则可以在日志中查看错误原因。
$./bin/start-all.sh
运行之后,输入jps指令可以查看所有的Java进程。在正常启动时,可以得到如下类似结果:
$jps
8675 NodeManager
8885 Jps
8072 NameNode
8412 SecondaryNameNode
8223 DataNode
8559 ResourceManager
此时,可以访问Web界面(http://localhost:50070)来查看Hadoop的信息。
接下来,我们执行如下命令在HDFS中创建用户目录:
$./bin/hadoop dfs -mkdir -p /user/hadoop
在前面的安装单机Hadoop内容中,我们曾经在本地hadoop文件夹下创建了input文件夹,并把etc/hadoop文件夹下的配置文件复制到input文件夹,作为实验所需的文本文件。现在,我们需要将这些本地的文本文件(配置文件)“上传”到分布式文件系统HDFS中的input文件夹。当然,这里的“上传”并不意味着数据通过网络传输,实际上,在我们这里介绍的伪分布式Hadoop环境下,本地的input文件夹和HDFS中的input文件夹都在同一台机器上,并不需要通过网络传输数据。我们可以执行如下命令,将本地input文件夹中的数据上传到HDFS的input文件夹:
$./bin/hadoop dfs -put ./input
接着,运行如下命令来执行字数统计测试样例:
$./bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce /hadoop-mapreduce-examples*.jar grep input output 'dfs[a-z.]+'
在计算完成后,系统会自动在HDFS中生成output文件夹来存储计算结果。大家可以输入下面命令查看最终结果:
$./bin/hadoop fs -cat output/ *
最后需要指出的是,当需要重新运行程序时,首先需将HDFS中的output文件夹删除,然后再去运行程序。