文章目录
  1. 1. 前言
  2. 2. 一、准备工作
  3. 3. 二、安装 Hadoop
    1. 3.1. 2.1 下载 Hadoop 安装文件
    2. 3.2. 2.2 配置 Hadoop
      1. 3.2.1. 环境变量
      2. 3.2.2. *-site.xml
        1. 3.2.2.1. :
        2. 3.2.2.2. :
        3. 3.2.2.3. :
  4. 4. 三、操作伪分布集群
    1. 4.1. 3.1 格式化 NameNode
    2. 4.2. 3.2 启动 Hadoop
    3. 4.3. 3.3 运行示例程序
      1. 4.3.1. 3.3.1 下载
      2. 4.3.2. 3.3.2 解压缩
      3. 4.3.3. 3.3.3 将书籍放到 HDFS 云
      4. 4.3.4. 示例程序
    4. 4.4. 3.4 停止 Hadoop

前言

本安装指南是针对 Ubuntu Server 12.04 进行 Hadoop 1.x 单节点伪分布模式配置的。其它系统或其它版本请酌情调整配置方法。

一、准备工作

我们需要有一台 Ubuntu Server 12.04 64位的虚拟机,如果尚未建立,请参考:【在 VirtualBox 中安装 Ubuntu Server 12.04 64位版】 进行安装。

此外,我们还需要在这台虚拟机中为 Hadoop 的运行环境进行一些准备工作,具体的内容,请参考: 【准备 Hadoop 运行环境】。

二、安装 Hadoop

2.1 下载 Hadoop 安装文件

我们将安装当前 1.x 系列最新的版本 1.2.1,访问官网:http://hadoop.apache.org

Download HadoopreleasesDownloadDownload a release now! ⇨ 选择合适的镜像 ⇨ hadoop-1.2.1 ⇨ 我们将下载 hadoop-1.2.1-bin.tar.gz 这个文件。

这个文件可以下载到本地,在传到 Ubuntu 上,但是更好的办法是直接在 Ubuntu 中下载。由于我们已经配置好了静态 IP,因此现在可以在主机上使用 SSH 连接 hadoop-master了。

1
ssh hadoop-master

登录进去后,我们准备 hadoop 的环境以及下载。我们将创建一个 ~/hadoop 目录,以后所有的 hadoop 相关的软件都会放到该目录下。

1
2
mkdir ~/hadoop
cd ~/hadoop

这里需要说明的是,许多教程都最终将 hadoop 放到了 /usr/local/hadoop 目录下,这样做会带来很多权限问题。而很多教程,或者最后干脆使用 root 用户操作一切,或者使用 chown 来解决权限冲突,这都是非常不好的,很多时候是因为写这些教程的人对 Linux 不熟悉,把 Windows 的一些习惯带到了 Linux 里来。生产环境的搭建绝不是这么简单粗暴的改变所有权,更不可能是这样子滥用root权限。除了需要将 hadoop 放到符合 Linux 目录结构的位置外,包括配置文件和日志,也都应该指向正确的位置,并且建立适当的用户组,以及对不同的目录使用不同的权限,这将引入很多额外的工作,因此不适合在初学时涉及。对于开发和实验环境的搭建,我们这里的做法非常简单,足以胜任后续的学习、开发。

1
wget http://apache.dataguru.cn/hadoop/common/hadoop-1.2.1/hadoop-1.2.1-bin.tar.gz

如果网络环境较差,则需要检查下载的文件是否正确。执行

1
sha1sum hadoop-1.2.1-bin.tar.gz

如果输出和下面的内容一样,则说明下载正确了。

1
267748f61c9e27c3e1895453863b435458255939  hadoop-1.2.1-bin.tar.gz

如果下载正确,则对压缩文件进行解压缩:

1
tar -zxvf hadoop-1.2.1-bin.tar.gz

执行上述命令后,会生成 hadoop-1.2.1 目录,至此,我们可以开始正式的配置了。

2.2 配置 Hadoop

2.2.1 配置 PATH 环境变量

hadoop 的可执行文件在 hadoop-1.2.1/bin 下,我们如果想执行该文件,或者使用完整路径的方式,或者将该路径加入到 PATH 环境变量中,以后我们直接执行文件即可。

1
nano ~/.profile

在最后一行添加:

1
export PATH=$PATH:$HOME/hadoop/hadoop-1.2.1/bin

保存退出。然后应用该配置。

1
source ~/.profile

这里注意到有的教程提到的是修改 ~/.bashrc 文件。在很多情况下这是工作的,但是某些情况下则不能工作,因此Ubuntu 官网关于环境变量的配置 建议放在~/.profile文件中。

