【问题标题】:SBT project java.io.FileNotFoundException:FileNotFoundException: HADOOP_HOME unsetSBT 项目 java.io.FileNotFoundException:FileNotFoundException: HADOOP_HOME 未设置
【发布时间】:2018-08-21 01:41:23
【问题描述】:

我正在尝试使用 AvroParquetWriter 将 Avro 格式的文件转换为镶木地板文件。我加载了架构

val schema:org.apache.Schema = ... getSchema(...)
val parquetFile = new Path("Location/for/parquetFile.txt")
val writer = new AvroParquetWriter[GenericRecord](parquetFile,schema)

我的代码运行良好,直到它开始初始化 AvroParquetWriter。然后它抛出这个错误:

> java.lang.RuntimeException: java.io.FileNotFoundException:
> java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are
> unset. -see https://wiki.apache.org/hadoop/WindowsProblems    at
> org.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:722)  at
> org.apache.hadoop.util.Shell.getSetPermissionCommand(Shell.java:256)
>   at
> org.apache.hadoop.util.Shell.getSetPermissionCommand(Shell.java:273)
>   at
> org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:767)
>   at
> org.apache.hadoop.fs.RawLocalFileSystem$LocalFSFileOutputStream.<init>(RawLocalFileSystem.java:235)...etc

它似乎给出的建议以及我发现的建议与如果您在计算机上运行 Hadoop 集群如何解决此问题有关。但是,我没有运行 Hadoop 集群,也没有打算这样做。我已经导入了它的一些库,以便在我的 SBT 文件中与我的程序的各种其他部分一起使用,但这不会启动本地集群。

它刚刚开始这样做。在我的另外 2 位同事中,一位能够毫无问题地运行此程序,而另一位刚刚开始遇到与我相同的问题。这是我的 build.sbt 的(相关部分):

lazy val root = (project in file("."))
  .settings(
    commonSettings,
    name := "My project",
    version := "0.1",
        libraryDependencies ++= Seq(
          "org.apache.hadoop" % "hadoop-common" % "2.9.0",
      "com.typesafe.akka" %% "akka-actor" % "2.5.2",
      "com.lightbend.akka" %% "akka-stream-alpakka-s3" % "0.9",
      "com.enragedginger" % "akka-quartz-scheduler_2.12" % "1.6.0-akka-2.4.x",
      "com.typesafe.akka" % "akka-agent_2.12" % "2.5.2",
      "com.typesafe.akka" % "akka-remote_2.12" % "2.5.2",
      "com.typesafe.akka" % "akka-stream_2.12" % "2.5.2",
      "org.apache.kafka" % "kafka-clients" % "0.10.2.1",
      "com.typesafe.akka" %% "akka-stream-kafka" % "0.16",
      "com.typesafe.akka" %% "akka-persistence" % "2.5.2",
      "org.iq80.leveldb"            % "leveldb" % "0.7",
      "org.fusesource.leveldbjni"   % "leveldbjni-all"   % "1.8",
      "javax.mail" % "javax.mail-api" % "1.5.6",
      "com.sun.mail" % "javax.mail" % "1.5.6",
      "commons-io" % "commons-io" % "2.5",
      "org.apache.avro" % "avro" % "1.8.1",
      "net.liftweb" % "lift-json_2.12" % "3.1.0-M1",
      "com.google.code.gson" % "gson" % "2.8.1",
      "org.json4s" %% "json4s-jackson" % "3.5.2",
      "com.amazonaws" % "aws-java-sdk-s3" % "1.11.149",
          //"com.amazonaws" % "aws-java-sdk" % "1.11.286",
      "org.scalikejdbc" %% "scalikejdbc"         % "3.0.0",
      "org.scalikejdbc" %% "scalikejdbc-config"  % "3.0.0",
      "org.scalikejdbc" % "scalikejdbc-interpolation_2.12" % "3.0.2",
      "com.microsoft.sqlserver" % "mssql-jdbc" % "6.1.0.jre8",
      "org.apache.commons" % "commons-pool2" % "2.4.2",
      "commons-pool" % "commons-pool" % "1.6",
      "com.jcraft" % "jsch" % "0.1.54",
      "ch.qos.logback" % "logback-classic" % "1.2.3",
      "com.typesafe.scala-logging" %% "scala-logging" % "3.7.2",
      "org.scalactic" %% "scalactic" % "3.0.4",
          "mysql" % "mysql-connector-java" % "8.0.8-dmr",
      "org.scalatest" %% "scalatest" % "3.0.4" % "test"
        )
  )

关于为什么它不能运行与 Hadoop 相关的依赖项有什么想法吗?

【问题讨论】:

  • 您在 Windows 上吗?如果是,您是否按照上述建议定义 HADOOP_HOME 环境变量并将其指向 winutils.exe? (通常不需要安装本地 Hadoop 集群,但仍然需要 env var 和 lib)。
  • 我在 Windows 上。我已按照他们的 Wiki 给出的建议 - 我下载了一个 winutils.exe,并将其放在此目录 C:/Users/Me/Hadoop/bin/ 中 - 然后我将我的 HADOOP_HOME 环境变量设置为上述路径中的 Hadoop 文件夹,但是,得到同样的错误。

标签: scala hadoop sbt


【解决方案1】:

答案是听从他们的建议-

  1. 我从以下网址下载了最新版本的 winutils.exe https://github.com/steveloughran/winutils/tree/master/hadoop-3.0.0/bin

  2. 然后我在C:/Users/MyName/Hadoop/bin 中手动创建了这个目录结构——注意,bin 必须在那里。您实际上可以随意调用Hadoop/ 目录,但bin/ 必须是其中的一级。

  3. 我把winutils.exe放到了bin里。

  4. 在我的代码中,我必须将这一行放在初始化镶木地板编写器的上方(我想它可以在初始化之前的任何时间)来设置 Hadoop 行:

-

System.setProperty("hadoop.home.dir", "C:/Users/nhanak/Hadoop/")
val writer = new AvroParquetWriter[GenericRecord](parquetFile,iInfo.schema)
  1. 可选 - 如果您只想将其保留在您的项目中而不是将其转移到您的本地计算机上,或者如果其他人将要提取此 repo,或者您想将其打包在一个罐子中以发送到任何地方,等等 - 在您的项目中创建一个目录结构并将 winutils.exe 存储在其中。 -所以,假设您在项目中创建目录结构src/main/resources/HadoopResources/bin,请将 winutils.exe 放在 bin 中。然后,要使用 winutils.exe,您需要像这样设置 Hadoop 主页:

-

 val file = new File("src/main/resources/HadoopResources")
      System.setProperty("hadoop.home.dir", file.getAbsolutePath)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-09
    • 2014-06-05
    • 2019-01-02
    • 2012-02-18
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    相关资源
    最近更新 更多