当营业成长到必定层次后,单一的特点类型将很难覆盖所有的营业需求。所以在存储筹划选型上,须要根据特点类型进行数据分层。分层之后,不合的存储引擎同一对策略办事供给特点数据,这是保持体系机能和功能兼得的最佳实践。
2.2 数据紧缩
海量的离线特点加载到线上体系并在体系间流转,对内存、收集带宽等资本都是不小的开销。数据紧缩是典范的以时光换空间的例子,往往可以或许成倍削减空寄┞芳用,对于线上名贵的内存、带宽资本来说是晚大年夜的福音。数据紧缩本质思惟是削减信息冗余,针对特点体系这个应用处景,我们积聚了一些实践经验与大年夜家分享。
2.2.1 存储格局
特点数据简单来说即特点名与特点值。以用户画像为例,一个用户丰年纪、性别、爱好等特点。存储如许的特点数据平日来说有下面几种方法:
- JSON格局,完全保存特点名-特点值对,以JSON字符串的情势表示。
- 元数据采取,如Hive一样,特点名(元数据)零丁保存,特点数据以String格局的特点值列表表示。
- 元数据固化,同样将元数据零丁保存,然则采取强类型定义每个特点,如Integer、Double等而非同一的String类型。
三种格局各有好坏:
- JSON格局的长处在特点数量可所以变长的。以用户画像为例,A用户可能丰年纪、性别标签。B用户可以有籍贯、爱好标签。不合用户标签种类可以差别很大年夜,都能便捷的存储。但缺点是每组特点都要存储特点名,当特点种类同构性很高时,会包含大年夜量冗余信息。
- 元数据采取的特点与JSON格局相反,它只保存特点值本身,特点名作为元数据零丁存放,如许削减了冗余特点名的存储,但缺点是数据格局必须是同构的,并且如不雅须要增删特点,须要更改元数据后刷新全部数据集。
- 元数据固化的长处与元数据采取雷同,并且加倍节俭空间。然而其存取过程须要实现专有序列化,实现难度和读写速度都佣旧本。
特点体系中,一批特点数据平日来说是完全同构的,同时为了应对高并发下的批量请求,我们在实践中采取了元数据采取作为存储筹划,比拟JSON格局,有2~10倍的空间节约(具体比例取决于特点名的长度、特点个数以及特点值的类型)。
2.2.2 字节紧缩
提到数据紧缩,很轻易就会想到应用无损字节紧缩算法。无损紧缩的重要思路是将频繁出现的模式(Pattern)用较短的字节码表示。推敲到在线特点体系的读写模式是一次全量写入,多次逐条攫取,是以紧缩须要针对单条数据,而非全局紧缩。今朝主流的Java实现的短文本紧缩算法有Gzip、Snappy、Deflate、LZ4等,我们做了两组实验,重要大年夜单条平均紧缩速度、单条平均解压速度、紧缩率三个指标来比较以上各个算法。
数据集:我们拔取了2份线上真实的特点数据集,分别取10万条特点记录。记录为纯文本格局,平均长度为300~400字符(600~800字节)。

大年夜应用处景(一次全量写入,多次逐条攫取)出发,特点体系重要的办事指标是特点高并发下的响应时光与特点数据存储效力。是以特点紧缩存眷的指标其实是:快速的解压速度与较高的紧缩比,而对紧缩速度其实请求不高。是以综合上述实验中各个算法的表示,Snappy是较为合适我们的需求。
2.2.3 字典紧缩
当每次请求,策略枷⒚须要大年夜量的特点数据时(比如一次请求上千条的告白商特点),我们须要异常强悍的在线数据获取才能。而在存储特点的不合办法中,拜访本地内存毫无疑问是机能最佳的解决方法。想要在本地内存中拜访到特点数据,平日我们有两种有效手段:内存副本和客户端缓存。
2.3.1 内存副本技巧
当数据总量不大年夜时,策略应用方可以在本地完全镜像一份特点数据,这份镜像叫内存副本。应用内存副本和应用本地的数据完全一致,应用者无需关怀远端数据源的存在。内存副本须要和数据源经由过程某些协定进行同步更新,这类同步技巧称为内存副本技巧。在线特点体系的场景中,数据源可以抽象为一个KV类型的数据集,内存副本技巧须要把如许一个数据集完全的同步到内存副本中。
推拉结合——时效性和一致性
一般来说,数据同步为两种类型:推(Push)和拉(Pull)。Push的技巧比较简单,依附今朝常见的消息队列中心件,可以根据需求做到将一个数据变更传送到一个内存副本中。然则,即使实现了不重不漏的高靠得住性消息队列通知(平日价值很大年夜),也还面对着初始化启动时批量数据同步的问题——所以,Push只能作为一种进步内存副本时效性的手段,本质轶孚存副本同步还得依附Pull协定。Pull类的同步协定有一个异常好的特点就是幂等,一次掉败或成功的同步不会影响下一次进行新的同步。
Pull协定有异常多的选择,最简单的每次将所稀有据全量拉走就是一种基本协定。然则安营业需求中须要寻求数据同步效力,所以用一些比较高效的Pull协定就很重要。为了缩减拉取数据量,这些协定本质上来说都是欲望高效的计算出尽量精确的数据差别(Diff),然后同步这些须要的数据更改。这里介绍两种我们曾经在工程实践中应用过的Pull型数据同步协定。
基于版本号同步——回放日记(RedoLog)和退化算法
内存副本提议同步请求时,会携带该副本上一次完成同步时的最大年夜版本号,这意味着所有该版本号之后的数据变更都须要被拉取过来。数据源方收到请求后,大年夜更新队列中找到大年夜于该版本号的所稀有据变更,并将数据变更汇总,获得最终须要更新的Diff,返回给提议方。此时内存副本只须要更新这些Diff数据即可。

对于大年夜多半的营业场景,特点数据的生成会收口到一个同一的更新办事中,所以递增版本号可以串行的生成。如不雅在分布式的数据更新情况中,则须要应用分布式id生成器来获取递增版本号。
推荐阅读
在中国电商成长的汗青中,造节促销一向是巨擘们激烈竞争的┞方场,但聚美优品似乎更愿意选择一条完全不合的路径。在某次全网电商节日开端之前,因为看法不合,聚美优品CEO陈欧和一位核心高管在会议室里起了争执,甚至>>>详细阅读
本文标题:人工智能在线特征系统中的数据存取技术
地址:http://www.17bianji.com/lsqh/36079.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示