【问题标题】:Running Apache Hadoop 2.1.0 on Windows在 Windows 上运行 Apache Hadoop 2.1.0
【发布时间】:2013-09-08 21:58:25
【问题描述】:

我是 Hadoop 新手,尝试在我的 Windows 7 机器上运行它时遇到了问题。特别是我对运行 Hadoop 2.1.0 很感兴趣,因为它的release notes 提到支持在 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' 文件夹中)

【问题讨论】:

  • @mamdouh alramadan 谢谢你的建议。我可能会切换到带有 Hadoop 的某种 Linux 风格。但是现在我所有的环境都是基于 Windows 的,并且在主机操作系统中的虚拟机中拥有带有大数据文件的 HDFS 分区似乎并不... 优雅对我来说。

标签: windows hadoop


【解决方案1】:

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

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

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

【讨论】:

  • 您能否提供任何关于在 Windows 下构建这些东西的说明的好的链接?
  • 我实际上是在一台 linux 机器上构建 Hadoop,因为那里存在 ant/maven 等问题。如果我没记错的话,我只是按照网站上提供的说明进行操作。然后构建winutils你可以使用visual studio,这部分也很简单,只需加载项目并构建它
【解决方案2】:

我遇到了同样的问题,但最近使用了 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!

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

【讨论】:

  • 嗯,就我而言,Woodoo 的魔法更少,但步骤更多。我刚刚从源代码分发中关注了 BUILDING.txt。我必须安装一些依赖项:免费的 Windows SDK、Maven、ProtocolBuffer 库和一组 Unix 实用程序。之后,Maven 完成了所有工作。当然,它不仅构建了本机代码,还构建了 Java 包。我记得的唯一问题是一些失败的测试取消了构建过程。所以我不得不通过 Maven 命令行选项禁用它们。
  • @Aleksei- 我正在尝试构建 native.sln。我得到了缺少头文件的错误。你能告诉我应该把丢失的文件放在哪里吗?
【解决方案3】:

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

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

E.G

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

可以帮助你!

【讨论】:

    【解决方案4】:

    我已按照以下步骤安装 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、资源管理器、节点管理器

    参考:Build, Install, Configure and Run Apache Hadoop 2.2.0 in Microsoft Windows OS

    【讨论】:

    • "鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。” stackoverflow.com/help/how-to-answer
    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • 感谢您的详细教程。 :)
    • 这里 Cygwin 和 Protocol Buffers 2.5.0 有什么用?
    【解决方案5】:

    Han 已准备好 Hadoop 2.2 Windows x64 二进制文件(请参阅他的 blog)和 uploaded them to Github

    winutils.exehadoop.dll 这两个二进制文件放入%hadoop_prefix%\bin 文件夹后,我得到了相同的UnsatisfiedLinkError

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

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

    • 确保对 Java 和本机代码使用相同的体系结构。 java -version 告诉你是使用 32 还是 x64。
    • 然后使用 Dependency Walker 确保所有本机二进制文件都是纯的并且具有相同的架构。有时缺少 x64 依赖项,Windows 回退到 x86,这不起作用。见answer of another question
    • 还要检查是否满足本机二进制文件的所有依赖项。

    【讨论】:

    • Dependency Walker 在名称中显示了架构。
    • 确保对 Java 和本机代码使用相同的架构。 java -version 告诉你是使用 32 还是 x64。这对我有帮助!
    【解决方案6】:

    我在 Windows 8.1 上使用 Hadoop 2.4.1 时遇到了同样的问题;最终解决方案存在一些差异,主要是由较新的操作系统引起的。

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

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

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

    我没有使用 Windows 7 SDK(我无法加载)或 Windows 8.1 SDK(没有命令行构建工具),而是使用了免费的 Microsoft Visual Studio Express 2013 Windows 桌面。 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 中。

    【讨论】:

      【解决方案7】:

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

      (来源:Click here

      【讨论】:

      • @Prasad D 我已经使用了您的实用程序,并且可以成功启动 HDFS。但是在启动 YARN 时它失败了。请查看并回复stackoverflow.com/questions/30964216
      • 谢谢。 hadoop-2.6 有链接吗?
      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

        您可能需要将 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

        【讨论】:

        • 在 win10+64 中将 hadoop.dll 放入 C:\Windows\System32 之前无法使用
        【解决方案10】:

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

        你可以在winutils获取hadoop.dll

        【讨论】:

          【解决方案11】:

          Download & 在c:/java/ 中安装 Java

          确保路径是这样的,如果java安装在'program files',则 hadoop-env.cmd 将无法识别 java 路径

          Download Hadoop 二进制分发。

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

          设置环境变量:

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

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

          但如果您不想这样做,请下载预建的winutils of Hadoop distribution. 这是一个GitHub link,它有一些Hadoop版本的winutils。

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

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

          设置所有 .xml 配置文件 - Link & 在 hadoop-env.cmd 文件中设置 JAVA_HOME 路径

          从cmd转到:

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

          希望这会有所帮助。

          【讨论】:

            【解决方案12】:
            1. Get Hadoop 二进制文件(包括 winutils.exehadoop.dll
            2. 确保 hadoop\bin 通过 PATH 可用(如果您将其作为服务运行,则为系统 PATH)

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

            【讨论】:

              【解决方案13】:

              经过多次试验和错误,我得到了它与以下解决方案的配合。

              Windows 更改:

              1. https://github.com/steveloughran/winutils下载winutils的zip
              2. 将压缩包解压到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>
              

              【讨论】:

                猜你喜欢
                • 2016-06-21
                • 2016-06-26
                • 1970-01-01
                • 2017-05-27
                • 2015-05-23
                • 1970-01-01
                • 1970-01-01
                • 2015-04-02
                • 1970-01-01
                相关资源
                最近更新 更多