SparkContext、JavaSparkContext、SQLContext和SparkSession的区别?

Posted

技术标签:

【中文标题】SparkContext、JavaSparkContext、SQLContext和SparkSession的区别?【英文标题】:Difference between SparkContext, JavaSparkContext, SQLContext, and SparkSession? 【发布时间】:2017-10-03 19:25:34 【问题描述】:
    SparkContext,JavaSparkContext,SQLContextSparkSession有什么区别? 是否有任何方法可以使用SparkSession 转换或创建上下文? 我可以使用一个条目 SparkSession 完全替换所有上下文吗? SQLContextSparkContextJavaSparkContext中的所有函数是否也在SparkSession中? parallelize 等一些函数在SparkContextJavaSparkContext 中具有不同的行为。他们在SparkSession 中的表现如何?

    如何使用SparkSession 创建以下内容?

    RDD JavaRDD JavaPairRDD Dataset

有没有办法将JavaPairRDD 转换为Dataset 或将Dataset 转换为JavaPairRDD

【问题讨论】:

【参考方案1】:

sparkContext 是 Scala 实现入口点,JavaSparkContextsparkContext 的 java 包装器。

SQLContext是SparkSQL的入口点,可以从sparkContext接收。在2.xx之前,RDD、DataFrame和Data-set是三种不同的数据抽象。从Spark 2.xx开始,这三种数据抽象都是统一,SparkSession 是 Spark 的统一入口。

另外需要注意的是,RDD 用于非结构化数据、强类型数据,而 DataFrames 用于结构化和松散类型数据。你可以check

有什么方法可以使用 Sparksession 转换或创建 Context 吗?

是的。它的 sparkSession.sparkContext() 和 SQL,sparkSession.sqlContext()

我可以使用一个条目 SparkSession 完全替换所有上下文吗?

是的。您可以从 sparkSession 获取相应的上下文。

SQLContext、SparkContext、JavaSparkContext等中的所有函数都添加到SparkSession中了吗?

不直接。你必须获得相应的上下文并利用它。类似于向后兼容性

如何在 SparkSession 中使用该功能?

获取相应的上下文并加以利用。

