如何在Ubuntu20.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 20.04 服务器:您可以在我们的 使用 Ubuntu 20.04 的初始服务器设置指南中了解有关如何设置具有这些权限的用户的更多信息。
您可能还想看看 An Introduction to Big Data Concepts and Terminology 或 An Introduction to Hadoop
完成先决条件后,以 sudo
用户身份登录即可开始。
第 1 步 — 安装 Java
首先,您将更新我们的软件包列表并安装 OpenJDK,这是 Ubuntu 20.04 上的默认 Java 开发工具包:
sudo apt update sudo apt install default-jdk
安装完成后,让我们检查一下版本。
java -version
Outputopenjdk version "11.0.13" 2021-10-19 OpenJDK Runtime Environment (build 11.0.13+8-Ubuntu-0ubuntu1.20.04) OpenJDK 64-Bit Server VM (build 11.0.13+8-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)
此输出验证 OpenJDK 是否已成功安装。
第 2 步 — 安装 Hadoop
使用 Java 后,您将访问 Apache Hadoop 版本页面 以查找最新的稳定版本。
导航到您要安装的版本的 binary。 在本指南中,您将安装 Hadoop 3.3.1,但您可以将本指南中的版本号替换为您选择的版本号。
在下一页上,右键单击并将链接复制到发布二进制文件。
在服务器上,您将使用 wget
来获取它:
wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz
注意: Apache 网站会动态引导你到最好的镜像,所以你的 URL 可能与上面的 URL 不匹配。
为了确保您下载的文件未被更改,您将使用 SHA-512 或安全哈希算法 512 进行快速检查。 返回 发布页面 ,然后右键单击并将链接复制到您下载的发布二进制文件的校验和文件:
同样,您将在我们的服务器上使用 wget
来下载文件:
wget https://downloads.apache.org/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz.sha512
然后运行验证:
shasum -a 512 hadoop-3.3.1.tar.gz
Output2fd0bf74852c797dc864f373ec82ffaa1e98706b309b30d1effa91ac399b477e1accc1ee74d4ccbb1db7da1c5c541b72e4a834f131a99f2814b030fbd043df66 hadoop-3.3.1.tar.gz
将此值与 .sha512
文件中的 SHA-512 值进行比较:
cat hadoop-3.3.1.tar.gz.sha512
~/hadoop-3.3.1.tar.gz.sha512
... SHA512 (hadoop-3.3.1.tar.gz) = 2fd0bf74852c797dc864f373ec82ffaa1e98706b309b30d1effa91ac399b477e1accc1ee74d4ccbb1db7da1c5c541b72e4a834f131a99f2814b030fbd043df66 ...
针对从镜像下载的文件运行的命令的输出应该与从 apache.org 下载的文件中的值匹配。
现在您已经验证文件没有损坏或更改,您可以提取它:
tar -xzvf hadoop-3.3.1.tar.gz
使用带有 -x
标志的 tar
命令进行提取,使用 -z
进行解压缩,使用 -v
进行详细输出,使用 -f
指定您正在从文件中提取。
最后,您将提取的文件移动到 /usr/local
,这是本地安装软件的适当位置:
sudo mv hadoop-3.3.1 /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= export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/ . . .
选项 2:使用 Readlink 动态设置值
/usr/local/hadoop/etc/hadoop/hadoop-env.sh
. . . #export JAVA_HOME= export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::") . . .
如果找不到这些行,请使用 CTRL+W
快速搜索文本。 完成后,使用 CTRL+X
退出并保存文件。
注意: 对于 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 程序来确保 Hadoop 正常运行。 为此,在我们的主目录中创建一个名为 input
的目录,并将 Hadoop 的配置文件复制到其中以将这些文件用作我们的数据。
mkdir ~/input cp /usr/local/hadoop/etc/hadoop/*.xml ~/input
接下来,您可以使用以下命令运行 MapReduce hadoop-mapreduce-examples
程序,这是一个带有多个选项的 Java 存档:
/usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar grep ~/input ~/grep_example 'allowed[.]*'
这将调用 grep
程序,这是 hadoop-mapreduce-examples
中包含的众多示例之一,然后是输入目录 input
和输出目录 grep_example
。 MapReduce grep 程序将计算文字词或正则表达式的匹配。 最后,给出正则表达式 allowed[.]*
以在陈述句内或结尾处查找单词 allowed
的出现。 该表达式区分大小写,因此如果该词在句首大写,您将找不到该词。
任务完成后,它会提供已处理内容和遇到的错误的摘要,但这不包含实际结果。
Output . . . File System Counters FILE: Number of bytes read=1200956 FILE: Number of bytes written=3656025 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=114 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)=41 Total committed heap usage (bytes)=403800064 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/*
Output22 allowed. 1 allowed
MapReduce 任务发现单词 allowed
出现了 19 次,后面跟着一个句点,还有一次没有出现。 运行示例程序已验证我们的独立安装工作正常,并且系统上的非特权用户可以运行 Hadoop 进行探索或调试。
结论
在本教程中,您以独立模式安装了 Hadoop,并通过运行它提供的示例程序对其进行了验证。 要了解如何编写您自己的 MapReduce 程序,您可能需要访问 Apache Hadoop 的 MapReduce 教程,该教程介绍了示例背后的代码。 当您准备好设置集群时,请参阅 Apache Foundation Hadoop Cluster Setup 指南。
如果您有兴趣部署一个完整的集群而不仅仅是一个独立的集群,请参阅 如何使用 DigitalOcean Droplets 启动 Hadoop 集群。