35

我是 Hadoop 新手,尝试在我的 Windows 7 机器上运行它时遇到了问题。特别是我对运行 Hadoop 2.1.0 很感兴趣,因为它的发行说明提到支持在 Windows 上运行。我知道我可以尝试使用 Cygwin 在 Windows 上运行 1.x 版本,甚至可以使用 Cloudera 等准备好的 VM,但这些选项在某些方面对我来说不太方便。

在检查了来自http://apache-mirror.rbc.ru/pub/apache/hadoop/common/hadoop-2.1.0-beta/的压缩包后,我发现确实有一些 *.cmd 脚本可以在没有 Cygwin 的情况下运行. 当我格式化 HDFS 分区时一切正常,但是当我尝试运行 hdfs namenode 守护程序时,我遇到了两个错误:首先,非致命的,是找不到 winutils.exe(它确实不存在于下载的 tarball 中)。我在 Apache Hadoop 源代码树中找到了该组件的源代码,并使用 Microsoft SDK 和 MSbuild 对其进行了编译。由于详细的错误消息,很清楚将可执行文件放在哪里以满足 Hadoop。但是第二个致命错误没有包含足够的信息让我解决:

13/09/05 10:20:09 FATAL namenode.NameNode: Exception in namenode join
java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
    at org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Native Method)
    at org.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:423)
    at org.apache.hadoop.fs.FileUtil.canWrite(FileUtil.java:952)
    at org.apache.hadoop.hdfs.server.common.Storage$StorageDirectory.analyzeStorage(Storage.java:451)
    at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverStorageDirs(FSImage.java:282)
    at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:200)
...
13/09/05 10:20:09 INFO util.ExitUtil: Exiting with status 1

看起来应该编译其他东西。我将尝试使用 Maven 从源代码构建 Hadoop,但没有更简单的方法吗?是不是有一些我不知道的选项可以禁用本机代码并使该 tarball 在 Windows 上可用?

谢谢你。

更新。确实是的。“自制”包包含一些额外的文件,最重要的是 winutils.exe 和 hadoop.dll。有了这个文件namenode和datanode成功启动。我认为这个问题可以结束了。我没有删除它以防有人面临同样的困难。

更新 2. 要构建“自制”包,我执行了以下操作:

  1. 得到资源,并解压它们。
  2. 仔细阅读 BUILDING.txt。
  3. 安装的依赖项:
    3a)Windows SDK 7.1
    3b)Maven(我使用 3.0.5)3c)JDK(我使用 1.7.25)
    3d)ProtocolBuffer(我使用 2.5.0 - http://protobuf.googlecode.com/files/ protoc-2.5.0-win32.zip )。只需将编译器(protoc.exe)放入某些 PATH 文件夹就足够了。
    3e) 一套UNIX命令行工具(我安装了Cygwin)
  4. 启动 Windows SDK 的命令行。开始 | 所有程序 | 微软视窗 SDK v7.1 | ... 命令提示符(我修改了此快捷方式,在命令行中添加选项 /release 以构建本机代码的发布版本)。所有接下来的步骤都是从 SDK 命令行窗口内部进行的)
  5. 设置环境:

    设置 JAVA_HOME={path_to_JDK_root}

似乎 JAVA_HOME不能包含空格!

set PATH={path_to_maven_bin};%PATH%  
set Platform=x64  
set PATH={path_to_cygwin_bin};%PATH%  
set PATH={path_to_protoc.exe};%PATH%  
  1. 将 dir 更改为源根文件夹(BUILDING.txt 警告路径长度存在一些限制,因此源根目录应该有短名称 - 我使用 D:\hds)
  2. 冉建设过程:

    mvn 包 -Pdist -DskipTests

您可以尝试不使用“skipTests”,但在我的机器上,一些测试失败并且构建被终止。它可能与 BUILDING .txt 中提到的符号链接问题有关。8. 在 hadoop-dist\target\hadoop-2.1.0-beta 中选择结果(windows 可执行文件和 dll 在 'bin' 文件夹中)

4

13 回答 13

18

我已按照以下步骤安装 Hadoop 2.2.0

