可以激发远程节点上的执行表操作吗? (与行操作相比)

时间:2017-06-16 18:00:09

标签: apache-spark apache-spark-mllib

大多数spark的数据集功能都是每行操作。但是,我想分发ML任务的执行以在Spark上运行 - 大多数ML任务自然是表的功能操作,而不是行的自然功能。 (我看过MLLib - 它的方式太有限了,在很多情况下,通过在许多核心上进行分布操作,可以使执行速度降低几个数量级,而这些核心可以放在单个核心上。)

ML算法处理行集合而非单行集合非常重要,因此我想将表格实现到节点上的内存中。 (我小指承诺它将适合核心)。我怎么能这样做?

从功能上讲,我想这样做:

def mlsubtask(table, arg2, arg3):
     data = table.collect()
     ...

sc = SparkContext(...)
sqlctx = SQLContext(sc)
...
df = sqlctx.sql("SELECT ...")
results = sc.parallelize([(df,arg2,arg3),(df,arg2,arg3),(df,arg2,arg3)]).map(mlsubtask).collect()

如果可以执行如下执行:

sc = SparkContext(...)
sqlctx = SQLContext(sc)
...
df = sqlctx.sql("SELECT ...")
df = df.collect()
results = sc.parallelize([(df,arg2,arg3),(df,arg2,arg3),(df,arg2,arg3)]).map(mlsubtask).collect()

...但是这会将数据带到客户端,然后重新序列化并且非常低效。

1 个答案:

答案 0 :(得分:0)

对于单个任务:

def mlsubtask(iter_rows):
    data_table = list(iter_rows) # Or other way of bringing into memory.
   ...

df.repartition(1).mapPartitions(mlsubtask)