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