如何在Ubuntu18.04上以单机模式安装Hadoop
介绍
Hadoop 是一个基于 Java 的编程框架,支持在廉价机器集群上处理和存储超大型数据集。 它是大数据领域的第一个主要开源项目,由 Apache 软件基金会赞助。
Hadoop由四个主要层组成:
- Hadoop Common 是支持其他 Hadoop 模块的实用程序和库的集合。
- HDFS,代表 Hadoop 分布式文件系统,负责将数据持久化到磁盘。
- YARN 是 Yet Another Resource Negotiator 的缩写,是 HDFS 的“操作系统”。
- MapReduce是Hadoop集群的原始处理模型。 它在集群或地图中分配工作,然后将来自节点的结果组织并减少为对查询的响应。 许多其他处理模型可用于 Hadoop 3.x 版本。
Hadoop集群搭建起来比较复杂,所以项目包含一个单机模式,适合学习Hadoop、进行简单操作和调试。
在本教程中,我们将以独立模式安装 Hadoop 并运行其中包含的示例示例 MapReduce 程序之一以验证安装。
先决条件
要遵循本教程,您将需要:
- 具有 sudo 权限的非 root 用户的 Ubuntu 18.04 服务器:您可以在我们的 使用 Ubuntu 18.04 的初始服务器设置指南中了解有关如何设置具有这些权限的用户的更多信息。
完成此先决条件后,您就可以安装 Hadoop 及其依赖项了。
在开始之前,您可能还想看看 大数据概念和术语简介 或 Hadoop 简介
第 1 步 — 安装 Java
首先,我们将更新我们的包列表:
sudo apt update
接下来,我们将安装 OpenJDK,这是 Ubuntu 18.04 上的默认 Java 开发工具包:
sudo apt install default-jdk
安装完成后,让我们检查一下版本。
java -version
Outputopenjdk 10.0.1 2018-04-17 OpenJDK Runtime Environment (build 10.0.1+10-Ubuntu-3ubuntu1) OpenJDK 64-Bit Server VM (build 10.0.1+10-Ubuntu-3ubuntu1, mixed mode)
此输出验证 OpenJDK 是否已成功安装。
第 2 步 — 安装 Hadoop
使用 Java 后,我们将访问 Apache Hadoop 版本页面 以查找最新的稳定版本。
导航到您要安装的版本的 binary。 在本指南中,我们将安装 Hadoop 3.0.3。
在下一页上,右键单击并将链接复制到发布二进制文件。
在服务器上,我们将使用 wget
来获取它:
wget http://www-us.apache.org/dist/hadoop/common/hadoop-3.0.3/hadoop-3.0.3.tar.gz
注意: Apache 网站会动态引导你到最好的镜像,所以你的 URL 可能与上面的 URL 不匹配。
为了确保我们下载的文件没有被更改,我们将使用 SHA-256 进行快速检查。 返回 发布页面 ,然后右键单击并将链接复制到您下载的发布二进制文件的校验和文件:
同样,我们将在我们的服务器上使用 wget
来下载文件:
wget https://dist.apache.org/repos/dist/release/hadoop/common/hadoop-3.0.3/hadoop-3.0.3.tar.gz.mds
然后运行验证:
shasum -a 256 hadoop-3.0.3.tar.gz
Outputdb96e2c0d0d5352d8984892dfac4e27c0e682d98a497b7e04ee97c3e2019277a hadoop-3.0.3.tar.gz
将此值与 .mds
文件中的 SHA-256 值进行比较:
cat hadoop-3.0.3.tar.gz.mds
~/hadoop-3.0.3.tar.gz.mds
... /build/source/target/artifacts/hadoop-3.0.3.tar.gz: SHA256 = DB96E2C0 D0D5352D 8984892D FAC4E27C 0E682D98 A497B7E0 4EE97C3E 2019277A ...
您可以放心地忽略大小写和空格的差异。 我们针对从镜像下载的文件运行的命令的输出应该与我们从 apache.org 下载的文件中的值匹配。
现在我们已经验证文件没有损坏或更改,我们将使用带有 -x
标志的 tar
命令进行解压缩,-z
进行解压缩,[ X160X] 用于详细输出,-f
用于指定我们从文件中提取。 使用制表符补全或在以下命令中替换正确的版本号:
tar -xzvf hadoop-3.0.3.tar.gz
最后,我们将提取的文件移动到 /usr/local
,这是本地安装软件的适当位置。 如果需要,更改版本号以匹配您下载的版本。
sudo mv hadoop-3.0.3 /usr/local/hadoop
有了软件,我们就可以配置它的环境了。
第 3 步 — 配置 Hadoop 的 Java 主页
Hadoop 要求您将 Java 的路径设置为环境变量或在 Hadoop 配置文件中。
Java 的路径 /usr/bin/java
是 /etc/alternatives/java
又是默认 Java 二进制文件的符号链接。 我们将使用带有 -f
标志的 readlink
递归地跟踪路径每个部分中的每个符号链接。 然后,我们将使用 sed
从输出中修剪 bin/java
,从而为我们提供 JAVA_HOME
的正确值。
查找默认 Java 路径
readlink -f /usr/bin/java | sed "s:bin/java::"
Output/usr/lib/jvm/java-11-openjdk-amd64/
您可以复制此输出以将 Hadoop 的 Java 主页设置为此特定版本,这可确保如果默认 Java 更改,此值不会更改。 或者,您可以在文件中动态使用 readlink
命令,这样 Hadoop 将自动使用设置为系统默认值的任何 Java 版本。
首先,打开 hadoop-env.sh
:
sudo nano /usr/local/hadoop/etc/hadoop/hadoop-env.sh
然后,选择以下选项之一:
选项 1:设置静态值
/usr/local/hadoop/etc/hadoop/hadoop-env.sh
. . . #export JAVA_HOME=${JAVA_HOME} export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/ . . .
选项 2:使用 Readlink 动态设置值
/usr/local/hadoop/etc/hadoop/hadoop-env.sh
. . . #export JAVA_HOME=${JAVA_HOME} export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::") . . .
注意: 对于 Hadoop,hadoop-env.sh
中的 JAVA_HOME
的值会覆盖环境中由 /etc/profile
或用户配置文件中设置的任何值.
第 4 步 — 运行 Hadoop
现在我们应该能够运行 Hadoop:
/usr/local/hadoop/bin/hadoop
OutputUsage: hadoop [OPTIONS] SUBCOMMAND [SUBCOMMAND OPTIONS] or hadoop [OPTIONS] CLASSNAME [CLASSNAME OPTIONS] where CLASSNAME is a user-provided Java class OPTIONS is none or any of: --config dir Hadoop config directory --debug turn on shell script debug mode --help usage information buildpaths attempt to add class files from build tree hostnames list[,of,host,names] hosts to use in slave mode hosts filename list of hosts to use in slave mode loglevel level set the log4j level for this command workers turn on worker mode SUBCOMMAND is one of: . . .
帮助意味着我们已经成功地将 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 程序将计算文字词或正则表达式的匹配。 最后,我们将提供正则表达式 allowed[.]*
来查找单词 allowed
在陈述句内或结尾处的出现。 该表达式区分大小写,因此如果它在句首大写,我们将找不到该词:
/usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.3.jar grep ~/input ~/grep_example 'allowed[.]*'
任务完成后,它会提供已处理内容和遇到的错误的摘要,但这不包含实际结果。
Output . . . File System Counters FILE: Number of bytes read=1330690 FILE: Number of bytes written=3128841 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=33 Map output materialized bytes=43 Input split bytes=115 Combine input records=0 Combine output records=0 Reduce input groups=2 Reduce shuffle bytes=43 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)=3 Total committed heap usage (bytes)=478150656 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=147 File Output Format Counters Bytes Written=34
注意:如果输出目录已经存在,程序将失败,而不是看到摘要,输出将类似于:
Output . . . at java.base/java.lang.reflect.Method.invoke(Method.java:564) at org.apache.hadoop.util.RunJar.run(RunJar.java:244) at org.apache.hadoop.util.RunJar.main(RunJar.java:158)
结果存储在输出目录中,可以通过在输出目录上运行 cat
来检查:
cat ~/grep_example/*
Output19 allowed. 1 allowed
MapReduce 任务发现单词 allowed
出现了 19 次,后面跟着一个句点,还有一次没有出现。 运行示例程序已验证我们的独立安装工作正常,并且系统上的非特权用户可以运行 Hadoop 进行探索或调试。
结论
在本教程中,我们以独立模式安装了 Hadoop,并通过运行它提供的示例程序对其进行了验证。 要了解如何编写您自己的 MapReduce 程序,您可能需要访问 Apache Hadoop 的 MapReduce 教程,该教程介绍了示例背后的代码。 当您准备好设置集群时,请参阅 Apache Foundation Hadoop Cluster Setup 指南。