我们可以通过显示 hadoop 的版本来判断之前的配置是否正确。

1
hadoop version

2.2.2 配置 *-site.xml

之前的配置一直是环境配置,现在才是真正的 Hadoop 相关的配置。对于单节点伪分布模式,配置非常简单,我们只需要修改三个 *-site.xml 文件即可。默认情况下,这三个文件都包含一个空的<configuration> ,在这里,我们需要为三个文件的<configuration>中加入对应的配置。

为方便起见,我们将当前目录换到 conf 目录下:

1
cd hadoop-1.2.1/conf

core-site.xml:

1
nano core-site.xml

<configuration>中加入:

1
2
3
4
5
6
7
8
    <property>
        <name>fs.default.name</name>
        <value>hdfs://hadoop-master:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>${user.home}/hadoop/tmp</value>
    </property>
  • fs.default.name: 通过这里指定 NameNode 的位置。我们可以在这里手动指定端口号,也可以忽略以使用默认的端口号。
  • hadoop.tmp.dir:Hadoop 临时文件的位置,默认是 /tmp。这里如果不设置 hadoop.tmp.dir,Hadoop 是可以正常运行的。但由于使用的是 /tmp 目录,即内存,这显然不符合大容量存储的意图,而且数据也会随着关机而丢失。因此,我们需要将目录指定到硬盘上的位置。在这里,我们使用了 ${user.home} 变量,该变量代表的是用户主目录 $HOME这个目录需要记住,因为后续排障过程中,可能会需要到这个目录中检查 current/VERSION 文件的namespaceID以及storageID等。

hdfs-site.xml:

默认的情况下,dfs.replication,也就是数据块默认副本份数,是3份。由于这里是单节点的伪分布模式,只存在一个 DataNode,因此,数据只可能有1份,所以我们需要将其修改为1。

1
nano hdfs-site.xml

<configuration>中加入:

1
2
3
4
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>

mapred-site.xml:

1
nano mapred-site.xml

<configuration>中加入:

1
2
3
4
    <property>
        <name>mapred.job.tracker</name>
        <value>hadoop-master:9001</value>
    </property>

分别保存退出。

三、操作伪分布集群

3.1 格式化 NameNode

在配置完成后,我们需要进行一次 NameNode 的格式化。如果未格式化,NameNode 会因 HDFS 所需的数据结构错误而无法启动。

1
hadoop namenode -format

格式化之后,应该会出现与下面相似的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
14/02/18 19:38:16 INFO namenode.NameNode: STARTUP_MSG: 
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG:   host = hadoop-master/10.0.1.110
STARTUP_MSG:   args = [-format]
STARTUP_MSG:   version = 1.2.1
STARTUP_MSG:   build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.2 -r 1503152; compiled by 'mattf' on Mon Jul 22 15:23:09 PDT 2013
STARTUP_MSG:   java = 1.7.0_51
************************************************************/
14/02/18 19:38:16 INFO util.GSet: Computing capacity for map BlocksMap
14/02/18 19:38:16 INFO util.GSet: VM type       = 64-bit
14/02/18 19:38:16 INFO util.GSet: 2.0% max memory = 1013645312
14/02/18 19:38:16 INFO util.GSet: capacity      = 2^21 = 2097152 entries
14/02/18 19:38:16 INFO util.GSet: recommended=2097152, actual=2097152
14/02/18 19:38:16 INFO namenode.FSNamesystem: fsOwner=tao
14/02/18 19:38:17 INFO namenode.FSNamesystem: supergroup=supergroup
14/02/18 19:38:17 INFO namenode.FSNamesystem: isPermissionEnabled=true
14/02/18 19:38:17 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100
14/02/18 19:38:17 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s)
14/02/18 19:38:17 INFO namenode.FSEditLog: dfs.namenode.edits.toleration.length = 0
14/02/18 19:38:17 INFO namenode.NameNode: Caching file names occuring more than 10 times 
14/02/18 19:38:17 INFO common.Storage: Image file /home/tao/hadoop/tmp/dfs/name/current/fsimage of size 109 bytes saved in 0 seconds.
14/02/18 19:38:17 INFO namenode.FSEditLog: closing edit log: position=4, editlog=/home/tao/hadoop/tmp/dfs/name/current/edits
14/02/18 19:38:17 INFO namenode.FSEditLog: close success: truncate to 4, editlog=/home/tao/hadoop/tmp/dfs/name/current/edits
14/02/18 19:38:17 INFO common.Storage: Storage directory /home/tao/hadoop/tmp/dfs/name has been successfully formatted.
14/02/18 19:38:17 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at hadoop-master/10.0.1.110
************************************************************/

