壳牌石油用例:并行大型模拟与Apache SparkR砖
2017年6月23日 在公司博客上
这篇博客是壳之间的联合工程工作的数据科学团队(韦恩·w·琼斯和丹尼斯Vallinga)和砖(侯赛因Falaki)。
介绍
Apache 2.0火花引入了一个新家庭的apiSparkRApache火花R接口,让用户现有R函数并行化。新有斑纹的,新闻出版总署和spark.lapply方法为R用户开放的令人兴奋的可能性。在这篇文章中,我们提出一个用例细节共同完成的壳牌石油公司和砖。
用例:长袜的建议
在壳牌,当前的袜子实践通常是由供应商推荐的组合,之前的操作经验和“直觉。”因此,有限的重点是指向包含历史数据在这些决策,这有时会导致过度或不足的股票被关押在壳牌的位置(例如,一个石油钻井平台)。
原型工具,库存优化分析解决方案,证明,壳可以使用先进的数据分析技术在SAP库存数据:
- 优化仓库库存水平
- 预测安全库存水平
- 合理化缓慢移动的材料
- 审查和重新分配非现成和股票项目材料清单
- 确定材料的临界(例如,通过材料清单链接,过去使用或交货时间)
计算推荐的贮存材料库存水平要求,数据科学团队实现了一个马尔可夫链蒙特卡罗(密度)引导统计模型在r模型应用于每一个材料(通常是3000 +)发布在50 +壳位置。每个材料模型涉及到模拟10000年获得迭代来捕获的历史分布问题。累计计算的任务是大,但幸运的是,是一个高度平行的性质,因为独立模型可以应用到每个材料。
现有的设置
完整的模型是目前执行48核,192 gb的RAM独立物理离线电脑。获得引导模型是一组自定义构建的函数使用一个第三方R包的数量(“fExtremes”、“ismev”、“dplyr”、“tidyr”,“stringr”)
。
脚本遍历每个壳位置和分布的历史材料分成大致相等大小的组在48芯材料。每个核心然后迭代模型适用于每一个个人材料。我们分组每个材料的材料,因为一个简单的循环会产生太多的开销(例如开始R过程等)因为每个计算需要2 - 5秒。材料的分配小组工作在内核实现通过R平行包。当最后一个个体的48个核心工作完成,脚本将继续到下一个位置和重复的过程。脚本需要的总时间大约48小时来计算所有壳牌的推荐库存水平位置。
使用Apache火花砖
而不是依靠一个大机与许多核心,壳牌决定使用集群计算规模。新的R API在Apache火花是一个适合这个用例。两个版本的开发工作负载SparkR的原型来验证可伸缩性和性能。
样机我:一个概念证明
第一个原型,我们试图减少代码的数量变化的目标是快速验证新的SparkR API可以处理工作负载。我们有限的变化模拟步骤如下:
为每个壳位置列表元素:
- 作为一个火花DataFrame并行化输入日期
- 使用
SparkR:新闻出版总署()
执行并行仿真的每个块。
有限的改变现有的仿真代码库,我们可以减少仿真总时间3.97小时50个节点火花集群砖。
原型II:改善性能
第一个原型很快实现,它遭受了一个明显的性能瓶颈:火花工作启动的每个迭代模拟。数据是高度倾斜的结果,在每个工作大多数执行人空闲等待straglers完成之前从下一份工作可以承担更多的工作。进一步,在每个工作的开始,我们花时间并行的数据作为一个火花DataFrame虽然大多数CPU核的集群处于空闲状态。
解决这些问题,我们修改了预处理步骤输入和辅助生产前期所有位置和材料日期值。输入数据是作为大型火花DataFrame并行。接下来,我们使用一个单一的SparkR:新闻出版总署()
电话两个键:位置ID和材料ID执行模拟
与这些简单的改进,我们可以减少仿真时间45分钟50节点火花集群数据砖。
改进SparkR
SparkR是最新添加Apache火花,和应用
API的家人当时最新的SparkR之外的工作。通过这个实验,我们发现了一个SparkR的局限性和缺陷数量和固定在Apache火花。
- (火花- 17790)支持并行R data.frame大于2 gb
- (火花- 17919)在SparkR超时RBackend配置
- (火花- 17811)SparkR不能并行化与NA或NULL data.frame日期列