微信号:jishuqushi

介绍:除了技术干货,这里啥也没有了.

Pinterest黑科技,从非结构化数据洞察主题流行趋势

2016-05-04 17:37 风向标的小伙伴
堪称图片版的Twitter的 Pinterest,实现了一个可以通过处理非结构化数据来推测Pinterest上主题流行趋势的工具。他们的工程师在技术博客上撰文详细解释了这个工具。


Pinners对什么主题感兴趣?他们什么时候对这些主题最感兴趣,又是如何被吸引到这些主题上来的?


为了回答这些问题,我们建立了一个内部Web服务器来考察一些非结构化的数据,从而更好地理解Pins主题随着时间变化的趋势,以便向Pinners提供更好的产品界面。这个工具还可以显示目前最流行的Pins主题,也可以做出Pins主题与搜索的关键词随时间变化的趋势。




个工具的应用案例之一是它可以帮助我们理解Pinners对什么主题最感兴趣,这个兴趣点通常是何时发生的,以及Pinners是如何被吸引到这些兴趣点上的。尤其是兴趣点是何时发生的这种情况。我们将关键词对时间的曲线做出来,就很容易识别一些季节性的或趋势性的主题,但是最重要的见解来自于对Pinner在这些流行主题上的行为模式的理解。




比如搜索一个节日——情人节,可以看到这个话题大约于2月14日之前两个月开始热门起来。但是仅仅知道这个是不够的,还要确定应该什么时间来推荐什么商品。


可以看到,男性Pinners在这个话题达到热议高峰之前就开始寻找一些商品了。这是一些具有前瞻性思维的个体,他们寻找情人节礼物并进行预订。


在情人节之前2~3天,男性Pinners主要关注的是DIY手工和烘焙食品,以及一些不需要很多时间,或者可以前一晚在便利店购买的东西。


而在情人节当天,我们可以看到很多关于寂寞的幽默段子。我们也可以看到某些时刻有订婚的趋势。


男性Pinners在情人节的关注趋势



2015年1月 — 商品


2015年2月初 — DIY和烘焙食品


2015年2月14日 — 关于孤独的段子


动机

对于关键词趋势探索方案的核心部分是能够对全文进行搜索。虽然MapReduce是一个很好的Pins话题的结构化内容的查询方案,但在需要进行全文搜索的时候,它太慢了。而ElasticSearch则提供了一个分布式的全文搜索引擎。


通过用ElasticSearch搜索关于Pins的非结构化数字(比如描述、标题和兴趣等),我们创造了一种工具,这种工具可以实时处理全文查询,并可以将有关Pins的趋势以一种对用户友好的方式可视化。或者说,这个工具提供了一个对Pin描述和搜索查询的关键词搜索:

 

  • 根据给定的关键词找到最热门的N个Pins话题或搜索查询

  •  显示和比较随时间变化的趋势,包括回复Pin话题的数量和日线搜索的数量


此外,该工具还可以从多种部位搜索关键词,包括位置、性别、兴趣、类别和时间等等。


实现方法
  • 提取与Pins话题有关的所有文本

  • 将Pin文本输入到ElasticSearch中 

  • 搜索文本数据(由ElasticSearch进行)

  • 在应用后端建立一个服务调用ElasticSearch API

  • 使用Flask和ReactJS在应用前端将数据可视化



难点


数据收集:


收集关于一个Pin话题所有的文本(包括描述、标题、标签、兴趣、类别和时间戳,以及Pinner人员统计等)需要复杂的可以扩展的逻辑。我们每天晚上都使用了一系列的Hive和Cascading工作(都基于MapReduce框架)运行Pinball工作流来提取和转存前一天与Pins相关的所有的文本,并用ElasticSearch对其进行检索。


设计:


既然有许多默认的高容量的时间序列的项目(包括Logstash),这个工具的一个主要设计决策便是使用日线指标。使用日线指标对整个系统的可扩展性和性能有一些好处,包括:


  • 在指定时间范围方面增加灵活性

  • 作为多个节点的分布式文件的结果,具有更快的读取速度

  • 将每一次查询所涉及到的索引数目最小化,以避免额外的开支 

  • 通过并行调入的方式批量插入或批量读取

  • 在失败后更容易恢复

  • 更容易调整集群的性能(#碎片,复制等)。更小的指数意味着在测试这些不可改变的属性时具有更快的迭代速度。


可扩展性:


尽管使用了大数据技术,我们在工作过程中仍然面临着各种可扩展性挑战。因为很容易对足够多的数据进行简单的Hive查询,所以我们优化了Hive查询设置,切换到Cascading工作,而在实施选择上做了一些让步。


每天都会产生超过14GB的数据,大约两年的数据值得存储(总共大约10TB的数据),因此我们的ElasticSearch集群面临一个更大的可扩展性的问题。我们不得不增加更多的节点来持续扩展我们的集群。现在我们有33 i2.2xlarge个搜索节点和3 m3.2xlarge个主要节点。虽然ES不是主要的永久储存,不需要在复制的时候提供对防止数据丢失的保护,我们仍然决定将复制因子设定为1(即所有数据都有两份拷贝)来在多个服务器上分散负载。


性能:


在推出我们工具的原型之后,随着用户数量的增长,我们看到了这个工具在应用性能上仍有很大的改进空间。我们从原始的HTTP请求切换到ElasticSearch Python客户端,并且优化了我们服务器的ElasticSearch查询代码,这导致我们产品的性能有了两倍的提升。为了达到更频繁的查询同样具有瞬间输出的效果,我们还实现了服务器端与客户端的缓存。所有这些优化的最终结果是用户的二次查询。


成果:


这个创新的工具已经获得了巨大的成功。这个工具已经在Pinterest内部被广泛用来洞察Pinner的想法,理解流行的内容,甚至是检测垃圾邮件。


推荐阅读
 

1. Java, Groovy, Scala 和 Kotlin,谁更适合用于Android开发?

2. iOS开发神器Injection for Xcode:成吨的提高开发效率

3. 让程序员快乐其实很简单,都在这些细节里 

4. 微信二维码登录原理  

5. Git常用命令总结

6. 15个你必须知道的Facebook开源项目

7. 深入研究Android推送技术

8. 【脑洞】程序员眼中的世界名画


微信公众号"技术风向标",关注IT趋势,承载前沿、深入、有温度的内容。长按下方二维码加关注。

 
技术风向标 更多文章 阿里赵海平现象:《QClub:Docker专场》的开场致辞 Stack Overflow报告给开发者哪些启示 | 技术解读 OneAPM创始人何晓阳:APM将是开发者必备服务 架构之重构的12条军规(上) 热点解读:Docker官方进军中国
猜您喜欢 一号车网招聘测试工 年底跳槽季,你是该跳,还是该留? TesterHome 2015年 分红发放通知 一分钟实现分布式锁 Python序列循环移位的3种方法