特别是关注其中是否报告格式化成功:

1
Storage directory /home/tao/hadoop/tmp/dfs/name has been successfully formatted.

如果没有,则需要根据错误信息进行分析。

至此,Hadoop 单节点伪分布模式就配置完毕了。

3.2 启动 Hadoop

1
start-all.sh

这条命令将根据之前配置的 *-site.xml,来启动 Hadoop 云(当然,此时,我们这个云是伪分布,就一个节点)。

然后,我们需要确定节点是否正常运行了。

1
jps

这条命令可以帮助我们查看当前系统运行的 Java 程序进程。如果配置正确,我们将看到类似下面的结果:

1
2
3
4
5
6
2613 Jps
2018 NameNode
2388 JobTracker
2143 DataNode
2514 TaskTracker
2290 SecondaryNameNode

需要注意的是,单节点伪分布正确运行后,应该会有5个组件运行:NameNodeDataNodeSecondaryNameNodeJobTracker、以及TaskTracker。缺少任何一个,都说明配置上有所错误。需要回去检查各项配置。

在出现故障后向论坛、朋友求助的时候,需要给对方提供你的 conf 目录下的配置文件、以及日志,否则对方无法理解你的故障可能的问题。日志目录:$HOME/hadoop/hadoop-1.2.1/logs

3.3 运行示例程序

就如同我们搭建好其它语言的编译环境后,会编写一个 HelloWorld 程序来测试整个环境是否工作一样,在 Hadoop 中,我们有自己的HelloWorld类的程序,叫做WordCount

WordCount 是对纯文本进行单词出现次数统计的,为了使用 WordCount,我们需要先准备一些数据,也就是一些文本文件。这里,我们使用 古腾堡计划中的英文图书。

3.3.1 下载

1
2
3
mkdir -p ~/hadoop/data/book/download
cd ~/hadoop/data/book/download
wget -r -l 2 -H "http://www.gutenberg.org/robot/harvest?filetypes[]=txt&langs[]=en"

这里-l 2是只取 2 级,因此并没有下载很多书,大约有200本英文书籍,解压缩后大约 90MB 左右。,如果觉得数据量不够可以酌情增加一些。根据当前的网速,下载需要一段时间。下载完成后,会出现类似于:

1
2
3
FINISHED --2014-02-18 19:44:10--
Total wall clock time: 7m 42s
Downloaded: 204 files, 34M in 6m 39s (86.0 KB/s)

3.3.2 解压缩

1
for f in `find ~/hadoop/data/book/download -name *.zip` ; do unzip -j $f *.txt -d ~/hadoop/data/book/input; done

3.3.3 将书籍放到 HDFS 云

1
hadoop fs -put ~/hadoop/data/book/input /data/book/input

上传到云后,我们可以用过命令 hadoop fs -ls /data/book/input 来检查是否都已进入云了。

3.3.4 执行 WordCount 示例程序

1
hadoop jar ~/hadoop/hadoop-1.2.1/hadoop-examples-1.2.1.jar wordcount /data/book/input /data/book/output

在执行过程中,可以新开一个 SSH 终端窗口连接到 hadoop-master,然后运行命令 htop 来观察任务执行期间的节点负载情况,包括内存占用率、CPU占用率、最消耗资源的程序等等。这些信息将来可能会作为云性能优化调整的依据。

