Spark Scala—批量并行处理不同的子数据帧
我正在从事一个欺诈交易检测项目,该项目利用spark,主要使用基于规则的方法对传入交易进行风险评分。对于这种基于规则的方法,从历史数据创建几个映射来表示事务中的各种模式,然后在以后对事务进行评分时使用这些映射。由于数据量的快速增加,我们现在正在修改代码以在每个帐户级别生成这些映射 早期的代码是为eg编写的Spark Scala—批量并行处理不同的子数据帧,scala,apache-spark,parallel-processing,apache-spark-sql,outliers,Scala,Apache Spark,Parallel Processing,Apache Spark Sql,Outliers,我正在从事一个欺诈交易检测项目,该项目利用spark,主要使用基于规则的方法对传入交易进行风险评分。对于这种基于规则的方法,从历史数据创建几个映射来表示事务中的各种模式,然后在以后对事务进行评分时使用这些映射。由于数据量的快速增加,我们现在正在修改代码以在每个帐户级别生成这些映射 早期的代码是为eg编写的 createProfile(clientdata) 但现在它变成了 accountList.map(account=>createProfile(clientData.filter(s“”“a
createProfile(clientdata)
但现在它变成了
accountList.map(account=>createProfile(clientData.filter(s“”“account=${account}”))
使用这种方法,可以生成概要文件,但由于这些操作是按顺序进行的,因此似乎不可行
此外,createProfile函数本身正在使用数据帧、sparkContext/sparkContext,因此,这导致无法将这些任务发送到工作节点的问题,因为据我所知,只有驱动程序才能访问数据帧和sparkContext/sparkContext。因此,以下代码不起作用
导入sparkSession.implicit_
val accountListRdd=accountList.toSeq.toDF(“accountNumber”)
accountList.rdd.map(accountrow=>createProfile(clientData.filter(s“”“account=${accountrow.get(0.toString})”)))
上述代码不起作用,但表示所需输出行为的逻辑
我正在研究的另一种方法是使用scala Future在驱动程序级别使用多线程。但即使在这种情况下,在单个createProfile
函数调用中也会创建许多jvm对象,因此通过增加线程,即使这种方法可行,也会导致大量jvm对象,这本身会导致垃圾收集和内存开销问题
从时间角度来看,createProfile对于一个帐户平均需要10分钟,我们有3000个帐户,所以按顺序需要很多天。使用多线程,即使我们达到10倍,也需要很多天。所以我们需要100秒左右的并行性
如果它存在的话,其中一个可能有效的方法是..假设groupBy类操作中存在类似spark groupBy的东西,在第一级,我们可以按“帐户”分组,然后执行其他操作
(目前的问题是UDF无法处理我们想要执行的操作)
另一个可行的解决方案是SPark流媒体的工作方式-
它有一个forEachRDD
方法和spark.streaming.concurrentjobs
参数,允许并行处理多个rdd。我不确定它是如何工作的,但这种实现可能会有所帮助
以上是问题描述和我目前对它的看法
如果有人对此有任何想法,请告诉我!另外,我更喜欢逻辑上的改变,而不是对不同技术的建议