介绍
Hadoop是一个基于Java的编程框架,支持在一组廉价机器上处理和存储极大数据集,这是大数据游戏领域的第一个主要开源项目,由Apache软件基金会赞助。
Hadoop 由四个主要层组成:
- Hadoop Common 是支持其他 Hadoop 模块的实用程序和库的集合。
- HDFS ,即Hadoop 分布式文件系统,负责将数据存储到磁盘上。
- YARN ,简称 Yet Another Resource Negotiator,是 HDFS 的
操作系统
。 - MapReduce 是 Hadoop 集群的原始处理模型。
Hadoop 集群是相对复杂的设置,所以该项目包括一个独立的模式,适合学习有关 Hadoop,执行简单操作和调试。
在本教程中,我们将在独立模式下安装Hadoop,并运行其中一个示例MapReduce程序,以验证安装。
前提条件
要遵循本教程,您将需要:
- ** 具有
sudo
特权的非根用户的 Ubuntu 18.04 服务器:您可以在我们的 [Ubuntu 18.04 初始服务器设置] 指南中了解有关如何设置具有这些特权的用户的更多信息。
一旦您完成了此前提条件,您就可以安装 Hadoop 及其依赖。
在您开始之前,您可能还想看看 大数据概念和术语的介绍或 Hadoop的介绍
第1步:安装Java
为了开始,我们将更新我们的包列表:
1sudo apt update
接下来,我们将安装在 Ubuntu 18.04 上默认的 Java 开发套件 OpenJDK:
1sudo apt install default-jdk
安装完成后,让我们检查版本。
1java -version
1[secondary_label Output]
2openjdk 10.0.1 2018-04-17
3OpenJDK Runtime Environment (build 10.0.1+10-Ubuntu-3ubuntu1)
4OpenJDK 64-Bit Server VM (build 10.0.1+10-Ubuntu-3ubuntu1, mixed mode)
此输出验证了 OpenJDK 已成功安装。
第2步:安装Hadoop
有了 Java,我们将访问 Apache Hadoop 发布页面以找到最新的稳定版本。
在此指南中,我们将安装 Hadoop 3.0.3.
在下一页上,右键单击并复制释放二进制的链接。
在服务器上,我们将使用wget
来检索它:
1wget http://www-us.apache.org/dist/hadoop/common/hadoop-3.0.3/hadoop-3.0.3.tar.gz
<$>[注] 注: Apache网站将动态引导您到最佳镜子,因此您的URL可能不匹配上面的URL。
为了确保我们下载的文件没有被更改,我们将使用 SHA-256 进行快速检查。 返回 发布页面,然后右键单击并复制您下载的发布二进制文件的检查总和文件的链接:
再次,我们会在我们的服务器上使用wget
来下载该文件:
1wget https://dist.apache.org/repos/dist/release/hadoop/common/hadoop-3.0.3/hadoop-3.0.3.tar.gz.mds
然后运行验证:
1shasum -a 256 hadoop-3.0.3.tar.gz
1[secondary_label Output]
2db96e2c0d0d5352d8984892dfac4e27c0e682d98a497b7e04ee97c3e2019277a hadoop-3.0.3.tar.gz
将此值与.mds 文件中的 SHA-256 值进行比较:
1cat hadoop-3.0.3.tar.gz.mds
1[label ~/hadoop-3.0.3.tar.gz.mds]
2...
3/build/source/target/artifacts/hadoop-3.0.3.tar.gz:
4SHA256 = DB96E2C0 D0D5352D 8984892D FAC4E27C 0E682D98 A497B7E0 4EE97C3E 2019277A
5...
您可以安全地忽略案例和空格的差异. 对我们从镜子下载的文件进行的命令的输出应匹配我们从apache.org下载的文件中的值。
现在我们已经验证了该文件没有被破坏或更改,我们将使用tar
命令与-x
标志提取,-z
解压缩,-v
用于语音输出,和-f
来指定我们正在从一个文件中提取。
1tar -xzvf hadoop-3.0.3.tar.gz
最后,我们将将提取的文件移动到/usr/local
,适用于本地安装的软件。
1sudo mv hadoop-3.0.3 /usr/local/hadoop
有了软件,我们准备好配置它的环境。
步骤 3 — 配置 Hadoop 的 Java 主页
Hadoop 要求您将路径设置为 Java,无论是作为环境变量还是在 Hadoop 配置文件中。
通往Java的路径,‘/usr/bin/java’是对‘/etc/alternatives/java’的同义链接,这反过来又是对默认的Java二进制的同义链接。我们将用‘readlink’与‘-f’旗帜来追随路径的各个部分的每一个同义链接,然后,我们将用‘sed’从输出中切割‘bin/java’来给我们‘JAVA_HOME’的正确值。
寻找默认的Java路径
1readlink -f /usr/bin/java | sed "s:bin/java::"
1[secondary_label Output]
2/usr/lib/jvm/java-11-openjdk-amd64/
您可以复制此输出以将Hadoop的Java主页设置为此特定版本,这确保如果默认Java变更,此值将不会发生。
首先,打开hadoop-env.sh
:
1sudo nano /usr/local/hadoop/etc/hadoop/hadoop-env.sh
然后,选择下列选项之一:
选项1:设置静态值
1[label /usr/local/hadoop/etc/hadoop/hadoop-env.sh]
2 . . .
3#export JAVA_HOME=${JAVA_HOME}
4export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/
5 . . .
选项2:使用 Readlink 动态设置值
1[label /usr/local/hadoop/etc/hadoop/hadoop-env.sh]
2 . . .
3#export JAVA_HOME=${JAVA_HOME}
4export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
5 . . .
<$>[注]
注: 对于 Hadoop,在 hadoop-env.sh 中的
JAVA_HOME' 值取代了在环境中由 `/etc/profile’ 或在用户配置文件中设置的任何值。
第4步:运行Hadoop
现在我们应该能够运行Hadoop:
1/usr/local/hadoop/bin/hadoop
1[secondary_label Output]
2Usage: hadoop [OPTIONS] SUBCOMMAND [SUBCOMMAND OPTIONS]
3 or hadoop [OPTIONS] CLASSNAME [CLASSNAME OPTIONS]
4 where CLASSNAME is a user-provided Java class
5
6 OPTIONS is none or any of:
7
8--config dir Hadoop config directory
9--debug turn on shell script debug mode
10--help usage information
11buildpaths attempt to add class files from build tree
12hostnames list[,of,host,names] hosts to use in slave mode
13hosts filename list of hosts to use in slave mode
14loglevel level set the log4j level for this command
15workers turn on worker mode
16
17 SUBCOMMAND is one of:
18. . .
帮助意味着我们已经成功配置了Hadoop以运行独立模式,我们将通过运行其运行的示例MapReduce程序来确保它正常运作。
1mkdir ~/input
2cp /usr/local/hadoop/etc/hadoop/*.xml ~/input
接下来,我们可以使用以下命令来运行MapReduce的hadoop-mapreduce-examples
程序,一个具有多个选项的Java档案。我们将召唤其grep
程序,其中包括hadoop-mapreduce-examples
中的许多例子之一,然后是输入目录,input
和输出目录grep_example
。MapReduce grep程序会计算一个字母字或常规表达式的匹配。 最后,我们将提供允许(.]*
的常规表达式,以便在声明句中或句子结束时找到允许
字的发生。 这个表达式是案例敏感的,所以如果在句子开始时我们不会找到这个词:
1/usr/local/hadoop/bin/hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.3.jar grep ~/input ~/grep_example 'allowed[.]*'
当任务完成时,它提供了所处理的内容和遇到的错误的摘要,但不包含实际结果。
1[secondary_label Output]
2 . . .
3 File System Counters
4 FILE: Number of bytes read=1330690
5 FILE: Number of bytes written=3128841
6 FILE: Number of read operations=0
7 FILE: Number of large read operations=0
8 FILE: Number of write operations=0
9 Map-Reduce Framework
10 Map input records=2
11 Map output records=2
12 Map output bytes=33
13 Map output materialized bytes=43
14 Input split bytes=115
15 Combine input records=0
16 Combine output records=0
17 Reduce input groups=2
18 Reduce shuffle bytes=43
19 Reduce input records=2
20 Reduce output records=2
21 Spilled Records=4
22 Shuffled Maps =1
23 Failed Shuffles=0
24 Merged Map outputs=1
25 GC time elapsed (ms)=3
26 Total committed heap usage (bytes)=478150656
27 Shuffle Errors
28 BAD_ID=0
29 CONNECTION=0
30 IO_ERROR=0
31 WRONG_LENGTH=0
32 WRONG_MAP=0
33 WRONG_REDUCE=0
34 File Input Format Counters
35 Bytes Read=147
36 File Output Format Counters
37 Bytes Written=34
<$>[note] 注: 如果输出目录已经存在,程序将失败,而不是查看总结,输出将看起来像:
1[secondary_label Output]
2 . . .
3 at java.base/java.lang.reflect.Method.invoke(Method.java:564)
4 at org.apache.hadoop.util.RunJar.run(RunJar.java:244)
5 at org.apache.hadoop.util.RunJar.main(RunJar.java:158)
美元
结果存储在输出目录中,可以通过在输出目录上运行cat
来检查:
1cat ~/grep_example/*
1[secondary_label Output]
219 allowed.
31 allowed
MapReduce 任务发现了 19 个允许
一词的发生,然后是一个时间段和一个没有发生的发生,运行示例程序验证了我们的独立安装正常工作,并且系统上的非特权用户可以运行 Hadoop 进行探索或调试。
结论
在本教程中,我们在独立模式下安装了Hadoop,并通过运行其提供的示例程序来验证它。 要学习如何编写自己的MapReduce程序,您可能想访问Apache Hadoop的MapReduce教程(https://hadoop.apache.org/docs/stable/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html),该教程通过示例背后的代码。