HBase模式案例研究列表数据

感谢平台分享-http://bjbsair.com/2020-04-10/tech-info/53341.html

以下是用户 dist-list 中关于一个相当常见问题的的交流:如何处理 Apache HBase 中的每个用户列表数据。

问题:

我们正在研究如何在 HBase 中存储大量(每用户)列表数据,并且我们试图弄清楚哪种访问模式最有意义。一种选择是将大部分数据存储在一个密钥中,所以我们可以有如下的内容:

我们的另一个选择是完全使用如下内容:

每行将包含多个值。所以在一种情况下,读取前三十个值将是:

而在第二种情况下会是这样:

一般的使用模式是只读取这些列表的前30个值,并且很少的访问会深入到列表中。一些用户在这些列表中总共有30个值,并且一些用户将拥有数百万(即幂律分布)。

单值格式似乎会占用 HBase 上的更多空间,但会提供一些改进的检索/分页灵活性。是否有任何显着的性能优势能够通过获取和扫描的页面进行分页?

我最初的理解是,如果我们的分页大小未知(并且缓存设置恰当),那么执行扫描应该会更快,但如果我们始终需要相同的页面大小,则扫描速度应该更快。我听到不同的人告诉了我关于表现的相反事情。我假设页面大小会相对一致,所以对于大多数使用情况,我们可以保证我们只需要固定页面长度的情况下的一页数据。我还会假设我们将不经常更新,但可能会插入这些列表的中间(这意味着我们需要更新所有后续行)。

答案:

如果我理解正确,你最终试图以“user,valueid,value”的形式存储三元组,对吗?例如:

(但用户名是固定宽度,而 valueids 是固定宽度)。

而且,您的访问模式符合以下要求:“对于用户 X,列出接下来的30个值,以valueid Y开头”。是对的吗?这些值应该按 valueid 排序返回?

tl、dr 版本是,你可能应该为每个用户+值添加一行,除非你确定需要,否则不要自行构建复杂的行内分页方案。

您的两个选项反映了人们在设计 HBase 模式时常见的问题:我应该选择“高”还是“宽”?您的第一个模式是“高(tall)”:每行代表一个用户的一个值,因此每个用户的表中有很多行;行键是 user + valueid,并且会有(可能)单个列限定符,表示“值(value)”。如果您希望按行键来扫描排序顺序中的行, 这是很好的。你可以在任何用户 + valueid 开始扫描,阅读下一个30,并完成。你放弃的是能够在一个用户的所有行周围提供事务保证,但它听起来并不像你需要的那样。

第二个选项是“宽”:使用不同的限定符(其中限定符是valueid)将一堆值存储在一行中。简单的做法是将一个用户的所有值存储在一行中。我猜你跳到了“分页”版本,因为你认为在单行中存储数百万列会对性能造成影响,这可能是也可能不是真的; 只要你不想在单个请求中做太多事情,或者做一些事情,比如扫描并返回行中的所有单元格,它不应该从根本上变坏。客户端具有允许您获取特定的列的片段的方法。

请注意,这两种情况都不会从根本上占用更多的磁盘空间; 您只是将部分识别信息“移动”到左侧(在行键中,在选项一中)或向右(在选项2中的列限定符中)。在封面下,每个键/值仍然存储整个行键和列名称。

正如你注意到的那样,手动分页版本有很多复杂性,例如必须跟踪每个页面中有多少内容,如果插入新值,则重新洗牌等。这看起来要复杂得多。在极高的吞吐量下它可能有一些轻微的速度优势(或缺点!),而要真正知道这一点的唯一方法就是试用它。如果您没有时间来构建它并进行比较,我的建议是从最简单的选项开始(每个用户 + valueid)。开始简单并重复!

原文地址:https://blog.51cto.com/14744108/2486400

时间: 2024-10-09 01:28:21

HBase模式案例研究列表数据的相关文章

HBase模式案例日志数据和时间序列数据

感谢平台分享-http://bjbsair.com/2020-04-10/tech-info/53339.html 本文为你介绍了 HBase 模式案例之一:日志数据和时间序列数据 假设正在收集以下数据元素. 主机名(Hostname) 时间戳(timestamp) 日志事件(Log event) 值/消息(Value/message) 我们可以将它们存储在名为 LOG_DATA 的 HBase 表中,但 rowkey 会是什么呢?从这些属性中,rowkey 将是主机名,时间戳和日志事件的一些组

HBase模式案例Steroids上的日志数据_时间序列上

