sharetwitterlinkedIn

智联招聘为何选择 Pulsar SQL 进行搜索日志分析

head img

作为中国最大的在线招聘和职业平台之一,智联招聘拥有1.4亿活跃用户和400万家合作公司。智联招聘提供高质量的用户体验,其中求职服务发挥着关键作用。智联招聘的求职服务每天支持大量的用户搜索请求,并生成大规模的搜索日志。这些日志非常有价值,可用于故障排除或大数据分析。

为了改善他们的求职服务和用户体验,智联招聘将 Pulsar SQL 添加到他们现有的 Pulsar 实施中。 Pulsar SQL 使智联招聘能够通过使用某些限制需要搜索的数据量的参数来优化查询。 Pulsar SQL 还提供公司用来分析和汇总数据的各种报告。本文涵盖了智联招聘的一些典型使用场景,并解释了 Pulsar SQL 如何使公司能够更高效地查询流数据。

智联招聘不断探索有效使用搜索日志的新方法,Pulsar 继续为公司的努力提供灵感。

要求

以下是智联招聘想要解决的一些场景:

  • 当搜索结果不符合预期时——比如排名靠前的位置没有显示在顶部或搜索服务出现错误时——使用trace ID获取与求职相关的原始参数, 包括关键字、城市、薪水等,以及其他参数,例如上次更新简历的时间。 然后,使用相关参数来识别和分析问题。
  • 分析与求职者申请的职位相关的搜索条件,例如该职位首次接触该用户的时间,以改进搜索服务。
  • 从不同的角度分析搜索日志,并生成以不同方式汇总数据的图表,例如按城市、职业或关键字排名。 通过这种方式,可以通过使其更具体来改进搜索服务。

为什么选择 Pulsar SQL?

其他产品也能够为上述场景生成类似的数据。 那么,智联招聘为什么最终选择了 Pulsar SQL? 主要原因有以下三个:

  • 由于智联聘是中国第一家采用 Pulsar 的公司,他们已经拥有成熟的 Pulsar 消息系统。 这使得集成 Pulsar SQL 的日志消息变得容易。
  • Pulsar SQL 允许使用 SQL 语法进行查询,前提是消息发送到 Pulsar。
  • Pulsar SQL 可以保存大量数据,易于扩展。

消息处理流程

在智联招聘,消息处理流程如图1所示。可以看到,原始搜索日志消息的处理方式有两种:数据拆分和数据聚合。 数据拆分涉及在不同主题之间分配求职请求和响应数据,然后根据用户 ID 或职位 ID 在不同分区之间拆分数据。 数据聚合旨在按类别生成图表以提高搜索效率。 例如,您可以按职业每分钟聚合一次数据,然后专注于在那一分钟内完成的搜索。 如果有 1000 万条原始搜索日志,那么聚合数据可能只有几千条搜索日志。

图 1. 智联招聘的消息处理流程
# Pulsar SQL 使用场景

职位曝光查询

智联招聘会定期执行查询以检查给定时间段内头寸的曝光情况。 图 2 展示了一个典型的工作公开查询示例。 为每次曝光分配一个分数。 屏幕截图的浅绿色部分显示了每次曝光的查询参数,例如关键字、返回值等。 与搜索相关的详细信息可用于稍后执行进一步的分析和优化。

查询页面根据需要生成查询参数。 例如,当用户选择发布时间时,参数会自动更改。

为了保护公司的机密,这张图片看起来像素化了。
图 2. 作业查询示例

报告分析

在消息系统聚合数据后,可以使用 Pulsar SQL 生成四种不同类型的报告。 图 3 提供了每个示例。 这些报告使智联招聘能够按类别比较数据,例如时间、职业等。

为了保护公司的机密,这张图片看起来像素化了。
图 3. Pulsar SQL 可以生成的报告示例

智联招聘如何使用 Pulsar SQL 查询流数据

