方便分享囚监狱风云2:逃犯 电影影不


点击箭头处“蓝色字”关注我們哦!!

2019年的主要工作就是围绕Flink来做一些事情,分为以下几个方面:

接下来详细说一下在这几个方面做的一些事情以及如何解决遇到的一些问题与将要做的事情

首先看一下目前关于Flink使用的整体架构图,任务执行模式选择per-job on yarn方便于经常会对集群资源动态调整的需求,每个任務的日志也可以单独剥离开来方便排查问题经过Flink计算的结果数据会输出到外部存储,对于业务上的实时计算会输出到MySql/HBase , 然后由上层的统一數据服务查询接口查询数据用于可视化平台数据展示;对于一些监控类的数据会输出到Influxdb中然后由Grafana做数据可视化与告警;另外还有一部分輸出到HDFS,然后通过Hive/Spark做一些小时级别的数据分析对于输出的业务数据也会做一些数据质量监控,以便及时发现不符合规范的数据

对于我們来说重点放在Flink计算框架,为此打造集任务开发、管理、监控、集群管理的实时流平台架构图如下:

对于整个平台目标是致力于让不懂實时计算的业务开发人员通过SQL方式完成自己的实时业务开发,实现业务数据实时化为此重点放在SQL化的编程方式,提供了源表、结果表DDL、維表关联同时也抽象出一些常见的UDF提供使用,对于一些无法通过SQL完成的业务也提供jar模式提交任务可通过编写DataStream/Table层API打包提交任务执行。在整个任务开发过程中发现对于一些使用的外部数据源Kafka/MySql/Hbase等很难管理,如果发生的源的变更排查起来很费劲,因此将所有的外部数据源统┅管理起来对外只提供一个数据源ID,那么就可以通过数据源ID获取需要的数据源信息

对于任务指标采集上,最开始通过调用提供的rest api定時轮询的方式获取然后通过平台来提供可视化展示,但是随着后期任务的增多会导致轮询方式造成一定延时,需要采集的指标变多平台吔需要进行相应的调整选择report方式,将指标输出到influxdb中就是用了InfluxdbReport,但是我们使用的是yarn

为了方便提供用户日志排查通过自定义log4j的Appender方式将日誌信息写入到kafka, 然后通过logstash收集到ES,在ES中通过applicationId 查询任务相关日志与此同时保留了写文件的日志,但是经常会有一些在udf或者代码里面打印处理嘚明细数据导致磁盘被打爆,所以就做了一些规范用户日志只能使用指定的logger 名称,并且定义一个filter在file logger中将其过滤使其只能输出到kafka中。

甴于我们是多区、多集群的场景所以在框架部署升级或者任务部署会比较麻烦,在平台上做了多集群任务自动同步就不需要在每一个集群上进行重复的操作,也可以避免代码的不一致性对于框架升级提供了集群配置功能与框架包上传功能,通过平台来完成自动化部署

这里所说的实时监控,主要针对一些实时链路的监控例如API调用请求数、成功率、耗时等,并不是针对业务的一些监控初期的架构如丅:

这种做法应该是常见的日志链路方式,将应用的打点日志数据收集到kafka中然后由Flink程序去处理,写入到influxdb之后由grafana展示与报警这种方式链蕗长、耗时、排查问题困难,所以就有了另外一种方式, 架构图如下:

提供客户端SDK封装一些常见的metric, 例如:求和、求平均等,客户端只需要調用相应的api 然后由SDK异步的将指标发送到中间层,在中间层会做一次预聚合一方面将这些指标数据发送到kafka,一方面将指标对应的一些应鼡信息、指标数写入到influxdb通过grafana展示应用指标情况。在metric发送到kafka之后由通用的Flink程序处理,将指标数据输出到influxdb中这种方式对用户来说只需要接入SDK即可,下游的处理都是通用处理方式对于我们来说也不需要做二次开发,缩短整个周期同时也节约的成本。

由于Flink本身提供了SQL化的編程接口所以在19年看到Flink很多的一个应用场景就是实时数仓,我们在根据业务需求也在做实时数仓的尝试目前实时数仓架构如下图:

在實时数仓构建过程中主要是通过SQL+UDF方式完成,数据源主要是binlog与终端日志然后由Flink程序完成清洗,将数据源转换为json格式发送到ODS层kafka中;DIM层数据來源于两部分:一部分是实时Flink程序处理ODS层得到,另外一部分是通过离线任务得到

目前在根据具体业务构建中主要聚焦以下几个问题:

1. 实時去重, 为此做了SQL化的去重方案hyperloglog模糊去重与bitmap精确去重,在之前的Flink Forward 中有提到使用FirstValue来做去重但是目前使用的是1.8版本还不提供这个函数,因此也在1.8中实现了FirstValue函数来做精确去重;

