在Ubuntu上运行Hadoop(单节点集群)

十二 26th, 2013

这篇文章会详细介绍如何搭建运行在ubuntu上的hadoop分布式系统,包括部署前需要准备的必要条件以及安装过程中的详细步骤,最后会结合一个简单的例子介绍如何运行Hadoop。

了解Hadoop

Hadoop 是一个分布式系统基础架构,由Apache基金会开发。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力高速运算和存储。Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有着高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高传输率(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样可以流的形式访问(streaming access)文件系统中的数据。

这篇博文主要是用下面的版本进行测试:

1.  ubuntu 13.04
2.  hadoop 1.04

先决条件

安装JAVA环境

Hadoop运行需要安装Java 1.5+(Java 5)。但是,这里还是推荐大家使用jdk 1.6(java 6)来运行Hadoop。所以,后面我会介绍jdk 1.6的安装过程。

1. 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk6u35-downloads-1836443.html

2. 解压  jdk-6u35-linux-x64.bin

    $ chmod u+x jdk-6u35-linux-x64.bin
$ ./jdk-6u35-linux-x64.bin

3. 复制解压出jdk-6u35-linux-x64.bin文件夹到/usr/lib下

    $ sudo mkdir -p /usr/lib/jvm/
$ cp -r jdk1.6.0_35  /usr/lib/jvm/jdk1.6.0_35

4. 配置环境变量:

    $ sudo vim /etc/profile

在文件的末尾加上如下内容,保存并关闭文件

# for java
export JAVA_HOME=/usr/lib/jvm/jdk1.6.0_35
export JRE_HOME=${JAVA_HOME}/re
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH

5. 使设置生效:到此部JDK的配置就都完成了

    $ source /etc/profile

6. 为保证正确性,进行简单的测试

    $ java -version

添加特定的Hadoop系统账户

这里将使用一个专用的账户来运行hadoop。这个虽然不是必须得,但是它能帮助我们将Hadoop的安装与其它的软件分开,同样的Hadoop的运行账户同其它账户分开处理(安全,权限,备份,等等)。

$ sudo addgroup hadoop
$ sudo adduser –ingroup hadoop hduser

使用上面的2个命令,将增加一个hduser用户和hadoop组。

配置SSH服务

Hadoop需要打通SSH用来管理它的nodes,比如说远程服务器和本地机器之间的通讯。但对于我们现在的单node集群,就需要配置SSH,可以让hduser访问localhost。

在配置SSH之前,需要确认本机已经装好并启动了sshd服务。如果没有,请按照下面的步骤操作:

1.确定安装sshd:

    $ sudo apt-get install openssh-server

2.启动sshd:

    $ sudo net start sshd

运行 ps -e | grep ssh,查看是否有sshd进程:

上面的步骤确保了SSH服务已经准备好,后面就是配置SSH的public key authentication。

我们为hduser用户创建SSH key。

parallels@ubuntu:~$ su – hduser
hduser@ubuntu:~$ ssh-keygen -t rsa -P “”
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hduser/.ssh/id_rsa):
Created directory ‘/home/hduser/.ssh’.
Your identification has been saved in /home/hduser/.ssh/id_rsa.
Your public key has been saved in /home/hduser/.ssh/id_rsa.pub.
The key fingerprint is:
9b:82:ea:58:b4:e0:35:d7:ff:19:66:a6:ef:ae:0e:d2 hduser@ubuntu
The key’s randomart image is:
+–[ RSA 2048]—-+
|          .      |
|         o . o   |
|          = + =  |
|         + + + . |
|        S o . . =|
|       . . o o +o|
|          o E +  |
|           + o   |
|          . o.   |
+————————+
hduser@ubuntu:~$

第二行将通过空密码来创建RSA key pair。一般, 使用空得密码并不推荐,但现在的这个场景,我们却需要这么来做。

其次,你需要使用刚创建的key让SSH可以让问本地机器。

hduser@ubuntu:~$ cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

最后一步就是测试下hduser是否可以通过SSH连接到本地机器。

部署Hadoop集群

准备Hadoop安装包

