在 Windows 上安装和运行 Hadoop 和 Spark
在 Windows 上安装和运行 Hadoop 和 Spark
获取软件
设置环境变量
配置 Hadoop
修补 Hadoop
启动 HDFS
测试 Hadoop 和 Spark
在 Windows 上安装和运行 Hadoop 和 Spark
我们最近在工作中获得了一台大型新服务器来运行 Hadoop 和 Spark(H/S),以便对我们为生物制药行业编写的一些软件进行概念验证测试,我在尝试在 Windows Server 2016/Windows 10 上启动和运行 H/S 时遇到了一些障碍。我在这里一步一步地记录了如何设法直接在 Windowscmd
提示符下安装和运行这对 Apache 产品,而无需任何 Linux 仿真。
2019 年 12 月 16 日更新:软件版本号已更新,文本已澄清。
获取软件
第一步是下载 Java、Hadoop 和 Spark。Spark 似乎无法与较新版本的 Java 兼容,因此我暂时坚持使用 Java 8:
我无法保证本指南适用于较新版本的 Java。如果您遇到问题,请尝试使用 Java 8。此外,由于新的 Oracle 许可结构(2019 及以上),您可能需要创建一个 Oracle 帐户才能下载 Java 8。为避免这种情况,请直接通过 AdoptOpenJDK 下载。
对于 Java,我下载了 AdoptOpenJDK HotSpot JVM 的“Windows x64”版本 ( jdk8u232-b09
);对于 Hadoop,我下载了 v3.1.3 的二进制版本 ( hadoop-3.1.3.tar.gz
);对于 Spark,我下载了 v3.0.0“针对 Apache Hadoop 2.7 及更高版本预构建”版本 ( spark-3.0.0-preview-bin-hadoop2.7.tgz
)。从现在开始,我将统称这些版本为hadoop-<version>
和spark-<version>
;在本教程的其余部分,请将这些版本替换为您的版本号。
尽管目前已有较新版本的 Hadoop 和 Spark 可用,但Windows 上的 Hadoop 3.2.1 存在一个错误,导致安装失败。在修补版本(3.3.0、3.1.4 或 3.2.2)可用之前,您必须在 Windows 上使用较早版本的 Hadoop。
接下来,下载 7-Zip来解压*gz
压缩包。请注意,您可能需要解压两次(第一次将文件移动*gz
到 到*.tar
,第二次解压)。解压完成后(Hadoop 解压需要一段时间),您可以删除所有*.tar
和*gz
文件。现在,您的 Downloads 目录中应该有两个目录和 JDK 安装程序:
请注意,如上所示,“Hadoop”目录和“Spark”目录分别包含LICENSE
、NOTICE
和README
三个文件。对于特定版本的 Hadoop,您可能会提取并得到类似这样的目录结构
C:\Users\<username>\Downloads\hadoop-<version>\hadoop-<version>\...
如果是这种情况,请将内层 目录的内容通过复制粘贴移动hadoop-<version>
到外层目录,然后删除内层目录。例如,该文件的路径应为:hadoop-<version>
hadoop-<version>
LICENSE
C:\Users\<username>\Downloads\hadoop-<version>\LICENSE
...与“Spark”目录类似。
警告:如果您在 7-Zip 中看到类似“无法创建符号链接:客户端不具备所需权限”的消息,则必须以管理员模式运行 7-Zip,然后解压目录。如果您跳过这些文件,可能会导致 Hadoop 安装失败。
将 Spark 和 Hadoop 目录移动到该C:\
目录中(您可能需要计算机的管理员权限才能执行此操作)。然后,运行 Java 安装程序,但将目标文件夹从默认文件夹更改为C:\Program Files\AdoptOpenJDK\jdk-<version>\
。C:\Java
(H/S 可能无法处理名称中带有空格的目录。)
安装完成后,您可以删除 Java*.msi
安装程序。创建两个名为C:\Hadoop
和的新目录,并将和目录分别C:\Spark
复制到这两个目录中:hadoop-<version>
spark-<version>
如果您收到“名称太长”类型的警告,请跳过这些文件。这些只是*.html
文件,对运行 H/S 并非至关重要。
设置环境变量
接下来,我们需要设置一些环境变量。前往Control Panel > System and Security > System > Advanced System Settings > Environment Variables...
:
...并添加新的系统变量(底部框),名为:
JAVA_HOME
-->C:\Java
HADOOP_HOME
-->C:\Hadoop\hadoop-<version>
SPARK_HOME
-->C:\Spark\spark-<version>
(根据您下载的Hadoop和Spark版本进行调整。)
然后,编辑Path
(再次在底部的系统变量框中)并添加\bin
附加的变量(也\sbin
适用于 Hadoop):
如果您现在echo %PATH%
在,cmd
您应该会在路径中间的某个位置看到这三个目录,因为用户路径已附加到%PATH
变量的系统路径。现在您应该检查java -version
、hdfs -version
和spark-shell --version
返回的版本号,如下所示。这意味着它们已正确安装并添加到您的%PATH%
:
请注意,如果您尝试从路径中包含任何空格的位置运行上述命令,则命令可能会失败。例如,如果您的用户名是“Firstname Lastname”,并且您尝试检查 Hadoop 版本,则可能会看到类似以下错误消息:
C:\Users\Firstname Lastname>hdfs -version
Error: Could not find or load main class Lastname
要解决此问题,只需移动到路径中没有任何空格的工作目录(正如我在上面的屏幕截图中所做的那样):
C:\Users\Firstname Lastname>cd ..
C:\Users>hdfs -version
openjdk version "1.8.0_232"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_232-b09)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.232-b09, mixed mode)
配置 Hadoop
接下来,转到%HADOOP_HOME%\etc\hadoop
并编辑(或创建)文件core-site.xml
,使其如下所示:
核心站点.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
在同一目录中,编辑(或创建)mapred-site.xml
以下内容:
mapred-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
接下来,编辑(或创建)hdfs-site.xml
:
hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///C:/Hadoop/hadoop-<version>/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///C:/Hadoop/hadoop-<version>/datanode</value>
</property>
</configuration>
是的,它们应该是正斜杠,即使 Windows 使用反斜杠。这是由于 Hadoop 解释这些文件路径的方式所致。另外,请确保将其替换<version>
为适当的 Hadoop 版本号。最后,将yarn-site.xml
其编辑如下:
纱线-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>
我们需要做的最后一件事是创建我们引用的目录hdfs-site.xml
:
修补 Hadoop
现在,您需要应用由用户 cdarlint 创建并发布到 GitHub 的补丁。(请注意,此补丁特定于您正在安装的 Hadoop 版本,但如果没有确切的版本,请尝试使用所需版本之前的版本……有时这种方法有效。)
备份您的%HADOOP_HOME%\bin
目录(将其复制到\bin.old
或类似位置),然后将修补的文件(特定于您的 Hadoop 版本,从上面的 git repo 下载)复制到旧%HADOOP_HOME%\bin
目录,用新文件替换旧文件。
现在,如果你运行hdfs namenode -format
,cmd
你应该会看到:
还有一件事要做:hadoop-yarn-server-timelineservice-<version>
从复制C:\Hadoop\hadoop-<version>\share\hadoop\yarn\timelineservice
到C:\Hadoop\hadoop-<version>\share\hadoop\yarn
(父目录)。(这些是短版本号,例如,并且文件名和目录名3.1.3
之间可能不匹配。)JAR
启动 HDFS
最后,您可以通过运行来start-dfs.cmd
启动HDFS :start-yarn.cmd
cmd
您应该使用以下命令验证namenode
、、和是否都在datanode
运行:resourcemanager
nodemanager
jps
您还可以在浏览器中打开localhost:8088
并localhost:9870
监控您全新的 Hadoop 分布式文件系统:
最后,通过运行来测试您是否可以编辑文件系统,这将在根目录中hadoop fs -mkdir /test
创建一个名为的目录:test
测试 Hadoop 和 Spark
现在我们知道了如何在 HDFS 中创建目录 ( fs -mkdir
) 并列出其内容 ( fs -ls
),那么如何创建和编辑文件呢?可以使用 将文件从本地文件系统复制到 HDFS 。然后,我们可以使用fs -put
读取文件:spark-shell
sc.textFile(...)
请注意,您从 HDFS 读取文件,hdfs://localhost:9000/
而不仅仅是hdfs://
。这是因为这是defaultFS
我们在中定义的core-site.xml
。
如果要停止 HDFS,可以运行以下命令:
C:\Users> stop-dfs.cmd
和
C:\Users> stop-yarn.cmd
好了,现在你已经完成了!Spark 已经在 Windows 上运行,可以读取存储在 HDFS 中的文件了。这需要一些时间才能开始,非常感谢之前遇到过和我一样 bug 的人,以及之前写过教程并被我用作框架的人。以下是我用来构建本教程的博客、GitHub 代码库和 SO 文章:
- Muhammad Bilal Yar 的 Hadoop 2.8.0 演练
- java.net.URISyntaxException
- java.lang.UnsatisfiedLinkError
- 致命的资源管理器。资源管理器
- 本地主机:50070 错误
- Kuldeep Singh 的演练和故障排除指南
- Jacek Laskowski 的 GitBook
- java.io.IOException:不兼容的 clusterID
- HDFS基本命令
- Spark基本命令