Spark会话/上下文生命周期

时间:2019-08-13 13:22:47

标签: apache-spark

我不了解Spark会话/上下文生命周期的工作方式。该文档说,您可以有多个SparkSession共享一个基础SparkContext。但是,它们是如何/何时被创建和销毁的?例如,如果我有一个生产集群,并且我有spark-submit个10个ETL,那么这10个作业将共享相同的SparkContext吗?如果我在群集/客户端模式下执行此操作是否重要? 据我所知,SparkContext位于驱动程序中,因此我认为以上情况会导致10个SparkContext共享一个SparkSession,但我不确定正确地做到了...任何澄清将不胜感激。

2 个答案:

答案 0 :(得分:1)

每个spark应用程序都有一个SparkContext。

  

文档说,您可以有多个SparkSession共享一个基础SparkContext。但是,它们是如何/何时被创建和销毁的?

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen, ScreenManager


class SubScreen(Screen):
    pass


Builder.load_string('''
<RoundedButton@Button>:
    size_hint: (None, None)
    size: (100, 100)
    background_color: 0,0,0,0  # the last zero is the critical on, make invisible
    canvas.before:
        Color:
            rgba: (.4,.4,.4,1) if self.state=='normal' else (0,.7,.7,1)  # visual feedback of press
        RoundedRectangle:
            pos: (self.center_x - 50, self.center_y - 50)
            size: self.size
            radius: [50,]
    text:'<--Back'
    on_release: app.root.current = 'mainmenu'


<SubScreen>
    name: 'submenu'
    RoundedButton:
        pos: (0, root.height-self.height)
''')


class TheApp(App):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(SubScreen())
        return sm

TheApp().run()

如果您现有一个Spark会话,并且想要创建一个新的Spark会话,请在现有的SparkSession上使用newSession方法。

std::vector<Config*>::iterator itbegin = configs_with_new_parameters.begin();
std::vector<Config*>::iterator itend = configs_with_new_parameters.end();
for (auto i = itbegin; i < itend; ++i)
{
    Config* config = (*i);
    addParameterData(config);
}

newSession方法使用隔离的SQL配置和临时表创建一个新的Spark会话。新会话将共享基础SparkContext和缓存的数据。

然后,您可以使用这些不同的会话来提交不同的作业/ SQL查询。

Config* IterateVector(std::vector<Config*> *list)
{
    std::vector<Config*>::iterator itbegin = list->begin();
    std::vector<Config*>::iterator itend = list->end();
    for (auto i = itbegin; i < itend; ++i)
    {
        return *i; //??
    }
}
  

如果我在群集/客户端模式下执行此操作是否重要?

客户端/群集模式无关紧要。

答案 1 :(得分:0)

让我们了解sparkSession和sparkContext

SparkContext 是访问所有Spark功能的通道。Spark驱动程序使用它连接到集群管理器进行通信,提交Spark作业并知道要与之通信的资源管理器(YARN)。并且,通过SparkContext,驱动程序可以访问其他上下文,例如SQLContext,HiveContext和StreamingContext,以对Spark进行编程。

使用Spark 2.0, SparkSession 可以通过一个统一的入口点来访问上述所有Spark功能。

  

这意味着SparkSession封装了SparkContext。

比方说,我们有多个用户访问共享了sparkContext的同一个笔记本,并且要求有一个隔离的环境共享同一个spark上下文。在2.0之前的版本,解决方案是创建多个sparkContext,即每个隔离的环境或用户创建sparkContext,而且操作昂贵(每个JVM仅存在一个sparkContext )。但是随着spark会话的引入,此问题已得到解决。

  

我火花提交10个ETL,这10个工作将共享相同的   SparkContext?如果我在群集/客户端模式下执行此操作是否重要?至   据我所知,SparkContext位于驱动程序中,因此   我假设以上将导致一个由10共享的SparkContext   SparkSessions,

如果您提交10个ETL spark-submit作业,无论它是集群/客户端,它们都是不同的应用程序,并且它们都有自己的sparkContext和sparkSession。在本机Spark中,您不能在不同的应用程序之间共享对象,但是如果要共享对象您必须使用共享上下文(spark-jobserver)。有多个选项,例如Apache Ivyapache-ignite