Pulsar SQL 通过利用 Presto™ 从 Pulsar 存储层检索数据来简化流数据查询。 优点是您可以直接使用消息传递 API 编写数据,并使用 Pulsar SQL 查询数据,而无需将数据移动到另一个数据库。 (有关与 Pulsar SQL 相关的概念和架构的详细信息,请访问 此处。)

Pulsar SQL 可以很好地将 Pulsar 模式映射到表模式。 因此,当使用 struct schema 写入数据时,Pulsar SQL 可以根据 struct schema 中定义的属性过滤或聚合数据。 这是智联招聘使用 Pulsar SQL 最常见的方式。

以下部分说明如何将搜索行为数据存储到 Pulsar 主题中,然后使用 Pulsar SQL 进行查询。

使用 Pulsar 结构模式将数据写入主题

当用户在 www.zhaopin.com 上进行职位搜索时,他们通常会指定某些关键字以将搜索范围限制在相关职位上。 在改善用户体验方面,记录和分析用户的搜索行为至关重要。 这就是智联招聘使用 Pulsar 模式注册表将搜索行为数据存储在主题中的原因。

以下是您将求职请求数据和求职响应数据写入主题的方法:

  1. 在终端中,创建单独的主题,用于存储求职请求数据和求职响应数据。 对于此示例,我们创建了两个名为“persistent://search/job/requests”和“persistent://search/job/responses”的主题。
  2. 为 Pulsar 主题定义模式。 为了使以下示例保持简单,我们仅使用了基本数据属性。

    请注意,有几种方法可以定义 Pulsar 模式。 在智联招聘,我们通常使用 JavaBean,但您可以在 这里 找到更多选项。

    public class JobSearchRequest {
        private String traceId; // Identify a job search request.
        private Long userId; // Who sent the job search request, the value can be null.
        private Date requestTime; // Request time of the search request.
        private int cityId;  // City ID that user specified.
        private String keywords; // Keywords that user input of the search request.
    }
    public class JobSearchResponse {
            private String traceId; // Identify a job search request.
            private long jobId; // The returned job ID for the user.
    }
    
  3. 现在,创建将数据写入主题的生产者:

    Producer<JobSearchRequest> producer = pulsarClient.newProducer(Schema.JSON(JobSearchRequest.class)).topic("persistent://search/job/requests").create();
    producer.sendAsync(request);
    Producer<JobSearchResponse> producer = pulsarClient.newProducer(Schema.JSON(JobSearchResponse.class)).topic("persistent://search/job/responses").create();
    producer.sendAsync(response);
    

查询 Pulsar 主题中的数据

一旦我们将一些数据写入“求职请求”和“求职响应”主题,我们就可以使用 Pulsar SQL 查询这些数据。 使用 Pulsar SQL 命令行工具查询数据的步骤如下所示。

  1. 首先,启动Pulsar SQL命令行工具:

    cd apache-pulsar
    bin/pulsar sql
    
  2. 现在,编写 SQL 语言来查询数据,如下例所示。

    SELECT count(*) as c, keywords FROM pulsar."search/job".requests WHERE requestTime = current_date GROUP BY keywords ORDER BY c DESC LIMIT 10;
    

    示例 #2:要显示没有产生工作的工作搜索请求,请输入

    SELECT traceId FROM pulsar."search/job".requests EXCEPT SELECT traceId FROM pulsar."search/job".response;
    

如您所见,该过程很简单。 此外,许多数据分析工具,例如 Metabase®、Apache Superset 和 Tableau®,都可以使用 Presto 数据源与 Pulsar SQL 集成。 在这些工具的帮助下,数据分析变得更加方便和通用。 在智联聘,我们使用元数据库。

此外,REST API 提供了另一种查询数据的方法。 命令行查询工具在终端中显示数据,而 REST API 在应用程序中显示相同的数据,例如后端服务或 Web 应用程序。 这些方法可以应用于不同的场景。 REST API 使用 Pulsar SQL 提供的接口。 有关如何使用 REST API 的更多信息,请访问 此处

提高查询效率

