介绍
Hadoop 是一个基于 Java 的编程框架,支持在一组廉价机器的集群上处理和存储极其大型的数据集。它是大数据领域中第一个重要的开源项目,并得到 Apache 软件基金会的赞助。
Hadoop 2.7 由四个主要层组成:
- Hadoop Common 是支持其他 Hadoop 模块的实用程序和库的集合。
- HDFS,即 Hadoop 分布式文件系统,负责将数据持久化到磁盘。
- YARN,全称为 Yet Another Resource Negotiator,是 HDFS 的“操作系统”。
- MapReduce 是 Hadoop 集群的原始处理模型。它在集群内分发工作或映射,然后将节点的结果组织和减少为对查询的响应。在 Hadoop 2.x 版本中还有许多其他处理模型可用。
Hadoop 集群相对复杂,因此该项目包括一个独立模式,适用于学习 Hadoop、执行简单操作和调试。
在本教程中,我们将在独立模式下安装 Hadoop,并运行其中包含的一个示例 MapReduce 程序来验证安装。
先决条件
要按照本教程操作,您需要:
- 一个具有
sudo
权限的非 root 用户的 Ubuntu 16.04 服务器:您可以在我们的《在 Ubuntu 16.04 上进行初始服务器设置》指南中了解如何设置具有这些权限的用户。
完成这些先决条件后,您就可以安装 Hadoop 及其依赖项了。
在开始之前,您可能还想看看《大数据概念和术语简介》或《Hadoop 简介》。
步骤 1 — 安装 Java
首先,我们将更新软件包列表:
sudo apt-get update
接下来,我们将安装 OpenJDK,这是 Ubuntu 16.04 上的默认 Java 开发工具包。
sudo apt-get install default-jdk
安装完成后,让我们来检查版本。
java -version
openjdk version "1.8.0_91" OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~16.04.1-b14) OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
此输出验证了 OpenJDK 已成功安装。
步骤 2 — 安装 Hadoop
有了 Java,我们将访问 Apache Hadoop 发行版页面,找到最新的稳定版本。跟随当前版本的二进制链接:
!Hadoop 发行版页面的屏幕截图,突出显示镜像页面的链接
在下一个页面,右键单击并复制最新稳定版本二进制文件的链接。
!Hadoop 发行版页面的屏幕截图,突出显示最新稳定版本二进制文件的链接
在服务器上,我们将使用 wget
来获取它:
wget http://apache.mirrors.tds.net/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz
为了确保我们下载的文件没有被篡改,我们将使用 SHA-256 进行快速检查。返回发布页面,然后跟随 Apache 链接:
!突出显示 .mds 文件的屏幕截图
进入您下载的版本的目录:
!突出显示 .mds 文件的屏幕截图
最后,找到您下载的版本对应的 .mds
文件,然后复制相应文件的链接:
!突出显示 .mds 文件的屏幕截图
同样,右键单击复制文件位置,然后使用 wget
传输文件:
wget https://dist.apache.org/repos/dist/release/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz.mds
然后运行验证:
shasum -a 256 hadoop-2.7.3.tar.gz
d489df3808244b906eb38f4d081ba49e50c4603db03efd5e594a1e98b09259c2 hadoop-2.7.3.tar.gz
将此值与 .mds
文件中的 SHA-256 值进行比较:
cat hadoop-2.7.3.tar.gz.mds
... hadoop-2.7.3.tar.gz: SHA256 = D489DF38 08244B90 6EB38F4D 081BA49E 50C4603D B03EFD5E 594A1E98 B09259C2 ...
您可以安全地忽略大小写和空格的差异。我们从镜像下载的文件运行的命令的输出应该与我们从 apache.org 下载的文件中的值匹配。
现在我们已经验证了文件没有被损坏或更改,我们将使用 tar
命令和 -x
标志来提取,-z
来解压缩,-v
用于详细输出,-f
用于指定我们正在从文件中提取。使用制表符补全或在下面的命令中替换正确的版本号:
tar -xzvf hadoop-2.7.3.tar.gz
最后,我们将提取的文件移动到 /usr/local
,这是本地安装软件的适当位置。如果需要,更改版本号以匹配您下载的版本。
sudo mv hadoop-2.7.3 /usr/local/hadoop
软件安装完成后,我们准备配置其环境。
步骤 3 — 配置 Hadoop 的 Java Home
Hadoop 要求您设置 Java 的路径,可以作为环境变量或在 Hadoop 配置文件中设置。
Java 的路径 /usr/bin/java
是一个符号链接,指向 /etc/alternatives/java
,而后者又是默认 Java 二进制文件的符号链接。我们将使用 readlink
命令和 -f
标志来递归地跟随路径中的每个符号链接。然后,我们将使用 sed
命令从输出中修剪 bin/java
,以获得 JAVA_HOME
的正确值。
查找默认的 Java 路径
readlink -f /usr/bin/java | sed "s:bin/java::"
/usr/lib/jvm/java-8-openjdk-amd64/jre/
您可以将此输出复制到 Hadoop 的 Java 主目录,以确保如果默认的 Java 更改,这个值也不会改变。另外,您也可以在文件中动态使用 readlink
命令,这样 Hadoop 将自动使用系统默认设置的 Java 版本。
首先,打开 hadoop-env.sh
文件:
sudo nano /usr/local/hadoop/etc/hadoop/hadoop-env.sh
然后,选择以下选项之一:
选项 1: 设置静态值
. . . #export JAVA_HOME=${JAVA_HOME} export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre/ . . .
选项 2: 使用 Readlink 动态设置值
. . . #export JAVA_HOME=${JAVA_HOME} export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::") . . .
步骤 4 — 运行 Hadoop
现在我们应该能够运行 Hadoop:
/usr/local/hadoop/bin/hadoop
Usage: hadoop [--config confdir] [COMMAND | CLASSNAME] CLASSNAME run the class named CLASSNAME or where COMMAND is one of: fs run a generic filesystem user client version print the version jar <jar> run a jar file note: please use "yarn jar" to launch YARN applications, not this command. checknative [-a|-h] check native hadoop and compression libraries availability distcp <srcurl> <desturl> copy file or directories recursively archive -archiveName NAME -p <parent path> <src>* <dest> create a hadoop archive classpath prints the class path needed to get the credential interact with credential providers Hadoop jar and the required libraries daemonlog get/set the log level for each daemon
这意味着我们已成功配置 Hadoop 以在独立模式下运行。我们将通过运行它附带的示例 MapReduce 程序来确保它正常运行。为此,在我们的主目录中创建一个名为 input
的目录,并将 Hadoop 的配置文件复制到其中,以便将这些文件用作我们的数据。
mkdir ~/input cp /usr/local/hadoop/etc/hadoop/*.xml ~/input
接下来,我们可以使用以下命令来运行 MapReduce hadoop-mapreduce-examples
程序,这是一个带有多个选项的 Java 存档。我们将调用它的 grep
程序之一,hadoop-mapreduce-examples
中包含了许多示例之一,接着是输入目录 input
和输出目录 grep_example
。MapReduce 的 grep 程序将计算文字或正则表达式的匹配次数。最后,我们将提供一个正则表达式,以查找在陈述句中出现的单词 principal
。该表达式区分大小写,因此如果单词在句子开头大写,我们将找不到它:
/usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep ~/input ~/grep_example 'principal[.]*'
任务完成后,它会提供已处理的摘要和遇到的错误,但这不包含实际结果。
. . . File System Counters FILE: Number of bytes read=1247674 FILE: Number of bytes written=2324248 FILE: Number of read operations=0 FILE: Number of large read operations=0 FILE: Number of write operations=0 Map-Reduce Framework Map input records=2 Map output records=2 Map output bytes=37 Map output materialized bytes=47 Input split bytes=114 Combine input records=0 Combine output records=0 Reduce input groups=2 Reduce shuffle bytes=47 Reduce input records=2 Reduce output records=2 Spilled Records=4 Shuffled Maps =1 Failed Shuffles=0 Merged Map outputs=1 GC time elapsed (ms)=61 Total committed heap usage (bytes)=263520256 Shuffle Errors BAD_ID=0 CONNECTION=0 IO_ERROR=0 WRONG_LENGTH=0 WRONG_MAP=0 WRONG_REDUCE=0 File Input Format Counters Bytes Read=151 File Output Format Counters Bytes Written=37
结果存储在输出目录中,可以通过在输出目录上运行 cat
命令来检查:
cat ~/grep_example/*
6 principal 1 principal.
MapReduce 任务找到了一个带有句点的单词 principal
的出现次数,以及六个没有句点的出现次数。运行示例程序验证了我们的独立安装是否正常工作,并且系统上的非特权用户可以运行 Hadoop 进行探索或调试。
结论
在本教程中,我们已经以独立模式安装了 Hadoop,并通过运行它提供的示例程序进行了验证。要学习如何编写自己的 MapReduce 程序,您可能希望访问 Apache Hadoop 的 MapReduce 教程,该教程将详细介绍示例背后的代码。当您准备好设置集群时,请参阅 Apache Foundation Hadoop 集群设置指南。