【问题标题】:Running parallel function calls with sparklyr使用 sparklyr 运行并行函数调用
【发布时间】:2020-12-22 10:22:32
【问题描述】:

目前,我正在使用 doparallel 库中的 foreach 循环在同一台机器的多个内核上并行运行函数调用,如下所示:

out_results=foreach(i =1:length(some_list))%dopar%
{
   out=functions_call(some_list[[i]])
   return(out)
}

这个some_list是一个数据框列表,每个数据框会有不同的列数,function_call()是一个对数据做多种事情的函数,比如数据操作,然后使用用于变量选择的随机森林,然后最后执行最小二乘拟合。变量 out 还是一个包含 3 个数据框的列表,而 out_results 将是一个列表列表。 我在函数调用中使用 CRAN 库和我创建的一些自定义库,我想避免使用 spark ML 库,因为它们的功能有限并且需要重写整个代码。

我想利用 spark 并行运行这些函数调用。有可能这样做吗?如果可以,我应该考虑哪个方向。我从 sparklyr 阅读了很多文档,但似乎没有多大帮助,因为那里提供的示例非常简单。

【问题讨论】:

  • 一秒钟的谷歌搜索将为您指明前进的方向。你已经尝试了什么?为什么它不起作用?
  • @PierreGramme 你有什么建议吗?我知道我以非常模糊的方式提出了上一个问题,我们可以使用 spark_apply 函数并行执行回归问题,但我真正的问题是我编辑过的问题。对造成的误解深表歉意。

标签: r apache-spark parallel-processing sparkr sparklyr


【解决方案1】:

SparklyR's homepage 给出了分布在 Spark 集群上的任意 R 代码示例。特别是,请参阅他们的分组操作示例。

您的主要结构应该是一个数据框,您将按行对其进行处理。可能类似于以下内容(未测试):

some_list = list(tibble(a=1[0]), tibble(b=1), tibble(c=1:2))
all_data = tibble(i = seq_along(some_list), df = some_list)

# Replace this with your actual code. 
# Should get one dataframe and produce one dataframe. 
# Embedded dataframe columns are OK
transform_one = function(df_wrapped) {
  # in your example, you expect only one record per group
  stopifnot(nrow(df_wrapped)==1)
  df = df_wrapped$df
  
  res0 = df
  res1 = tibble(x=10)
  res2 = tibble(y=10:11)
  
  return(tibble(res0 = list(res0), res1 = list(res1), res2 = list(res2)))
}

all_data %>% spark_apply(
  transform_one,
  group_by = c("i"), 
  columns = c("res0"="list", "res1"="list", "res2"="list"),
  packages = c("randomForest", "etc")
)

总而言之,这种方法看起来很不自然,就好像我们在一个不适合的任务上强制使用 Spark。也许您应该检查另一个并行化框架?

【讨论】:

  • 我不确定是否可以查看另一个框架,因为机器的权限非常有限。几天前我尝试了 spark_apply,问题是它不允许我嵌套函数,不要'不知道我是否做错了什么,但如果在 transform_one 中有另一个函数调用,它将引发错误。另一方面,如果我使用 sparkR 中的 spark.lapply,它可以很好地处理嵌套调用,并且不需要 spark_tbl 输入.还有一件令我感到困惑的事情是,如果我有 10 个工作人员并且这个函数需要被调用 100 次,它不会将 10 个调用拆分给每个工作人员吗?
  • 另外,我是新手,如有任何愚蠢的问题,请提前道歉。
  • 您现在描述的问题与您最初的问题完全不同。请提出一个新问题
猜你喜欢
  • 2017-02-17
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 2013-09-17
  • 1970-01-01
  • 2014-06-05
相关资源
最近更新 更多