Spark:如何在映射转换中构造一系列副作用动作以避免重复?

时间:2016-05-31 08:48:40

标签: email apache-spark spark-streaming map-function

我有一个需要采取以下步骤的火花流应用程序:

  1. 取一个字符串,对其应用一些地图转换
  2. 再次映射:如果此字符串(现在是数组)中包含特定值,请立即发送电子邮件(或在spark环境外执行某些操作)
  3. 收集()并保存在特定目录中
  4. 应用其他一些转型/浓缩
  5. 收集()并保存在另一个目录中。
  6. 正如您所看到的,这意味着延迟激活计算,它会执行两次OUTSIDE操作。我试图避免缓存,因为每秒几百行这会杀死我的服务器 同时试图维持操作顺序,虽然这并不重要:有没有我不知道的解决方案?

    编辑:我的节目截至目前:

    kafkaStream;
    lines = take the value, discard the topic;
    lines.foreachRDD{
        splittedRDD = arg.map { split the string };
        assRDD = splittedRDD.map { associate to a table };
        flaggedRDD = assRDD.map { add a boolean parameter under a if condition + send mail};
        externalClass.saveStaticMethod( flaggedRDD.collect() and save in file);
        enrichRDD = flaggedRDD.map { enrich with external data };
        externalClass.saveStaticMethod( enrichRDD.collect() and save in file);
    }
    

    我把保存部分放在电子邮件之后,以便在出现问题时至少发送邮件。

1 个答案:

答案 0 :(得分:0)

我找到的最后两种方法是:

  1. 在副作用之前的DStream转换中,制作Dstream的副本:一个将继续转换,另一个将具有.foreachRDD{ outside action }。这没有重大缺点,因为在工作节点上只有一个RDD。
  2. 从转化中提取{outside action}并映射已发送的邮件:过滤邮件是否已发送。这几乎是一个多余的操作,因为它会过滤掉所有RDD元素。
  3. 在继续之前缓存(虽然我试图避免它,但没有太多事情要做)
  4. 如果尝试不缓存,解决方案1是要走的路