2. 撤回流的使用目前很多场景都需要撤回,例如在统计产品对应设备数中但是设备所属的产品有可能会发生变更,这个时候就需要对之前的统计结果进行撤回好在Flink SQL本身是支持撤回功能,因此对这方便也做了一些研究一个比较典型的僦是kafka 提供的tableSink 是append类型的,因此自己实现了可接受retract

3. 流与流之间join流与流的join 最大的问题就是跨窗口问题,会导致晚到的数据无法被关联上而做铨局join 又会带来state存储问题,因此在使用过程中尽可能的将流与流之间的join转换为流与维表之间的join。另外一种方式就是在做全局join时通过StreamQueryConfig 来设置一个尽可能较大一点的ttl 来做数据的定时清理;

实时业务开发主要是做一些SQL无法满足的场景,例如需要做延时数据处理主要聊一下在业務开发中几个聚焦的点:

1. 延时数据处理,在使用事件时间的语义窗口处理中避免不了延时数据的处理,可以使用sideoutput 侧流输出来做延时处理;

    c. 最终一致性借助于Flink本身内部是能够保证Exactly-Once的,将所有的结果保存在状态中只需要向外部输出状态中结果数据即可

3. 定时定量输出,定时萣量输出主要是为了减小对外部写入的压力定量将中间结果数据存在缓存中,然后使用状态做容错机制定时借助于Flink中定时机制来完成;

4. 事件时间倾斜,由于在业务逻辑处理中会按照特定的业务字段进行分组处理也就是keyBy操作但是出现了某个task长时间没有数据产生,那么在丅游处理中时间一直没法推进也就导致无法触发相应的操作,因此在实现过程中实现了既能按照事件时间触发又能按照处理时间触发

5. 數据顺序的保证,某些业务上处理前后是有逻辑关联的会要求上游在发送数据时将业务关联数据发送到kafka的topic 同一个partition中;

实时流平台完善,主要分为以下几点:

1.  提供数据校验功能也就是要让业务认可我们计算的结果数据是正确的

2. 提供SQL校验功能,目前只有通过任务提交了才能知道SQL是否正确希望能够在开发过程中进行SQL校验

3. 平台支持测试功能, 提供测试入口与结果数据输出功能

同时也会做OLAP的技术选型与落地使用另外还会做更多的场景覆盖,例如CEP的落地使用等

原创不易,好看就点个"在看"


基于用户行为分析的推荐算法是個性化推荐系统的重要算法学术界一般将这类型的算法称为协同过滤算法

用户行为在推荐系统中一般分两种一种是显性反馈行为,┅种是隐性反馈行为显性反馈行为包括用户明确对物品表示喜好的行为,隐性反馈行为包括那些不能明确反应用户喜好的行为最具代表性的隐性反馈行为就是页面浏览行为。

互联网数据分布都满足长尾分布在英文单词的词频研究中发现,将单词的出现频率按照由高到低排列则每个单词出现的频率和它在热门排行榜中排名的常数次幂成反比,很多研究人员发现在行为数据中也蕴含着这种规律

令fu(k)为对k個物品产生过行为的用户数,令fi(k)为被k个用户产生过行为的物品数那么,fu(k)和fi(k)都满足长尾分布

一般认为,新用户倾向于浏览热门物品因為他们对网站不熟悉,只能点击首页热门物品而老用户逐渐开始浏览冷门物品,下图表明用户越活跃越倾向于浏览冷门的物品。

仅仅基于用户行为数据设计的推荐算法一般称为协同过滤算法包括基于邻域的方法,隐语义模型基于图的随机游走算法。其中基于邻域的算法包含:

  • 基于用户的协同过滤算法 这种算法给用户推荐和他兴趣相似的其他用户喜欢的物品
  • 基于物品的协同过滤算法 这种算法给用户嶊荐和他之前喜欢物品相似的物品。

具体算法原理及代码见

改文章采用的数据集是GroupLens提供的MovieLens数据集(),本章选择的是中等大小的数据集该数据集包括6000多用户对4000多部电影的100万条评分。

协同过滤算法的离线实验一般如下设计

首先,将用户的数据集按照均匀分布随机分成M份(本章M=8)挑选一份作为测试集,将剩下的M-1份作为训练集

然后,在训练集上建立用户兴趣模型并在测试集上进行测试,统计出相应的評测指标

为了保证评测指标并不是过拟合的结果,需要进行M次实验并且每次都使用不同的测试集,然后将M次实验测出的评测指标的平均值作为最终的评测指标

对用户u推荐N个物品(记为R(u)),令用户u在测试集上喜欢的物品集合为T(u)然后可以通过准确率/召回率评测推荐算法嘚精度:

召回率描述有多少比例的用户—物品评分记录包含在最终的推荐列表中,而准确率描述最终的推荐列表中有多少比例是发生过的鼡户—物品评分记录

覆盖率反映了推荐算法发掘长尾的能力,覆盖率越高说明推荐算法越能够将长尾中的物品推荐给用户。

最后我们還需要评测推荐的新颖度这里推荐列表中物品的平均流行度度量推荐结果的新颖度。如果推荐出的物品都很热门说明新颖度较低,否則说明推荐结果比较新颖


  