我们先从Apache官网上下载到想要的Hadoop版本,并对其解压到/usr/local/hadoop和修改它的用户组。,详细如下:

$ cd /usr/local
$ sudo tar xzf hadoop-1.0.4.tar.gz
$ sudo mv hadoop-1.0.4 hadoop
$ sudo chown -R hduser:hadoop had

更新$HOME/.bashrc

然后为用户hduser添加下面的这些行到$HOME/.bashrc文件未。当然如果你并不是使用bash,你也可以将这些添加到对应的配置文件中。

# Set Hadoop-related environment variables
export HADOOP_HOME=/usr/local/hadoop
# Set JAVA_HOME (we will also configure JAVA_HOME directly for Hadoop later on)
export JAVA_HOME=/usr/lib/jvm/java-6-sun
# Some convenient aliases and functions for running Hadoop-related commands
unalias fs &> /dev/null
alias fs=”hadoop fs”
unalias hls &> /dev/null
alias hls=”fs -ls”
# If you have LZO compression enabled in your Hadoop cluster and
# compress job outputs with LZOP (not covered in this tutorial):
# Conveniently inspect an LZOP compressed file from the command
# line; run via:
#
# $ lzohead /hdfs/path/to/lzop/compressed/file.lzo
#
# Requires installed ‘lzop’ command.
#
lzohead () {
hadoop fs -cat $1 | lzop -dc | head -1000 | less
}
# Add Hadoop bin/ directory to PATH
export PATH=$PATH:$HADOOP_HOME/bin

同样,你也可以将这些配置拷贝给其它的hadoop用户。

HDFS

在进行更深入的学习之前,你必须先了解下Hadoop的分布式文件系统。

HDFS 是一个 Apache Software Foundation 项目,是 Apache Hadoop 项目的一个子项目。Hadoop 非常适于存储大型数据(比如 terabytes 和 petabytes),并使用 HDFS 作为其存储系统。HDFS 允许您连接多个集群中包含的节点 (普通个人计算机),那些集群上分布着一些数据文件。然后您可以将那些数据文件作为一个无缝文件系统来进行访问和存储。对数据文件的访问通过一种流线型(streaming) 方式进行处理,这意味着应用程序或命令通过 MapReduce 处理模型直接执行。

下面的这张图是HDFS的一个架构图,介绍了它一些重要的组件。

 

配置Hadoop

hadoop-env.sh

对于Hadoop,我们需要配置的文件就是hadoop-env文件,主要是讲上面的一些配置添加到该文件中。比如说JAVA_HOME, HADOOP_INSTALL….

找到conf/hadoop-env.sh,将下面的配置

# The java implementation to use.  Required.
# export JAVA_HOME=/usr/lib/j2sdk1.5-sun

修改如下:

# The java implementation to use.  Required.
export JAVA_HOME=/usr/lib/jvm/jdk1.6.0_35
export HADOOP_INSTALL=/user/local/hadoop/
export PATH=$PATH:$HADOOP_INSTALL/bin
export HADOOP_OPTS=”-Djava.security.krb5.realm=OX.AC.UK -Djava.security.krb5.kdc=kdc0.ox.ac.uk:kdc1.ox.ac.uk”

