【问题标题】:User agent parser (ua-parser) slows down Spark on EMR用户代理解析器(ua-parser)减慢 EMR 上的 Spark
【发布时间】:2020-03-27 10:09:10
【问题描述】:

我在我的 UDF 中使用 ua-parser 来解析用户代理信息。而且我注意到这些作业与没有解析器的作业相比非常慢。这是一个例子:

import org.uaparser.scala.Parser
val parser: Parser = Parser.default
val parseDeviceUDF = udf((ua: String) => Try(parser.parse(ua).device.family).toOption.orNull)

奇怪的是,当我将作业作为 EMR 步骤提交时,速度很慢,但当我在 Zeppelin 或 Spark shell 中运行相同的代码时,它工作正常。我将数据写入镶木地板文件。这就是它被卡住的阶段。

【问题讨论】:

  • Zeppelin/shell 测试和实际工作中的数据大小是否存在差异?我会使用 UA 解析器并将其添加到我的项目中并添加一些日志记录以查看其行为 - 也许它初始化太多次。我还看到有一个缓存解析器,它可能会解决你的问题。

标签: scala apache-spark user-defined-functions amazon-emr parquet


【解决方案1】:

我即将给出的答案不是关于开源项目,但它确实提供了任何正在研究如何解析用户代理字符串以获得device intelligence 的人都想知道的信息。

WURFL 是一个历史悠久的工具,用于进行用户代理(以及更普遍的 HTTP 请求)分析并获取易于使用的设备/浏览器信息。 ScientiaMobile 最近发布了一个 WURFL 版本(称为 WURFL 微服务),可以从 AWS、Azure 和 GCP 的主要市场获得(当然除了 ScientiaMobile 本身)。

在本例中,将 Spark 用户从 HTTP 日志带到设备数据的 (Java) 代码如下所示。

    JavaDStream enrichedEvents = events.map(evs -> {
WmClient wmClient = WmClientProvider.getOrCreate(wmServerHost, "80");
      for (EnrichedEventData evItem : evs) {
...
      HttpServletRequestMock request = new HttpServletRequestMock(evItem.getHeaders());
      Model.JSONDeviceData device = wmClient.lookupRequest(request);
      evItem.setWurflCompleteName(device.capabilities.get("complete_device_name"));
      evItem.setWurflDeviceMake(device.capabilities.get("brand_name"));
      evItem.setWurflDeviceModel(device.capabilities.get("model_name"));
      evItem.setWurflFormFactor(device.capabilities.get("form_factor"));
      evItem.setWurflDeviceOS(device.capabilities.get("device_os") + " " + \
                                      device.capabilities.get("device_os_version"));
...
   }
   return evs;
});

有关如何集成 Spark 和 WURFL 的更多信息,请访问this article

免责声明:我是 ScientiaMobile 的 CTO 和 WURFL 的原创者。

【讨论】:

    猜你喜欢
    • 2013-12-06
    • 1970-01-01
    • 2018-02-16
    • 2011-08-05
    • 2012-10-24
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多