为 Windows 构建 Hadoop bin 分发的步骤

  1. 下载并安装 Microsoft Windows SDK v7.1。

  2. 下载并安装 Unix 命令行工具 Cygwin。

  3. 下载并安装 Maven 3.1.1。

  4. 下载 Protocol Buffers 2.5.0 并解压到一个文件夹(比如 c:\protobuf)。

  5. 添加环境变量 JAVA_HOME、M2_HOME 和平台(如果尚未添加)。注意:变量名 Platform 区分大小写。对于在 64 位或 32 位系统上构建,值将是 x64 或 Win32。编辑路径变量以添加 Cygwin 的 bin 目录(例如 C:\cygwin64\bin)、Maven 的 bin 目录(例如 C:\maven\bin)和 Protocol Buffers 的安装路径(例如 c:\protobuf)。

  6. 下载 hadoop-2.2.0-src.tar.gz 并解压到具有短路径的文件夹(例如 c:\hdfs),以避免由于 Windows 中的最大路径长度限制而导致的运行时问题。

  7. 选择开始 --> 所有程序 --> Microsoft Windows SDK v7.1 并打开 Windows SDK 7.1 命令提示符。将目录更改为 Hadoop 源代码文件夹 (c:\hdfs)。使用选项 -Pdist,native-win -DskipTests -Dtar 执行 mvn package 以创建 Windows 二进制 tar 分发。

  8. 如果上一步一切顺利,那么将在 C:\hdfs\hadoop-dist\target\hadoop-2.2.0 目录中创建原生分发 hadoop-2.2.0.tar.gz。

安装 Hadoop

  1. 将 hadoop-2.2.0.tar.gz 解压到一个文件夹(比如 c:\hadoop)。

  2. 添加环境变量 HADOOP_HOME 并编辑路径变量以添加 HADOOP_HOME 的 bin 目录(例如 C:\hadoop\bin)。

配置 Hadoop

C:\hadoop\etc\hadoop\core-site.xml

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://localhost:9000</value>
        </property>
</configuration>

C:\hadoop\etc\hadoop\hdfs-site.xml

<configuration>
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>file:/hadoop/data/dfs/namenode</value>
        </property>
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>file:/hadoop/data/dfs/datanode</value>
        </property>
</configuration>

C:\hadoop\etc\hadoop\mapred-site.xml

<configuration>
        <property>
           <name>mapreduce.framework.name</name>
           <value>yarn</value>
        </property>
</configuration>

C:\hadoop\etc\hadoop\yarn-site.xml

<configuration>
        <property>
           <name>yarn.nodemanager.aux-services</name>
           <value>mapreduce_shuffle</value>
        </property>
        <property>
           <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
           <value>org.apache.hadoop.mapred.ShuffleHandler</value>
        </property>
</configuration>

格式化名称节点

只有第一次,namenode 需要被格式化。

C:\Users\abhijitg>cd c:\hadoop\bin 
c:\hadoop\bin>hdfs namenode –format

启动 HDFS(Namenode 和 Datanode)

C:\Users\abhijitg>cd c:\hadoop\sbin
c:\hadoop\sbin>start-dfs

启动 MapReduce aka YARN(资源管理器和节点管理器)

C:\Users\abhijitg>cd c:\hadoop\sbin
c:\hadoop\sbin>start-yarn
starting yarn daemons

总共四个单独的命令提示符窗口将自动打开以运行Namenode、Datanode、Resource Manager、Node Manager

参考:在 Microsoft Windows 操作系统中构建、安装、配置和运行 Apache Hadoop 2.2.0

于 2013-11-03T21:07:03.533 回答
15

Han 准备了 Hadoop 2.2 Windows x64 二进制文件(参见他的博客)并将它们上传到 Github

将两个二进制文件放入文件夹后winutils.exe,我得到了相同的.hadoop.dll%hadoop_prefix%\binUnsatisfiedLinkError

hadoop.dll问题是缺少某些依赖项。我使用Dependency Walker检查二进制文件的依赖关系,并且缺少Microsoft Visual C++ 2010 Redistributables 。

所以除了自己构建所有组件之外,问题的答案是

  • 确保对 Java 和本机代码使用相同的架构。java -version告诉你是使用 32 还是 x64。
  • 然后使用 Dependency Walker 确保所有本机二进制文件都是纯的并且具有相同的架构。有时缺少 x64 依赖项,Windows 回退到 x86,这不起作用。请参阅另一个问题的答案
  • 还要检查是否满足本机二进制文件的所有依赖项。