执行结束后,会输出下面类似的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
14/02/18 20:26:29 INFO input.FileInputFormat: Total input paths to process : 201
14/02/18 20:26:29 INFO util.NativeCodeLoader: Loaded the native-hadoop library
14/02/18 20:26:29 WARN snappy.LoadSnappy: Snappy native library not loaded
14/02/18 20:26:30 INFO mapred.JobClient: Running job: job_201402190610_0002
14/02/18 20:26:31 INFO mapred.JobClient:  map 0% reduce 0%
14/02/18 20:26:42 INFO mapred.JobClient:  map 1% reduce 0%
14/02/18 20:26:45 INFO mapred.JobClient:  map 2% reduce 0%
...
14/02/18 20:30:32 INFO mapred.JobClient:  map 99% reduce 32%
14/02/18 20:30:34 INFO mapred.JobClient:  map 100% reduce 32%
14/02/18 20:30:40 INFO mapred.JobClient:  map 100% reduce 100%
14/02/18 20:30:41 INFO mapred.JobClient: Job complete: job_201402190610_0002
14/02/18 20:30:41 INFO mapred.JobClient: Counters: 29
14/02/18 20:30:41 INFO mapred.JobClient:   Job Counters 
14/02/18 20:30:41 INFO mapred.JobClient:     Launched reduce tasks=1
14/02/18 20:30:41 INFO mapred.JobClient:     SLOTS_MILLIS_MAPS=451625
14/02/18 20:30:41 INFO mapred.JobClient:     Total time spent by all reduces waiting after reserving slots (ms)=0
14/02/18 20:30:41 INFO mapred.JobClient:     Total time spent by all maps waiting after reserving slots (ms)=0
14/02/18 20:30:41 INFO mapred.JobClient:     Launched map tasks=201
14/02/18 20:30:41 INFO mapred.JobClient:     Data-local map tasks=201
14/02/18 20:30:41 INFO mapred.JobClient:     SLOTS_MILLIS_REDUCES=228055
14/02/18 20:30:41 INFO mapred.JobClient:   File Output Format Counters 
14/02/18 20:30:41 INFO mapred.JobClient:     Bytes Written=8206570
14/02/18 20:30:41 INFO mapred.JobClient:   FileSystemCounters
14/02/18 20:30:41 INFO mapred.JobClient:     FILE_BYTES_READ=41640360
14/02/18 20:30:41 INFO mapred.JobClient:     HDFS_BYTES_READ=92553354
14/02/18 20:30:41 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=90941789
14/02/18 20:30:41 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=8206570
14/02/18 20:30:41 INFO mapred.JobClient:   File Input Format Counters 
14/02/18 20:30:41 INFO mapred.JobClient:     Bytes Read=92529611
14/02/18 20:30:41 INFO mapred.JobClient:   Map-Reduce Framework
14/02/18 20:30:41 INFO mapred.JobClient:     Map output materialized bytes=37792708
14/02/18 20:30:41 INFO mapred.JobClient:     Map input records=1868098
14/02/18 20:30:41 INFO mapred.JobClient:     Reduce shuffle bytes=37792708
14/02/18 20:30:41 INFO mapred.JobClient:     Spilled Records=5323388
14/02/18 20:30:41 INFO mapred.JobClient:     Map output bytes=151082969
14/02/18 20:30:41 INFO mapred.JobClient:     Total committed heap usage (bytes)=27599167488
14/02/18 20:30:41 INFO mapred.JobClient:     CPU time spent (ms)=251850
14/02/18 20:30:41 INFO mapred.JobClient:     Combine input records=15649835
14/02/18 20:30:41 INFO mapred.JobClient:     SPLIT_RAW_BYTES=23743
14/02/18 20:30:41 INFO mapred.JobClient:     Reduce input records=2528771
14/02/18 20:30:41 INFO mapred.JobClient:     Reduce input groups=561390
14/02/18 20:30:41 INFO mapred.JobClient:     Combine output records=2636459
14/02/18 20:30:41 INFO mapred.JobClient:     Physical memory (bytes) snapshot=36463890432
14/02/18 20:30:41 INFO mapred.JobClient:     Reduce output records=561390
14/02/18 20:30:41 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=218530009088
14/02/18 20:30:41 INFO mapred.JobClient:     Map output records=15542147

如果有错误,会有异常报错。执行下面的命令确定正常执行完毕:

1
hadoop fs -ls /data/book/output/

该命令会列出我们指定的HDFS云中的输出目录内容:

1
2
3
4
Found 3 items
-rw-r--r--   1 tao supergroup          0 2014-02-18 20:30 /data/book/output/_SUCCESS
drwxr-xr-x   - tao supergroup          0 2014-02-18 20:26 /data/book/output/_logs
-rw-r--r--   1 tao supergroup    8206570 2014-02-18 20:30 /data/book/output/part-r-00000

注意其中若存在 _SUCCESS 文件,即说明执行成功了。统计的结果就在 part-r-xxxxx 这类文件里。可以拷贝到本地查看其内容,也可以通过 http://hadoop-master:50070 的 Web 界面来查看其内容。

3.4 停止 Hadoop

我们知道了怎么启动 Hadoop 云;知道了怎么运行 Hadoop 程序;接下来我们需要停止 Hadoop 云:

1
stop-all.sh

可以通过 jps 确定一下确实都关闭了。如果需要关机,则执行 sudo poweroff 即可。

【该文档最新版本请查看: http://twang2218.github.io/tutorial/hadoop-install/hadoop1-single-node-install-guide.html