大数据技术原理与应用(第2版)
上QQ阅读APP看书,第一时间看更新

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文件夹删除,然后再去运行程序。