实时服务—如查看近2分钟某应用的服务调用情况;检索一笔彩票订单目前的流程状态。它们的特点是数据粒度细、实时性要求高、不能重复计算或重复计算结果不一致、稳定性差
离线服务—如统计昨天提供调用次数最多的前10个服务;分析前一个月里售出彩种ID=1的总额最高的代理商和最低代理商,金额分别是多少。与实时服务相反,它们的特点是数据粒度粗、时间跨度大、能重复计算、结果一致稳定
可以看出,实时和离线可以互补长短,为接入方提供多层次个性化的数据服务。当然服务的前提是有数据,也就是如何存下来,且在大数据量下必须是高效的、稳定的。
(1)写HBase
需要考虑两种类型的存储数据:一种是需要快速检索的业务数据,另一种是实时展现的统计数据。对于前者具体又可分为带唯一业务标识和不带唯一业务标识的情况,带唯一标识的如彩票检索,订单号就是唯一的标识号,只需将订单号设计为rowkey,再将该订单不同状态的日志放入同一column family(cf)的不同qualifier中就可以通过订单号快速检索该笔彩票的状态信息了;而没有唯一标识的业务类型在存储时可能导致rowkey冲突老数据被覆盖,如操作日志即使以日志类型+时间戳也不能作为唯一的rowkey设计,这时对整条日志采用碰撞率低的定长编码算法是一个很好方法,如CRC32,通过将编码放在rowkey的最后即可解决冲突的问题。如果存储的是基于时序的统计数据,对于hbase存储模型的设计就需要更加注意了,因为这类数据不仅量大(如秒级统计)而且往往附带按某种维度的聚合操作,设计不好就会给存储和查询带来性能问题。关于这类数据的存储,业界基于hbase的开源产品Opentsdb给出了解决方案,这里介绍下其schemal设计和异步hbase模型
Ø OpenTsdb之Schemal设计:
Figure 1.1 opentsdb之Schemal
众所周知,与通常RDMS相比,hbase是一个schema-less、面向列存储的nosql数据库,定位一个列元数据至多会经过rowkey->cf->qualifier->version四层索引,其中cf必须在表定义时就指定无法通过后期动态扩展,而version的定位是通过timestamp解决cell数据冲突的,所以大多数实际情况下只有rowkey和qualifier两级索引可以利用。对于time-serial性质的数据,如果每个时间细粒度(假设为秒)的数据都放入rowkey,则会导致region数暴增第一级索引成为瓶颈,opentsdb采用将秒粒度的时间戳变为小时粒度后保留在rowkey中,而将具体的秒信息转化为对小时粒度时间戳的偏移量放入quliafier中,这样一来region数量大大减少,quliafier的数量也不会成为瓶颈(60*60=3600个)。更重要的是每个row中的数据更加聚合,为高效检索提供了保证,因为
a) hbase的底层存储是HFile文件(基于Hdfs的block数据块),row中的cf可以拥有多个HFile文件,但同一HFile文件中的数据必定属于同一cf,这有利于在读取同一cf数据时尽量少跨HFile或不跨HFile,使需求密集型的数据聚合在同一row中的cf下迎合了hbase这种天然的物理存储特性,大大提高了数据的访问效能。
b) 以时间粗粒度rowkey+细粒度qualifer的方式也很容易满足用户不同粒度的检索需求,假设要查询某小时前10分钟的数据,可以通过hbase自带的qualifierFilter在服务端过滤数据,而无需将小时的数据由服务端全部返回客户端后再自行过滤
另外,opentsdb为了让rowkey包含更多的检索信息,将维度信息以kv对的形式放入rowkey中,当然kv对的数量必须是有限的,opentsdb以正则过滤的方式满足用户对源数据不同维度的检索要求。同时,opentsdb还对metric和tag进行了编码、以及入库数据的压缩,这些都大大降低了数据存储量。
Ø 异步hbase模型
相比hbase自带的同步HTable API,OpenTsdb自己实现了的AsynHbase具有高效、非阻塞、线程安全等特点,在顺序读和写的响应性能上提高了一倍[4]。
Figure 1.2 opentsdb之AsynHbase
如图1.2,异步化过程描述为:请求者(Data Sink)发送数据请求,获得异步化结果Deferred,注册回调器callbacks到Deferred,完成客户端逻辑所在线程返回;服务端异步执行数据请求服务,将结果写入Deferred,之后触发并执行回调器callbacks,继续数据请求后暂停的逻辑。其中关键的两个地方在于Deferred和Callbacks(异常处理时对应errbacks)
a) Deferred
同JDK中的Future类似,Deferred也是一种在有限状态机中表示结果暂不可达(not yet available)的状态。不同的是,Deferred绑定了callbacks,而Future只能在后续某个时刻手动地通过get方式拿到异步调用结果,Future的问题就在于调用者并不清楚什么时候结果准备好了。
b) Callbacks
准确地说,应该是回调链(callbakc chain),链上的前一个callback将返回结果作为参数传递给下一个callback,以此类推直到链末。下面以一个由浅入深的例子来理解下回调链。
假设我们要以RPC的方式从远程主机上获得一些感兴趣的数据,如图1.2,首先通过一个socket发送请求,获得Deferred,并将后续逻辑以callback方式注册到Deferred上。此时回调链上只有我们定义的一个callback
1st callback
Deferred: user callback
进一步我们需要在客户端增加一层cache以提高性能。考虑缓存未命中的情况,RPC返回的结果首先需要在cache中缓存起来,然后才执行RPC后的逻辑。这时,回调链上是两个callback
1st callback 2nd callback
Deferred: add to cache --> user callback
更进一步,考虑到网络上回来的都是原始字节流,而cache和使用时都是数据对象,所以抽象出更底层的逻辑:验证字节流并反序列化为对象。这时,回调链上是三个callback
1st callback 2nd callback 3rd callback
Deferred: validate & de-serialize --> add to cache --> user callback
result: de-serialized object
最后,考虑复杂的情况,RPC的数据服务方是一个分布式集群,有master/slave之分,这意味着需要两阶段的RPC来请求数据。第一阶段,与master通信获得数据所在的slave;第二阶段,从slave上获取需要的数据,分别对应下面的A和B
(A) 1nd callback 2nd callback | (B) 1st callback
Deferred: index lookup user callback | Deferred: resume (A)
result: lookup response Deferred (B) | result: byte array
在A中,1nd callback通过与master通信返回了slave地址,传递slave地址给user callback并执行第二阶段RPC。由于A的user callback返回的是一个Deferred,调用链在user callback时被中止了(not yet available),所以需要在B中的callback返回结果后恢复A中的调用链。这里体现了Deferred与Future不同的另一大特点:嵌套。通过Deferred的嵌套和调用链组合,可以灵活动态地构建异步处理管道(processing pipeline)。
在使用AsynHbase模型的时候需要明确和注意以下几点:
l 任何时候回调链上最多只能有一个线程在执行
l 回调链上的回调执行有严格的先后顺序,如果一个变量不是共享的,则无需同步
l 将初始结果放入Deferred的线程即执行回调链的线程,中间没有线程切换
l 只要callback开始执行了,Deferred就失去了对其引用
l 向Deferred增加一个callback的代价是O(1)
l 相互循环的Deferred依赖可能导致无限递归,应避免
l Callback和Errback不能接受Deferred本身为参数
(2)写云梯
写云梯最重要的就是IO吞吐量。经测试,采用Lzo压缩方式时单机单线程的写速率在10m/s+,单机多线程能提高写效率,当并发度为机器核数时(tlog为5核虚拟机)能达到峰值,近30m/s刚好满足高峰期的数据流量(tlog目前14台服务器,每天10T+的流量,平均每台约10m/s,高峰期30m/s)。所以,tlog中不同server的不同storm任务都会成为一条向云梯传送数据的通道,对应云梯的文件句柄用“ip+taskId+timestamp”区分,timestamp是每小时滚动一次的时间戳标记。Tlog中曾经为写云梯设计了缓冲机制,本质就是一个简单的生产—消费者模型,生产者从一头不断获得源日志往缓冲队列中放,当队列满就阻塞;而消费者从另一头读取日志往云梯写,发现队列空就等待。后来发现其实这样没有必要,因为写hdfs具有天然的缓存机制,那就是buffer—数据首先被刷入buffer,待到满足预设的大小(事实证明buffer越大写速率越高,如128M的写效率高于64M)后整块数据再往云梯搬,自己加缓存效果不佳反而会增大线程切换和内存开销。另外,为了减小使用storm带来的数据流转开销,tlog原则上是能先入库的数据绝不流转,入云梯理应在收集器采集到数据立刻进行,后续才是Hbase,tlog目前也确实这么做的。但这里需要说明一点的是tlog没有将入云梯和入hbase两块进行解耦,也就是说,如果写云梯失败了,会间接阻塞写hbase。是否值得这样做,答案是肯定的。云梯上存的是全量的原始数据,是追述问题的依据,即使入hbase失败或客户端数据滚动丢失,只要云梯上保留得有就有办法恢复,所以从数据的准确性和完整性上tlog将云梯的优先级放大了。但目前遇到一个很囧的问题就是云梯升级较频繁,每次升级花费两个小时导致tlog系统僵死两个小时,日志就在客户端积压两个小时,像eagleeeye这种大日志输出的系统两个小时早已超过文件滚动的上限200m,结果就是数据丢了。解决的方案就是落盘,但落盘需要考虑服务器磁盘空间的大小、磁盘IO对系统负载的影响、落盘的速度是否满足网络流量以及落盘后的恢复工作等等,这些因素会大大增加系统的复杂度并对稳定性带来冲击,在权衡利弊后,tlog目前还没有这么做。
【参考文献】
[1]. Nick Dimiduk, Amandeep Khurana. HBase in Action [M]. USA: Manning, 2011
[2]. http://opentsdb.net/
[3]. http://tsunanet.net/~tsuna/async/api/com/stumbleupon/async/Deferred.html
[4]. http://www.tsunanet.net/~tsuna/asynchbase/benchmark/viz.html
相关推荐
基于springboot+Javaweb的二手图书交易系统源码数据库文档.zip
Linux课程设计.doc
课程考试资源描述 本资源是为应对各类课程考试而精心准备的综合性学习包。它包含了多门学科的考试指南、历年真题、模拟试题以及详细的答案解析。这些资源旨在帮助学生系统复习课程内容,理解考试要点,提高解题技巧,从而在考试中取得优异成绩。 资源中不仅包含了基础的考试资料,还特别加入了考试技巧讲解和备考策略分析。学生可以通过这些资源了解不同题型的解题方法和思路,学会如何在有限的时间内高效答题。此外,还有针对弱项科目和难点的专项训练,帮助学生攻克学习瓶颈。 为了确保资源的时效性和准确性,我们会定期更新考试资料和模拟试题,及时反映最新的考试动态和趋势。同时,也提供了在线交流平台,方便学生之间互相讨论、分享学习心得。 项目源码示例(简化版,Python) 以下是一个简单的Python脚本示例,用于生成包含选择题和答案的模拟试题: python import random # 定义选择题题库 questions = [ {"question": "Python的创始人是谁?", "options": ["A. 林纳斯·托瓦兹", "B. 巴纳姆", "C. 比尔·盖茨", "D.
基于 MySQL+Django 实现校园食堂点餐系统。 主要环境: PowerDesigner MySQL Workbench 8.0 CE Python 3.8 Django 3.2.8 BootStrap 3.3.7 Django-simpleui
基于SpringBoot的同城宠物照看系统源码数据库文档.zip
GEE训练教程
基于springboot+Web的心理健康交流系统源码数据库文档.zip
微信小程序 kotlin 实践微信插件助手, 目前支持抢红包(支持微信最新版本 7.0.0及7.0.3).zip
N32G45X运放电路检测电压
梦幻西游道人是梦幻西游里面的一个NPC,主要是刷全服最实惠的高级兽决和其他很好用的比较贵的东西,在长安城、傲来国、长寿村中的任意一个场景出现,一般会出现30分钟,不过东西一般都被秒刷。 梦幻西游道人出现时间解析如下: 1.梦幻西游道人出现时间一直都保持着一年出现两次的规律,即2、3月份的元宵节期间来一次,9月份的教师节期间出现一次。 2.云游道人每个整点(0:00至7:00不出现)会在长安城、傲来国、长寿村中的任意一个场景出现,每次出现后停留时间为30分钟。
tables-3.7.0-cp38-cp38-win_amd64.whl
基于springboot旧物回收管理系统源码数据库文档.zip
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB。 本文档介绍了MariaDB 10.1的集群部署,至少三台机器做成集群,每台可以同时提供读和写,感兴趣的小伙伴们可以参考一下
内容概要:本文档全面介绍了JavaScript作为一种轻量级的、解释型的语言及其在前端开发中的广泛应用。从JavaScript的基本概念出发,详尽讲解了基础语法(如变量、数据类型、运算符、流程控制)、函数和闭包、对象和原型、DOM操作(如获取、修改、添加和删除元素)、事件处理(如事件监听器、事件对象)、AJAX与Fetch API、ES6+的新特性(如箭头函数、模板字符串、解构赋值)以及前端框架和库(React、Vue、Angular)。除此之外,文章还涉及了代码优化技巧(如减少DOM操作、选择适当的算法和数据结构、使用工具提升代码性能),并对JavaScript的应用场景和发展趋势进行了展望。 适用人群:适用于初学者或具有少量编程经验的学习者,旨在帮助他们系统掌握JavaScript基础知识和前沿技术。 使用场景及目标:通过本教程的学习,读者不仅可以学会基本语法,还能理解并掌握高级概念和技术,如DOM操纵、事件处理机制、异步编程及最新的ECMAScript规范。这不仅有助于改善用户体验、增强网站互动性和响应速度,也能有效提升自身的编码水平和项目开发能力。 其他说明:此文档不仅涵盖了JavaScript的传统功能,还有现代前端技术和最佳实践指导,确保读者能够紧跟行业发展步伐,成为合格甚至优秀的Web开发人员。
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
基于springboot高考志愿智能推荐系统源码数据库文档.zip
经典-FPGA时序约束教程
mcu交互实验整体文件
Collins COBUILD (CN).mdx
自定义springboot starter