在python中调用类方法的mapPartitions

时间:2016-09-19 14:41:29

标签: python apache-spark

我对Python和Spark很新,但让我看看能不能解释一下我想做什么。

我想要处理一堆不同类型的页面。我为这些页面的所有常见属性创建了一个基类,然后从基类继承了一个特定于页面的类。我们的想法是,通过在调用时更改页面类型,spark runner将能够为所有页面执行完全相同的操作。

转轮

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

我从简洁中省略了许多其他页面特定的功能,但我的想法是,我想保留如何在页面类中处理该页面的所有逻辑。并且,能够共享数据库连接和s3存储桶等资源。

我知道我现在的方式,就是为rdd中的每个项目创建一个新的Page对象。有没有办法做到这一点,它只是创建一个对象?这有更好的模式吗?谢谢!

1 个答案:

答案 0 :(得分:0)

一些建议:

  • 不要直接创建连接。使用连接池(因为每个执行程序使用单独的进程设置池大小就好了)并确保连接在超时时自动关闭)。
  • 使用Borg pattern存储池并调整代码以使用它来检索连接。
  • 您将无法在节点之间共享连接,甚至无法在单个节点内共享连接(请参阅有关单独进程的注释)。您可以获得的最佳保证是每个分区(或许多具有解释器重用的分区)的单个连接。