在python中对类方法调用mapPartitions
我对Python和Spark还相当陌生,但让我看看是否可以解释我正在尝试做什么 我有很多不同类型的页面需要处理。我为这些页面的所有公共属性创建了一个基类,然后从基类继承了一个特定于页面的类。其想法是,spark runner在调用时只需更改页面类型,就可以对所有页面执行完全相同的操作 跑步者在python中对类方法调用mapPartitions,python,apache-spark,Python,Apache Spark,我对Python和Spark还相当陌生,但让我看看是否可以解释我正在尝试做什么 我有很多不同类型的页面需要处理。我为这些页面的所有公共属性创建了一个基类,然后从基类继承了一个特定于页面的类。其想法是,spark runner在调用时只需更改页面类型,就可以对所有页面执行完全相同的操作 跑步者 def CreatePage(pageType): if pageType == "Foo": return PageFoo(pageType) elif pageType == "
def CreatePage(pageType):
if pageType == "Foo":
return PageFoo(pageType)
elif pageType == "Bar":
return PageBar(pageType)
def Main(pageType):
page = CreatePage(pageType)
pageList_rdd = sc.parallelize(page.GetPageList())
return = pageList_rdd.mapPartitions(lambda pageNumber: CreatePage(pageType).ProcessPage(pageNumber))
print Main("Foo")
PageBaseClass.py
class PageBase(object):
def __init__(self, pageType):
self.pageType = None
self.dbConnection = None
def GetDBConnection(self):
if self.dbConnection == None:
# Set up a db connection so we can share this amongst all nodes.
self.dbConnection = DataUtils.MySQL.GetDBConnection()
return self.dbConnection
def ProcessPage():
raise NotImplementedError()
PageFoo.py
class PageFoo(PageBase, pageType):
def __init__(self, pageType):
self.pageType = pageType
self.dbConnetion = GetDBConnection()
def ProcessPage():
result = self.dbConnection.cursor("SELECT SOMETHING")
# other processing
为了简洁起见,我省略了许多其他特定于页面的功能,但我的想法是,我希望在page类中保留如何处理该页面的所有逻辑。并且,能够共享诸如db连接和s3存储桶之类的资源
我知道现在的方式是为rdd中的每个项目创建一个新的页面对象。有没有办法做到这一点,使它只创建一个对象?有更好的模式吗?谢谢 一些建议:
- 不要直接创建连接。使用连接池(因为每个执行器使用单独的进程将池大小设置为1就可以了),并确保连接在超时时自动关闭)
- 用于存储池并调整代码以使用它检索连接
- 您将无法在节点之间或甚至在单个节点内共享连接(请参阅关于单独进程的注释)。您可以得到的最佳保证是每个分区(或具有解释器重用的多个分区)有一个连接