当spark master设置为LOCAL时,SparkSession对象不存在HDFS路径

时间:2017-06-30 10:20:47

标签: hadoop apache-spark

我正在尝试使用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")

但似乎没有任何效果。

我的火花版本是2.0.2

有谁能告诉我如何解决它?

3 个答案:

答案 0 :(得分:0)

当您通过将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")

您需要了解<spark-master-ip><spark-port>

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

答案 1 :(得分:0)

我不清楚显式协议规范会出现什么错误,但通常(已经回答)这意味着没有必要的配置传递到if(isTypeA){ new FetchUser(USERID){ @Override protected void onPostExecute(User user){ mUser = user; } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); new FetchImages(mUser.getType()){ @Override protected void onPostExecute(List<Image> result){ if(mImageList.isEmpty() && !result.isEmpty()){ mImageList.addAll(result); mAdapter = new ItemAdapter(getChildFragmentManager(), mImageList.size(), mImageList); mItemCardPager.setAdapter(mAdapter); }else{ if(mMasterLayout != null){ mMasterLayout.setVisibility(View.GONE); } } } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } 上下文。

第一个解决方案:

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") 文件中明确指定HADOOP_CONF_DIR。如果您计划使用群集,请确保群集中的每个节点都指定了$SPARK_HOME/spark-env.sh

确保在Spark / App类路径中拥有所有必需的Hadoop deps。

答案 2 :(得分:0)

尝试以下方法,它应该可以工作。

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);