感谢平台分享-http://bjbsair.com/2020-04-10/tech-info/53335.html 这实际上是 OpenTSDB 的方法.OpenTSDB 做的是重写数据并将行打包到某些时间段中的列中. 但是,这是一般概念的工作原理:例如,以这种方式摄入数据: 每个细节事件都有独立的 rowkeys,但是会被重写成这样: 上述每个事件都转换为存储的列,其相对于开始 timerange 的时间偏移量 (例如,每5分钟).这显然是一个非常先进的处理技术,但 HBase 使这成为可能.

网易视频云:HBase问题诊断案例一则——客户端读写阻塞异常

网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术,提供稳定流畅.低时延.高并发的视频直播.录制.存储.转码及点播等音视频的PAAS服务,在线教育.远程医疗.娱乐秀场.在线金融等各行业及企业用户只需经过简单的开发即可打造在线音视频平台.下面,网易视频云技术专家给大家分享一则HBase问题诊断案例. 大数据时代,HBase作为一款扩展性极佳的分布式存储系统,越来越多地受到各种业务的青睐,以求在大数据存储的前提下实现高效的随机读写操作.对于业务方来讲,一方面关注HBase

为什么超长列表数据的翻页技术实现复杂

为什么超长列表数据的翻页技术实现复杂 http://timyang.net/data/key-list-pagination/ 今天讨论了一个传统的问题,问题本身比较简单,就是针对key-list类型的数据,如何优化方案做到性能与成本的tradeoff.Key-list在用户类型的产品中非常普遍,如一个用户的好友关系 {“uid”:{1,2,3,4,5}},表示uid包含有5个好友:一条微博下面的评论id列表{“weibo_id”: {comment_id1, comment_id2……}},一

优化字符串的使用:案例研究

优化字符串的使用:案例研究 C++的std::string类模板是C++标准库中使用最广泛的特性之一.只要操作字符串的代码会被频繁地执行,那么就有优化的用武之地. 为什么字符串很麻烦 字符串在概念上很简单,但是想要实现高效的字符串却非常微妙.由于std::string中特性的特定组合的交互方式,使得实现高效的字符串几乎不可能. 字符串的某些行为会增加使用它们的开销,这一点与实现方式无关.字符串是动态分配的,它们在表达式中的行为与值相似,而且实现它们需要大量的复制操作. 字符串是动态分配的 字符串

机器学习入门系列02,Regression 回归:案例研究

为什么要先进行案例研究? 没有比较好的数学基础,直接接触深度学习会非常抽象,所以这里我们先通过一个预测 Pokemon Go 的 Combat Power (CP) 值的案例,打开深度学习的大门. Regression (回归) 应用举例(预测Pokemon Go 进化后的战斗力) 比如估计一只神奇宝贝进化后的 CP 值(战斗力). 下面是一只妙蛙种子,可以进化为妙蛙草,现在的CP值是14,我们想估计进化后的CP值是多少:进化需要糖果,好处就是如果它进化后CP值不满意,那就不用浪费糖果来进化它了

HBase存储时间相关多列数据的两种方案

所谓“时间相关多列数据”指的是同一个Key下具有多个属性数据,并且这些数据与时间具有相关性,多数场景是该Key对应在不同时间时刻的行为数据.在实际应用中,这类数据很多,例如电子商务网站上用户最近一段时间浏览的宝贝集合.访问的URL列表等. 使用HBase存储此类数据时,有以下两种常用的方案: 多行单列 表结构设计 Row Key:用户标识ID + (Long.MAX_VALUE - timestamp) Column Family:’cf’ Column Qualifier:’’ Value:宝

跟我一起学extjs5(38--单个模块的设计[6取得模块列表数据])

跟我一起学extjs5(38--单个模块的设计[6取得模块列表数据]) 上一节中做好了前后台的程序,现在来看看取得数据的运行过程.在菜单中选择 "系统管理"--"模块分组".就可以看到下图,在渲染后grid后,会显示数据. 来看看ajax取得数据的url和数据. url的信息: Remote Address:[::1]:8888 Request URL:http://localhost:8888/app/rest/module/fetchdata.do?_dc=14

自定义列表数据自动循环向下滚动view(类似于通知通报消息)

首先申明,这个自定义View不是本人写的,大神写的,本人仅限学习一级研究使用 直接上代码吧!后面我再解释一遍 1 package com.egojit.android.gcoa.views; 2 3 import android.animation.Animator; 4 import android.animation.TypeEvaluator; 5 import android.animation.ValueAnimator; 6 import android.content.Contex