【问题标题】:Using spark to access HDFS failed使用 spark 访问 HDFS 失败
【发布时间】:2013-03-26 08:34:10
【问题描述】:

我正在使用 Cloudera 4.2.0 和 Spark。

我只是想试试 Spark 给出的一些例子。

// HdfsTest.scala
package spark.examples

import spark._

object HdfsTest {
  def main(args: Array[String]) {
    val sc = new SparkContext(args(0), "HdfsTest",
      System.getenv("SPARK_HOME"), Seq(System.getenv("SPARK_EXAMPLES_JAR")))

    val file = sc.textFile("hdfs://n1.example.com/user/cloudera/data/navi_test.csv")
    val mapped = file.map(s => s.length).cache()
    for (iter <- 1 to 10) {
      val start = System.currentTimeMillis()
      for (x <- mapped) { x + 2 }
      //  println("Processing: " + x)
      val end = System.currentTimeMillis()
      println("Iteration " + iter + " took " + (end-start) + " ms")
    }
    System.exit(0)
  }
}

编译没问题,但是总有一些运行时问题:

Exception in thread "main" java.util.ServiceConfigurationError: org.apache.hadoop.fs.FileSystem: Provider org.apache.hadoop.hdfs.HftpFileSystem could not be instantiated: java.lang.IllegalAccessError: tried to access method org.apache.hadoop.fs.DelegationTokenRenewer.<init>(Ljava/lang/Class;)V from class org.apache.hadoop.hdfs.HftpFileSystem
    at java.util.ServiceLoader.fail(ServiceLoader.java:224)
    at java.util.ServiceLoader.access$100(ServiceLoader.java:181)
    at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:377)
    at java.util.ServiceLoader$1.next(ServiceLoader.java:445)
    at org.apache.hadoop.fs.FileSystem.loadFileSystems(FileSystem.java:2229)
    at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2240)
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2257)
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:86)
    at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2296)
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2278)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:316)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:162)
    at org.apache.hadoop.mapred.JobConf.getWorkingDirectory(JobConf.java:587)
    at org.apache.hadoop.mapred.FileInputFormat.setInputPaths(FileInputFormat.java:315)
    at org.apache.hadoop.mapred.FileInputFormat.setInputPaths(FileInputFormat.java:288)
    at spark.SparkContext.hadoopFile(SparkContext.scala:263)
    at spark.SparkContext.textFile(SparkContext.scala:235)
    at spark.examples.HdfsTest$.main(HdfsTest.scala:9)
    at spark.examples.HdfsTest.main(HdfsTest.scala)
Caused by: java.lang.IllegalAccessError: tried to access method org.apache.hadoop.fs.DelegationTokenRenewer.<init>(Ljava/lang/Class;)V from class org.apache.hadoop.hdfs.HftpFileSystem
    at org.apache.hadoop.hdfs.HftpFileSystem.<clinit>(HftpFileSystem.java:84)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
    at java.lang.Class.newInstance0(Class.java:374)
    at java.lang.Class.newInstance(Class.java:327)
    at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:373)
... 16 more

我在 Google 上搜索过,不知道 Spark 和 HDFS 有这种异常。

val file = sc.textFile("hdfs://n1.example.com/user/cloudera/data/navi_test.csv") 是问题所在。

13/04/04 12:20:51 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

我收到了这个警告。也许我应该在 CLASS_PATH 中添加一些 hadoop 路径。

随时提供任何线索。 =)

谢谢大家。

任豪

【问题讨论】:

标签: scala apache-spark hdfs cloudera


【解决方案1】:

这可能与您系统中安装的 Java 有关。 Hadoop 需要 (Sun) Java 1.6+。 确保你有:

JAVA_HOME="/usr/lib/jvm/java-6-sun

【讨论】:

    【解决方案2】:

    (这个问题也在spark-users mailing list 上提出/回答)。

    您需要针对集群上运行的特定版本的 Hadoop/HDFS 编译 Spark。来自Spark documentation

    Spark 使用 Hadoop 核心库与 HDFS 和其他支持 Hadoop 的存储系统通信。由于 HDFS 协议在不同版本的 Hadoop 中发生了变化,因此您必须针对集群运行的相同版本构建 Spark。您可以通过在project/SparkBuild.scala 顶部设置HADOOP_VERSION 变量来更改版本,然后重建Spark (sbt/sbt clean compile)。

    spark-users 邮件列表存档包含一些关于针对特定 Hadoop 版本进行编译的问题,因此如果您在构建 Spark 时遇到任何问题,我会在那里搜索。

    【讨论】:

      【解决方案3】:

      您可以在构建 Spark 时使用环境变量设置 Coudera 的 Hadoop 版本,在 Cloudera 的 maven repo 上查找您的确切工件版本,应该是这样的:

      SPARK_HADOOP_VERSION=2.0.0-cdh4.2.0 sbt/sbt assembly publish-local
      

      确保使用与构建 Spark 相同的 Java 引擎运行所运行的任何程序。此外,还有针对不同 Cloudera Hadoop 发行版的预构建 Spark 包,例如 http://spark-project.org/download/spark-0.8.0-incubating-bin-cdh4.tgz

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-02
        • 2016-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-10
        相关资源
        最近更新 更多