于 2014-05-30T16:25:23.657 回答
14

我有同样的问题,但最近的 hadoop v. 2.2.0。以下是我解决该问题的步骤:

  1. 我是winutils.exe从源代码构建的。项目目录:

    hadoop-2.2.0-src\hadoop-common-project\hadoop-common\src\main\winutils

    我的操作系统:Windows 7。构建工具:MS Visual Studio Express 2013 for Windows Desktop(它是免费的,可以从http://www.microsoft.com/visualstudio/加载)。打开工作室,File -> Open -> winutils.sln. 右键单击右侧的解决方案 -> Build。在我的情况下有几个错误(您可能需要修复项目属性,指定输出文件夹)。中提琴!你得到winutils.exe- 把它放到 hadoop 的 bin 中。

  2. 接下来我们需要构建hadoop.dll. 这里有一些woodoo魔法:打开

    hadoop-2.2.0-src\hadoop-common-project\hadoop-common\src\main\native\native.sln

    在 MS VS 中;右键单击解决方案-> 构建。我有一堆错误。我手动创建了几个遗漏的头文件(不要问我为什么在源代码压缩包中遗漏了它们!):

    https://github.com/jerishsd/hadoop-experiments/tree/master/sources

    (不要问我这个 git 项目是干什么用的!我不知道——谷歌通过搜索头文件名指出了这一点)我已经复制了

    hadoop-2.2.0-src\hadoop-common-project\hadoop-common\target\winutils\Debug\libwinutils.lib

    (步骤#1的结果)进入

    hadoop-2.2.0-src\hadoop-common-project\hadoop-common\target\bin

    最后构建操作产生hadoop.dll!再把它放到 hadoop 的 bin 中,然后愉快地运行 namenode!

希望我的步骤对某人有所帮助。

于 2013-10-23T17:20:10.803 回答
8

除了其他解决方案,这里还有一个 winutil.exe 的预构建副本。下载它并添加到 $HADOOP_HOME/bin。这个对我有用。

(来源:点击这里

于 2014-12-10T06:41:46.880 回答
6

请将 hadoop.dll(版本敏感)添加到 Windows 目录下的 system32 目录中。

您可以在 winutils 获取hadoop.dll

于 2017-10-09T06:38:29.340 回答
4

我建议不要使用官方分支,而是优化 windows

http://svn.apache.org/repos/asf/hadoop/common/branches/branch-trunk-win/

需要编译,windows下编译winutils.exe,放到hadoop/bin目录下

于 2013-10-04T14:32:10.160 回答
4

您可能需要将hadoop.dllwinutils.exe文件从 hadoop-common-bin 复制到 %HADOOP_HOME%\bin 将 %HADOOP_HOME%/bin 添加到您的 %PATH% 变量中。

您可以从https://github.com/amihalik/hadoop-common-2.6.0-bin下载 hadoop-common

于 2017-09-12T06:53:12.507 回答
3

我在 Windows 8.1 上遇到了与 Hadoop 2.4.1 相同的问题;产生的解决方案存在一些差异,主要是由较新的操作系统引起的。

我首先安装了 Hadoop 2.4.1 二进制文件,将其解压缩到 % HADOOP_HOME % 中。

前面的答案描述了如何设置 Java、protobuf、cygwin 和 maven,以及所需的环境变量。我不得不从 HP 的奇数“BCD”值更改我的平台环境变量。

我从 Apache 镜像下载了源代码,并将其解压缩到一个短目录中 ( HADOOP_SRC = C:\hsrc)。Maven 从该目录中的标准 Windows 命令提示符运行良好:mvn package -DskipTests

我没有使用 Windows 7 SDK(我无法加载)或 Windows 8.1 SDK(没有命令行构建工具),而是使用免费的Microsoft Visual Studio Express 2013 for Windows Desktop。Hadoop 的构建需要 PATH 中的 MSBuild 位置 (C:\Program Files (x86)\MSBuild\12.0),并要求将各种 Hadoop 原生源项目升级到更新的 (MS VS 2013) 格式。maven 构建失败很好地指出了每个项目在失败时的绝对路径,从而可以轻松地将项目加载到 Visual Studio 中(询问后会自动转换)。

构建完成后,我将本机可执行文件和库复制到 Hadoop bin 目录中。它们是在 % HADOOP_SRC %\hadoop-common-project\hadoop-common\target\bin 中构建的,需要复制到 % HADOOP_HOME %\bin 中。

于 2014-08-04T05:11:18.333 回答
2

将 hadoop.dll 和 hdfs.dll 添加到 %HADOOP_HOME%\bin 文件夹对我来说很有效。

于 2017-02-07T09:29:14.157 回答
0

刚刚在我的环境win7 X64中安装了Hadoop 2.2.0。

跟随 BUILD.txt 让我这样做了。请注意:hdfs-site.xml 和 mapred-site.xml 中的目录以 / 开头,如下所示

例如

  <property>
<name>dfs.namenode.name.dir</name>
<value>file:/hadoop-2.2.0_1/dfs/name</value>
<description></description>
<final>true</final>

可以帮助你!

于 2013-10-29T06:19:03.097 回答
0
  1. 获取Hadoop 二进制文件(包括winutils.exehadoop.dll
  2. 确保 hadoop\bin 可通过PATH使用(如果您将其作为服务运行,则为系统 PATH)

    请注意,设置java.library.path 会覆盖 PATH. 如果设置java.library.path,请确保它正确并指向 hadoop 库。

于 2018-09-04T11:26:24.413 回答
0

下载并安装Javac:/java/

确保路径是这样的,如果 java 安装在“程序文件”中,那么 hadoop-env.cmd 将无法识别 java 路径

下载Hadoop 二进制发行版。

我正在使用二进制分发 Hadoop-2.8.1。另外我建议尽可能缩短提取路径

设置环境变量:

JAVA_HOME = "c:/Java"
HADOOP_HOME="<your hadoop home>"
Path= "JAVA_HOME/bin"
Path = "HADOOP_HOME/bin" 

如果Hadoop-src是在您的 windows 机器中使用 maven 构建的,则 Hadoop 将在 windows 上运行。构建Hadoop-src(发行版)将创建一个 Hadoop 二进制发行版,它将作为 Windows 原生版本工作。

但是如果你不想那样做,那就下载预建的winutils of Hadoop distribution. 这里是一个GitHub 链接,里面有一些 Hadoop 版本的 winutils。

如果您使用的版本不在列表中,请按照在 windows 上设置 Hadoop 的常规方法 -链接

如果您找到了您的版本,则将文件夹的所有内容复制粘贴到路径:/bin/

设置所有 .xml 配置文件 -在 hadoop-env.cmd 文件中链接并设置 JAVA_HOME 路径

从 cmd 转到:

<HADOOP_HOME>/bin/> hdfs namenode -format
<HADOOP_HOME>/sbin> start-all.cmd

希望这可以帮助。

于 2017-12-05T08:41:07.647 回答
0

经过多次试验和错误,我得到了它与下面的解决方案一起工作。

窗户变化:

  1. winutilshttps://github.com/steveloughran/winutils下载 zip
  2. 将 zip 解压缩到C:\winutils.
  3. 打开Windows Environment Variables屏幕并添加以下System Variable.

HADOOP_HOME = C:\winutils\hadoop-3.0.0

  1. Path系统变量下添加

%HADOOP_HOME%\bin 5. 重新启动系统。

Maven 变化:

  <properties>

    <java.version>1.8</java.version>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

    <scala.version>2.12</scala.version>
    <spark.version>3.0.1</spark.version>
    <hadoop.version>3.0.0</hadoop.version>  <!-- Note: HADOOP Version used is the one available for winutils -->

  </properties>

  <dependencies>

    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-core_${scala.version}</artifactId>
      <version>${spark.version}</version>
<!--  <scope>provided</scope> -->
    </dependency>

    <!-- Hadoop-->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
      <version>${hadoop.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>${hadoop.version}</version>
    </dependency>

    <!-- For S3 Read (optional) -->
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-aws</artifactId>
      <version>${hadoop.version}</version>
    </dependency>
于 2020-11-22T09:21:27.687 回答