conf/*-site.xml

这里,我们需要配置下hadoop存储数据的目录,网络端口号等等。我们会用HDFS分布式文件系统,即使是我们这样的单节点的伪分布式系统也是一样的。

我们需要修改hadoop.tmp.dir这个参数,指定一个目录给它。比如说这篇文章中,我们会使用目录 /app/hadoop/tmp。

按照下面的步骤,创建一个目录并赋予相对应的权限:

$ sudo mkdir -p /app/hadoop/tmp
$ sudo chown hduser:hadoop /app/hadoop/tmp
# …and if you want to tighten up security, chmod from 755 to 750…
$ sudo chmod 750 /app/hadoop/tmp

如果你忘了设置文件夹的归属和权限,你就会在格式化NameNode的时候看到java.io.IOException的异常。

1. 找到conf/core-site.xml文件,在<configuration> … </configuration>之间添加下面的配置:

<property>
<name>hadoop.tmp.dir</name>
<value>/app/hadoop/tmp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:54310</value>
<description>The name of the default file system.  A URI whose
scheme and authority determine the FileSystem implementation.  The
uri’s scheme determines the config property (fs.SCHEME.impl) naming
the FileSystem implementation class.  The uri’s authority is used to
determine the host, port, etc. for a filesystem.</description>
</property>

2. 然后找到 conf/mapred-site.xml,同样增加下面一段配置:

<property>
<name>mapred.job.tracker</name>
<value>localhost:54311</value>
<description>The host and port that the MapReduce job tracker runs
at.  If “local”, then jobs are run in-process as a single map
and reduce task.  </description>
</property>

3. 最后找到  conf/hdfs-site.xml:

<property>
<name>dfs.replication</name>
<value>1</value>
<description>Default block replication.
The actual number of replications can be specified when the file is created.
The default is used if replication is not specified in create time.  </description>
</property>

对于上面的这些配置,如果还有什么疑问的话,可以参开文档 Getting Started with HadoopHadoop’s API Overview

格式化NameNode

运行Hadoop的第一步是需要格式化HDFS文件系统,当然前提是不要在运行的时候进行这些操作,否则你会丢失该集群里的所有的数据。

格式化文件系统的命令如下:

hduser@ubuntu:~$ /usr/local/hadoop/bin/hadoop namenode -format

文件输出如下所示:

启动Hadoop集群

启动该Hadoop集群的命令如下:

hduser@ubuntu:~$ /usr/local/hadoop/bin/start-all.sh

这个命令会在本地启动 NameNode ,Datanode, Jobtracker 和 Tasktracker ,输入如下:

通过jps命令,可以查看期望的Hadoop进程是否启动:

同样你也可以通过netstat命令来查看Hadoop的端口号是否被监听:

如果启动有问题,可以去logs/目录下面去检查。

停止集群服务

要停止hadoop,可以运行下面的命令:

hduser@ubuntu:~$ /usr/local/hadoop/bin/stop-all.sh

输出如下:

运行一个MapReduce的job

完成了上面的所有步骤,我们就可以运行一个MapReduce的任务。在Hadoop的安装包里面有一个WordCount的例子,你可以先从这里了解它的一些原理:WordCount example job

这个例子中输入和输出都是文本文件,结果文件每行都会包含一个单词和它的出现次数,通过tab分隔开。

下载测试数据

下面的例子,我们将使用3本电子书,其链接如下面:

 * The Outline of Science, Vol. 1 (of 4) by J. Arthur Thomson
 * The Notebooks of Leonardo Da Vinci
 * Ulysses by James Joyce

每本电子书都选择编码是Plain Text UTF-8的下载,我们先把下载的电子书统一放到/tmp/gutenberg这个目录下面。

重启Hadoop集群

前面我们已经停止Hadoop的服务,现在先得重新启动Hadoop,将运行环境准备好。

  hduser@ubuntu:~$ /usr/local/hadoop/bin/start-all.sh

导入数据到HDFS

在运行真实的MR任务之前,我们先得将准备好得数据文件拷贝到HDFS中。

hduser@ubuntu:/usr/local/hadoop$ bin/hadoop dfs -copyFromLocal /tmp/gutenberg
hduser@ubuntu:/usr/local/hadoop$ bin/hadoop dfs -ls /user/hduser/gutenberg

运行MapReduce job

现在,一切都就绪,我们可以开始运行WordCount的任务了。

hduser@ubuntu:/usr/local/hadoop$ bin/hadoop jar hadoop*examples*.jar wordcount /user/hduser/gutenberg /user/hduser/gutenberg-output

这个命令将读取HDFS(/user/hduser/gutenberg)目录下的数据文件,经过处理后,并将结果存储在HDFS的路径下(/user/hduser/gutenberg-output)。

注意:运行上面的命令,有可能会碰到如下所示的异常。

Exception in thread “main” java.io.IOException: Error opening job jar: hadoop*examples*.jar
at org.apache.hadoop.util.RunJar.main (RunJar.java: 90)
Caused by: java.util.zip.ZipException: error in opening zip file

如果碰到了,输入examples的全称,像这样就可以:

hduser@ubuntu:/usr/local/hadoop$ bin/hadoop jar hadoop-examples-1.0.3.jar wordcount /user/hduser/gutenberg /user/hduser/gutenberg-output

这个任务运行的输出如下所示:

任务运行完,结果文件会存储到HDFS路径:/user/hduser/gutenberg-output,下面可以检查文件是否存在:

hduser@ubuntu:/usr/local/hadoop$ bin/hadoop dfs -ls /user/hduser
hduser@ubuntu:/usr/local/hadoop$ bin/hadoop dfs -ls /user/hduser/gutenberg-output

如果你想修改Hadoop运行中的配置参数,比如说增加Reduce的任务数。这种需求可以通过在运行是加上-D 参数,使用如下:

hduser@ubuntu:/usr/local/hadoop$ bin/hadoop jar hadoop*examples*.jar wordcount -D mapred.reduce.tasks=16 /user/hduser/gutenberg /user/hduser/gutenberg-output

在HDFS上检查结果

为了检查结果文件,你可以将它拷贝到本地文件系统。或者,你可以使用下面的命令:

hduser@ubuntu:/usr/local/hadoop$ bin/hadoop dfs -cat /user/hduser/gutenberg-output/part-r-00000

这样,就不用拷贝文件到本地,而是直接在HDFS中查看。但在本文中,我们还是会将结果拷贝出来查看。具体操作如下:

hduser@ubuntu:/usr/local/hadoop$ mkdir /tmp/gutenberg-output hduser@ubuntu:/usr/local/hadoop$ bin/hadoop dfs -getmerge /user/hduser/gutenberg-output /tmp/gutenberg-output hduser@ubuntu:/usr/local/hadoop$ head /tmp/gutenberg-output/gutenberg-output

命令:fs -getmerge  它将指定目录下得所有文件简单的连接起来,但是这种合并文件基本上是不会被存储的。

Hadoop Web接口

Hadoop下面几个web界面,之前在conf/hadoop-default.xml中配置过的。

   * http://localhost:50070/ – web UI of the NameNode daemon
* http://localhost:50030/ – web UI of the JobTracker daemon
* http://localhost:50060/ – web UI of the TaskTracker daemon

这些界面提供了Hadoop集群运行过程中的一些日志。下面你就可以试着通过web页面查看相应的信息。

NameNode Web Interface (HDFS layer)

NameNode的web界面给出整个集群的概述包括的信息有集群的总共和还剩余的空间,存活和已经挂掉的节点。甚至,它也可以让浏览HDFS的namespace,并在浏览器中查看这些文件的细节。同样也可以查看本地机器的Hadoop log日志。

通常,访问这个链接即可: http://localhost:50070/.

JobTracker Web Interface (MapReduce layer)

JobTracker页面提供了该Hadoop集群下job的统计信息,包含运行中/已完成/失败的job和job的历史日志。它同样也可以允许你方访问本地的Hadoop log(这个本地机器是指该web服务运行的机器)

通常,访问这个链接即可: http://localhost:50030/.

TaskTracker Web Interface (MapReduce layer)

TaskTracker界面会展示正在运行中和没有运行的任务,它同样也可以允许你方访问本地的Hadoop log

通常,访问这个链接即可:  http://localhost:50060/.

What’s next?

完成了上述的操作,是不是对Hadoop已经有了一定的了解。接下来,你还需要继续提升自己Hadoop的经验。比如说,准备2台ubuntu,搭建一个Hadoop多节点的集群,参考文档:Running Hadoop On Ubuntu Linux (Multi-Node Cluster)。

当然还需要通过使用python写一个简单的MapReduce任务来,让自己掌握基本的M/R编程经验。参考:how to code a simple MapReduce job

Related Links





除非注明,本站文章均为原创。本文基于 BY-NC-SA 协议进行授权,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 metaboy(包含链接).

本文链接地址: http://blog.wangyuxiong.com/archives/52210

订阅本站:http://www.wangyuxiong.com/feed

目前还没有任何评论.

无觅相关文章插件,快速提升流量