【问题标题】:HDFS path does not exist with SparkSession object when spark master is set as LOCAL当 spark master 设置为 LOCAL 时,SparkSession 对象不存在 HDFS 路径
【发布时间】:2017-06-30 10:20:46
【问题描述】:

我正在尝试使用 Spark 将数据集加载到 Hive 表中。

但是当我尝试将文件从 HDFS 目录加载到 Spark 时,出现异常:

org.apache.spark.sql.AnalysisException: Path does not exist: file:/home/cloudera/partfile;

这些是加载文件之前的步骤。

val wareHouseLocation = "file:${system:user.dir}/spark-warehouse"
val SparkSession = SparkSession.builder.master("local[2]") \
    .appName("SparkHive") \
    .enableHiveSupport() \
    .config("hive.exec.dynamic.partition", "true") \
    .config("hive.exec.dynamic.partition.mode","nonstrict") \
    .config("hive.metastore.warehouse.dir","/user/hive/warehouse") \
    .config("spark.sql.warehouse.dir",wareHouseLocation).getOrCreate()
import sparkSession.implicits._
val partf = sparkSession.read.textFile("partfile")

语句的例外 ->

val partf = sparkSession.read.textFile("partfile")

org.apache.spark.sql.AnalysisException: Path does not exist: file:/home/cloudera/partfile;

但我的 HDFS 主目录中有该文件。

hadoop fs -ls
Found 1 items
-rw-r--r--   1 cloudera cloudera         58 2017-06-30 02:23 partfile

我尝试了各种方法来加载数据集,例如:

val partfile = sparkSession.read.textFile("/user/cloudera/partfile") and 
val partfile = sparkSession.read.textFile("hdfs://quickstart.cloudera:8020/user/cloudera/partfile")

但似乎没有任何效果。

我的spark版本是2.0.2

谁能告诉我怎么解决?

【问题讨论】:

    标签: hadoop apache-spark


    【解决方案1】:

    当您通过将master 设置为local[2] 来提交作业时,您的作业不会被提交给spark master,因此spark 不知道底层的HDFS。 Spark 会将本地文件系统视为其默认文件系统,这就是您的情况发生 IOException 的原因。

    试试这个方法:

    val SparkSession = SparkSession.builder \
        .master("<spark-master-ip>:<spark-port>") \
        .appName("SparkHive").enableHiveSupport() \
        .config("hive.exec.dynamic.partition", "true") \
        .config("hive.exec.dynamic.partition.mode","nonstrict") \
        .config("hive.metastore.warehouse.dir","/user/hive/warehouse") \
        .config("spark.sql.warehouse.dir",wareHouseLocation).getOrCreate()
    import sparkSession.implicits._
    val partf = sparkSession.read.textFile("partfile")
    

    为此,您需要知道&lt;spark-master-ip&gt;&lt;spark-port&gt;

    这样,spark 会将底层的 hdfs 文件系统作为其默认文件系统。

    【讨论】:

    • 我试过了: val sparkSession = SparkSession.builder.master("spark://localhost:7077").appName("使用 Spark 将数据保存到 HiveTable").enableHiveSupport().config(" hive.exec.dynamic.partition", "true").config("hive.exec.dynamic.partition.mode", "nonstrict").config("hive.metastore.warehouse.dir", "/user/hive /warehouse").config("spark.sql.warehouse.dir", wareHouseLocation).getOrCreate() 我从 :github.com/holdenk/spark-old/blob/master/docs/… 知道了默认端口号,但它仍然给出错误。你能告诉我还有什么要改变的吗?
    【解决方案2】:

    我不清楚显式协议规范会出现什么错误,但通常(正如已经回答的那样)这意味着没有必要的配置被传递到 Spark 上下文中。

    第一种解决方案:

    val sc = ??? // Spark Context
    val config = sc.hadoopConfiguration
    // you can mutate config object, it should work
    config.addResource(new Path(s"${HADOOP_HOME}/conf/core-site.xml"))
    // instead of adding a resource you can just specify hdfs address
    // config.set("fs.defaultFS", "hdfs://host:port")
    

    第二个:

    $SPARK_HOME/spark-env.sh 文件中明确指定HADOOP_CONF_DIR。如果您打算使用集群,请确保集群的每个节点都指定了HADOOP_CONF_DIR

    并确保您的 Spark/App 类路径中包含所有必要的 Hadoop 部门。

    【讨论】:

      【解决方案3】:

      试试下面的,应该可以的。

      SparkSession session = SparkSession.builder().appName("Appname").master("local[1]").getOrCreate();
      
      DataFrameReader dataFrameReader = session.read();
      
      String path = "path\\file.csv";
      
      Dataset <Row> responses = dataFrameReader.option("header","true").csv(path);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-04
        • 1970-01-01
        • 2015-05-31
        相关资源
        最近更新 更多