如何使用 SparkSession 创建以下内容?

    可以从sparkSession.sparkContext.parallelize(???)创建RDD JavaRDD 同样适用于此,但在 java 实现中 JavaPairRDD sparkSession.sparkContext.parallelize(???).map(//making your data as key-value pair here is one way) 如果是结构化数据,sparkSession返回的Dataset就是Dataset。

【讨论】:

【参考方案2】:

来自分支2.1下spark源码的解释

SparkContext: Spark 功能的主要入口点。 SparkContext 表示与 Spark 的连接 集群,并可用于在该集群上创建 RDD、累加器和广播变量。

每个 JVM 只能有一个 SparkContext 处于活动状态。您必须先stop() 活动的 SparkContext 创建一个新的。这一限制最终可能会被取消;有关详细信息,请参阅 SPARK-2243。

JavaSparkContext: 返回的 [[org.apache.spark.SparkContext]] 的 Java 友好版本 [[org.apache.spark.api.java.JavaRDD]]s 并使用 Java 集合而不是 Scala 集合。

每个 JVM 只能有一个 SparkContext 处于活动状态。你必须stop()活动的 SparkContext 之前 创建一个新的。这一限制最终可能会被取消;有关详细信息,请参阅 SPARK-2243。

SQLContext: 在 Spark 1.x 中处理结构化数据(行和列)的入口点。

从 Spark 2.0 开始,它被 [[SparkSession]] 取代。但是,我们保留课程 这里是为了向后兼容。

SparkSession: 使用 Dataset 和 DataFrame API 编程 Spark 的入口点。

【讨论】:

我们为什么以及在哪里使用JavaSparkContext【参考方案3】:

我将只讨论 Spark 版本 2.x

SparkSession:它是您的 spark 应用程序的主要入口点。要在您的 spark 上运行任何代码,这是您应该创建的第一件事。

from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local").appName("Word Count")\
.config("spark.some.config.option", "some-value")\
.getOrCreate()

SparkContext:它是 SparkSession 的一个内部对象(属性)。它用于与Low-Level API 交互,通过SparkContext 可以创建RDDaccumlatorBroadcast variables

在大多数情况下,您不需要SparkContext。你可以从SparkSession得到SparkContext

val sc = spark.sparkContext

【讨论】:

【参考方案4】:

Spark Context 是 Spark API 中的类,这是构建 spark 应用程序的第一个阶段。 spark上下文的功能是在RAM中创建内存,我们称之为驱动内存,分配执行器和内核的数量,简而言之,它与集群管理有关。 Spark Context 可用于创建 RDD 和共享变量。要访问它,我们需要创建它的对象。

这样我们可以创建 Spark Context :: var sc=new SparkContext()

Spark Session 这是自 spark 2.x 以来添加的新对象,它是 Sql Context 和 Hive Context 的替代品。 之前我们有两个选项,一个是 Sql Context,它是在 Dataframe 上执行 sql 操作的方式,第二个是 Hive Context,它管理 Hive 连接相关的东西并从 Hive 表中获取/插入数据。

自从 2.x 出现以来,我们可以为 Dataframe 上的 SQL 操作创建 SparkSession,如果您有任何与 Hive 相关的工作,只需调用方法 enablehivesupport() 然后您可以将 SparkSession 用于 Dataframe 和 hive 相关的 SQL 操作。

这样我们就可以为Dataframe上的Sql操作创建SparkSession

val sparksession=SparkSession.builder().getOrCreate();

第二种方法是为Dataframe上的Sql操作以及Hive操作创建SparkSession。

val sparkSession=SparkSession.builder().enableHiveSupport().getOrCreate()

【讨论】:

【参考方案5】:

Spark 上下文:

从 Spark 1.x 开始,Spark SparkContext 是 Spark 的入口点,并在 org.阿帕奇。 spark 包,用于以编程方式在集群上创建 Spark RDD、累加器和广播变量。它的对象 sc 是 spark-shell 中可用的默认变量,可以使用 SparkContext 类以编程方式创建。

SparkContext 是 spark 执行环境的客户端。 SparkContext 是 spark 执行作业的入口点。 SparkContext 充当 spark 应用程序的主人。

希望您会发现这个Apache SparkContext Examples 网站有用。

SparkSession:

自 Spark 2.0 以来,SparkSession 已成为 Spark 使用 RDD、DataFrame 和 Dataset 的入口点。在 2.0 之前,SparkContext 曾经是一个入口点。在这里,我将主要通过定义和描述如何创建 Spark Session 以及使用 spark-shell 中的默认 Spark Session 'spark' 变量来解释什么是 SparkSession。

Apache spark2.0 以后,spark session 是 spark 应用的新入口。 spark 上下文提供的所有功能都在 Spark 会话中可用。 spark session 提供用于处理数据集和数据帧的 API。 Spark2.0 之前:

Spark Context 是 Spark 作业的入口点。 RDD 是当时的主要 API 之一,它是使用 spark Context 创建和操作的。 对于其他所有 API,需要不同的上下文 - 对于 SQL,需要 SQL 上下文。

您可以在Apache SparkSession 上找到更多实时示例。

SQLContext: 在 Spark 1.0 版中,SQLContext (org.apache.spark.sql.SQLContext) 是 SQL 的入口点,以便处理结构化数据(行和列),但是 2.0 版的 SQLContext 已被 SparkSession 取代。 Apache Spark SQLContext 是 SparkSQL 的入口点,它是 Spark 1.x 中结构化数据(行和列)的 Spark 模块。加工。 Spark SQLContext 已初始化。 apache-spark SQL 上下文是 Spark SQL 的入口点,可以从 spark 上下文中接收 JavaSparkContext:

JavaSparkContext For JAVARDD 与上述相同,但在 java 实现中。

JavaSparkContext Java 友好版本的 [[org.apache.spark.SparkContext]] 返回 [[org.apache.spark.api.java.JavaRDD]] 并使用 Java 集合而不是 Scala 集合。

【讨论】:

以上是关于SparkContext、JavaSparkContext、SQLContext和SparkSession的区别?的主要内容,如果未能解决你的问题,请参考以下文章

Spark(16)——SparkContext的作用

Spark源码剖析——SparkContext

Spark源码剖析——SparkContext

Spark源码剖析——SparkContext

SparkConf 和 sparkContext 的目的

spark源码解读-SparkContext初始化过程