涉及扫描大量数据的查询可能非常耗时且效率低下。 Pulsar SQL 提供了两种提高查询效率的方法。 用户可以增加分区数量或缩小所选日期范围。 下面详细介绍这两种方法。

方法#1:增加分区数

从 2.5.0 版本开始,Pulsar 支持对内部列进行分区的能力,从而提供了一种在不同分区上执行内部数据查询的方法。 因此,可以使用分区策略以指数方式提高查询性能。 例如,您可以在发送 Pulsar 消息时按作业 ID 对作业数据进行分区,如下所示。

select traceid, __partition__ from "sql|stat"."position-monitor-detail-jdid-partition-1" limit 100
select traceid, __partition__ from
"sql|stat"."position-monitor-detail-jdid" where __partition__ = 1 limit 100
select traceid, __partition__ from "sql|stat"."position-monitor-detail-jdid" where __partition__ in (1,2) limit 100

智联招聘刚开始使用 Pulsar 时,只能使用真实的主题名称执行查询。但是,在 Pulsar 中,逻辑主题名称不被视为真正的主题名称。现在社区已经添加了源属性,partition 可以作为搜索字段,在执行查询时放置在搜索条件中。

第一行代码展示了如何通过真实的主题名称查询分区 1 中的数据。第二行显示如何通过逻辑主题名称查询相同的数据。最后一行展示了如何通过逻辑主题名称查询多个分区中的数据;这种类型的查询不能使用真实的主题名称来完成。

方法 #2:限制 _publish_time_ 范围

缩小选定的发布时间范围还可以显着提高查询性能,因为它减少了要扫描的数据量。在源数据中紧跟 where 条件后指定字段 _publish_time_,如下所示。此示例说明如何在发布时间在 2019 年 11 月 15 日 09:00:00 之后的分区 1 上一次查询 100 条消息。

请注意,查询页面会相应地生成查询参数。

select * from "sql|stat"."position-monitor-detail-jdid"
where __partition__ = 1
and __publish_time__ > timestamp '2019-11-15 09:00:00'
limit 100

在 BookKeeper 中进行条目时优化性能

Pulsar 2.5.0 提供了更多在 pulsar.config 中配置托管分类帐和 BookKeeper 客户端的方法。 智联招聘最重要的变化是增加了 bookkeeper-throttle-value 参数,它使用户能够在 BookKeeper 中进行条目时优化性能。 有关详细信息,请访问 此处

结论

智联招聘现在使用 Pulsar SQL 执行数据搜索和聚合分析以进行故障排除。 Pulsar SQL 提高了在招聘业务两端搜索用户使用场景时的效率。 例如,日志搜索需要公司的公共日志搜索工具,搜索原始搜索参数的步骤很复杂。 但是,Pulsar SQL 提供的工具可以帮助使搜索更简单、更具体。 通过 Pulsar SQL 的加入,智联招聘提高了其大规模搜索业务的效率,解决了日常搜索场景中的一些问题,比如节省更多的数据,查询效率更高。

智联招聘已成功证明,Pulsar SQL 的简单方法使其成为严重依赖搜索的企业和行业的经济高效的解决方案。

未来展望

智联招聘期待在未来实现更多的业务支撑功能和更丰富的使用场景。 具体来说,智联招聘希望能够做到以下几点:

  • 使用 Pulsar SQL 按特定消息 ID 查询消息。
  • 将 Pulsar SQL 与 Pulsar Functions 相结合,提高数据处理和聚合的效率。 (有关如何使用 Pulsar Functions 创建复杂处理逻辑的信息,请访问 此处。)
  • 实现更多使用场景,例如查看热门职位、热门简历、热搜词等功能,从而提升求职者和求职者的用户体验。

你可以【下载成功案例的硬拷贝】(https://streamnative.io/whitepaper/applying-apache-pulsar-sql-to-zhaopin-search-log-analysis-significantly-improved-search-and- 查询效率)。

© 北京原流科技有限公司Apache、Apache Pulsar、Apache BookKeeper、Apache Flink 及相关开源项目名称均为 Apache 软件基金会商标。条款隐私