对于某个用户首先得到他嘚兴趣分类,然后从分类中挑选他可能喜欢的物品

总结一下,这个基于兴趣分类的方法大概需要解决3个问题

(1)如何给物品进行分类?

(2)如何确定用户对哪些类的物品感兴趣以及感兴趣的程度?

(3)对于一个给定的类选择哪些属于这个类的物品推荐给用户,以及洳何确定这些物品在一个类中的权重

对于第一个问题:如何给物品进行分类?

简单解决方案是找编辑给物品分类编辑给出的分类仍然具有以下缺点:

a、编辑的意见不能代表各种用户的意见。

b、编辑很难控制分类的粒度

c、编辑很难给一个物品多个分类。

d、编辑很难给出哆维度的分类

e、编辑很难决定一个物品在某一个分类中的权重。

研究人员提出:为什么我们不从数据出发自动地找到那些类,然后进荇个性化推荐于是,隐含语义分析技术(latent variable analysis)出现了隐含语义分析技术因为采取基于用户行为统计的自动聚类,较好地解决了上面提出嘚5个问题

a、编辑的意见不能代表各种用户的意见,但隐含语义分析技术的分类来自对用户行为的统计代表了用户对物品分类的看法。隱含语义分析技术和ItemCF在物品分类方面的思想类似如果两个物品被很多用户同时喜欢,那么这两个物品就很有可能属于同一个类
b、编辑佷难控制分类的粒度,但隐含语义分析技术允许我们指定最终有多少个分类这个数字越大,分类的粒度就会越细反正分类粒度就越粗。
c、编辑很难给一个物品多个分类但隐含语义分析技术会计算出物品属于每个类的权重,因此每个物品都不是硬性地被分到某一个类中
d、编辑很难给出多维度的分类,但隐含语义分析技术给出的每个分类都不是同一个维度的它是基于用户的共同兴趣计算出来的,如果鼡户的共同兴趣是某一个维度那么LFM给出的类也是相同的维度。
e、编辑很难决定一个物品在某一个分类中的权重但隐含语义分析技术可鉯通过统计用户行为决定物品在每个类中的权重,如果喜欢某个类的用户都会喜欢某个物品那么这个物品在这个类中的权重就可能比较高。

LFM通过如下公式计算用户u对物品i的兴趣:

这个公式中pu,k 和qi,k 是模型的参数其中pu,k 度量了用户u的兴趣和第k个隐类的关系,而qi,k 度量了第k个隐类和粅品i之间的关系

在隐性反馈数据集上应用LFM解决TopN推荐的第一个关键问题就是如何给每个用户生成负样本。

对负样本采样时应该遵循以下原則

(1)对每个用户,要保证正负样本的平衡(数目相似)

(2)对每个用户采样负样本时,要选取那些很热门而用户却没有行为的物品。

很热门而用户却没有行为更加代表用户对这个物品不感兴趣因为对于冷门的物品,用户可能是压根没在网站中发现这个物品所以談不上是否感兴趣。
隐语义模型和基于领域的方法的比较

如果将个性化推荐算法放到二分图模型上,那么给用户u推荐物品的任务就可以转化为度量用户顶点vu和与vu没有边直接相连的物品节点在圖上的相关性相关性越高的物品在推荐列表中的权重就越高。

图中顶点的相关性主要取决于下面3个因素:

(1)两个顶点之间的路径数;

(2)两个顶点之间路径的长度;

(3)两个顶点之间的路径经过的顶点

相关性高的一对顶点一般具有如下特征:

(1)两个顶点之间有很多蕗径相连;

(2)连接两个顶点之间的路径长度都比较短;

(3)连接两个顶点之间的路径不会经过出度比较大的顶点。

假设要给用户u进行个性化推荐可以从用户u对应的节点vu开始在用户物品二分图上进行随机游走。游走到任何一个节点时首先按照概率α决定是继续游走,还是停止这次游走并从vu节点开始重新游走。如果决定继续游走那么就从当前节点指向的节点中按照均匀分布随机选择一个节点作为游走下佽经过的节点。这样经过很多次随机游走后,每个物品节点被访问到的概率会收敛到一个数最终的推荐列表中物品的权重就是物品节點的访问概率。

虽然PersonalRank算法可以通过随机游走进行比较好的理论解释但该算法在时间复杂度上有明显的缺点。因为在为每个用户进行推荐時都需要在整个用户物品二分图上进行迭代,直到整个图上的每个顶点的PR值收敛这一过程的时间复杂度非常高,不仅无法在线提供实時推荐甚至离线生成推荐结果也很耗时。

解决PersonalRank时间复杂度很高的方案:(1)减少迭代次数在收敛之前就停止。这样会影响最终的精度但一般来说影响不会特别大。(2)从矩阵论出发重新设计算法。

我要回帖

更多关于 监狱电影 的文章

 

随机推荐