Apache HBase

面向海量数据的极致成本优化-云HBase的一体化冷热分离

让人想犯罪 __ 提交于 2019-12-06 06:47:03
前言 随着业务的持续发展,业务数据库存储量会持续增长。通常数据量过亿时,就需要考虑做分库分表,或者选择扩展能力更好的NOSQL/NewSQL数据库,如HBase就可以单表支持PB级数据,足够满足大多数业务的存储需求。然而,对于大量存储瓶颈类业务,存储成本依然是系统设计中需要关注的重中之重,冷热分离的解决方案应用而生。 适合冷热分离的业务 账单/订单类系统的数据非常适合做冷热分离,这类系统的数据随着时间的推移往往会积攒了海量数据,而且由于数据的重要性,这些数据都要被永久保存。但是,用户往往只会查询最近消费的订单或者账单,超过半年的订单基本不会被访问。 监控系统的数据也呈非常明显的冷热分层特性。用户通常只会查看实时监控,历史数据只有在回溯故障的时候,才可能去查询。而如果把实时数据与历史数据混杂在一起,不仅会让存储的成本非常高,而且会拖慢实时查询的速度。 聊天系统是冷热分离的另外一个实用场景,用户通常只会查看实时的聊天消息,聊天记录的访问频次要低非常多。 总的来说,适合将数据做冷热分离的业务会有以下几个特征: 海量数据持续增长的业务:如交易历史数据,聊天记录,数据无法做TTL,且单个用户的数据会持续累加。 数据生命周期分明的业务:如监控数据,物流信息,feed收件箱,通常只会查询近期的数据,冷数据仅作为回溯问题使用。 重写轻读的业务:在IOT场景下,车联网中会有大量车辆上报的传感器信息

关于【缓存穿透,缓存击穿,缓存雪崩,热点数据丢失】问题的解决方案

不问归期 提交于 2019-12-06 04:05:16
本篇文章转载自: 石衫的架构笔记 微信公众号 前言 当我们系统中使用到了缓存时,不管是一级缓存还是多级缓存,它的作用就是业务系统在请求数据时,如果缓存中有,就从缓存中获取;如果缓存中没有,再去访问DB,从而减少DB的压力,缩短获取数据的时间。那么在使用缓存的过程中,会出现哪些常见问题?我们又如何来解决? 1 缓存穿透 1.1 什么是缓存穿透 正常情况下,我们去查询数据都是存在的。 那么请求查询一条压根在数据库中就不存在的数据,即在缓存和数据库中都没有这条数据,但是请求每次在缓存中找不到,就去访问数据库,比较占用和消耗数据库的资源,这种现象,就叫做缓存穿透。 1.2 穿透带来的问题 黑客攻击系统,通过缓存穿透,使用一个不存在的id,大量访问系统的接口,系统因为缓存中没有数据,而去大量的访问数据库,导致数据库资源被无效占用,影响甚至拖垮正常业务。 1.3 解决办法 1.3.1 缓存空值 我们知道,缓存服务器(redis)一般是通过key value来存储缓存数据的。当有请求过来,会通过key在缓存中查找数据。而发生缓存击穿的问题,是因为缓存服务器中没有存储这些无效数据的key,从而导致无效请求访问到数据库。 那么我们可以在这些请求访问数据库后,没有得到查询结果时,在缓存服务器中存储这个key,并设置它的值为null,这样当再次发生查询这个key的请求时,缓存服务器就直接返回null

Hbase Schema 设计注意事项及最佳实践总结

僤鯓⒐⒋嵵緔 提交于 2019-12-05 17:43:53
一个列族的所有列在硬盘上存放在一起,使用这个特性可以把不同访问模式的列放在不同列族,以便隔离它们。这也是HBase被称为面向列族的存储(column-family-oriented store)的原因。 1、RowKey设计 在设计HBase表时,行键是唯一重要的事情,应该基于预期的访问模式来为行键建模。 行键决定了访问HBase表时可以得到的性能。这个结论根植于两个事实:region基于行键为一个区间的行提供服务,并且负责区间内每一行;HFile在硬盘上存储有序的行。当region刷写留在内存里的行时生成了HFile。这些行已经排过序,也会有序地刷写到硬盘上。HBase表的有序特性和底层存储格式可以让你根据如何设计行键以及把什么放入列限定符来推理其性能表现。 有效的行键设计不仅要考虑把什么放入行键中,而且要考虑它们在行键里的位置。 信息在行键里的位置和选择放入什么信息同等重要。 HBase中的数据是三维有序存储的,通过rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这个三个维度组合可以对HBase中的数据进行快速定位。 RowKey长度控制 RowKey是一个二进制字节数组,可以是任意字符串,最大长度 64kb ,实际应用中一般为10-100bytes,以byte[] 形式保存,一般设计成定长。建议越短越好

阿里一面:关于【缓存穿透、缓存击穿、缓存雪崩、热点数据失效】问题的解决方案

微笑、不失礼 提交于 2019-12-05 08:08:27
1 前言 在我们的平常的项目中多多少少都会使用到缓存,因为一些数据我们没有必要每次查询的时候都查询到数据库。 特别是高QPS的系统,每次都去查询数据库,对于你的数据库来说将是灾难。 今天我们不牵涉多级缓存的知识,就把系统使用到的缓存方案,不管是一级还是多级的都统统成为缓存,主要是为了讲述使用缓存的时候可能会遇到的一些问题以及一些解决办法。 我们缓存时,我们的业务系统大概的调用流程如下图片: 当我们查询一条数据时,先去查询缓存,如果缓存有就直接返回,如果没有就去查询数据库,然后返回。这种情况下就可能会出现一些现象。 2 缓存穿透 2.1 什么是缓存 正常情况下,我们去查询数据都是存在的。 那么请求去查询一条压根儿数据库中根本就不存在的数据,也就是缓存和数据库都查询不到这条数据,但是请求每次都会打到数据库上面去。 这种查询不存在数据的现象我们称为缓存穿透。 2.2 穿透带来的问题 试想一下,如果有黑客会对你的系统进行攻击,拿一个不存在的id 去查询数据,会产生大量的请求到数据库去查询。可能会导致你的数据库由于压力过大而宕掉。 2.3 解决办法 2.3.1 缓存空值 之所以会发生穿透,就是因为缓存中没有存储这些空数据的key。从而导致每次查询都到数据库去了。 那么我们就可以为这些key对应的值设置为null 丢到缓存里面去。后面再出现查询这个key 的请求的时候,直接返回null。 这样

DKhadoop版本选择与监控参数介绍

杀马特。学长 韩版系。学妹 提交于 2019-12-04 21:04:48
前阶段用了差不多两周的时间把DKhadoop的运行环境搭建以及安装的各个操作都介绍了一遍。关于DKhadoop安装包下载也只是顺带说了一下,但好像大快搜索的服务器在更新,新的下载页面还不好用!有好些朋友留言说了大快搜索网站上无法下载。我已经将之前下载的这个版本上传到了网盘了,需要的DKhadoop安装包的朋友可以直接通过网盘下载! DKHadoop安装包下载: 关于DKhadoop版本在写Hadoop环境搭建部署的时候有提到过,大版本主要有DKHadoop标准版本、DKH-分布式SQL版本、DKHadoop商业发行版。我们自己可以去下载到的包括我之前下载的安装包版本都是三节点的学习版本。DKhadoop标准版本有测试用的单机版,支持3节点的学习版本,以及支持个人研发用的5节点标准服务器版本。3节点此前是提供免费下载,5节点可能需要提交申请,但还好同样也是免费的! DKHadoop安装包下载地址: https://pan.baidu.com/s/1-427Sh6lTLrLAPh6KMOYVg 密码: vg2w DKM平台监控参数说明: 平台监控参数的内容主要就是针对下载安装了DKHadoop的朋友了,下面简单的各大家介绍几个监控参数。 1、首页监控界面 (1) 集群平均负载 监控集群CUP负载 纵轴表示 任务数量,单位个 横轴表示时间,单位分钟 表示集群内等待的任务数量,

Hbase访问方式之Hbase shell

本秂侑毒 提交于 2019-12-04 16:17:12
Hbase的访问方式 1、Native Java API:最常规和高效的访问方式; 2、HBase Shell:HBase的命令行工具,最简单的接口,适合HBase管理使用; 3、Thrift Gateway:利用Thrift序列化技术,支持C++,PHP,Python等多种语言,适合其他异构系统在线访问HBase表数据; 4、REST Gateway:支持REST 风格的Http API访问HBase, 解除了语言限制; 5、MapReduce:直接使用MapReduce作业处理Hbase数据; 6、使用Pig/hive处理Hbase数据。 Hbase shell基本用法 hbase shell 的help对语法的介绍很全,搞明白help上的实例,对hbase shell的操作就很熟练了。 hbase shell 的操作分为 10类,本文只介绍前4类,分别是: Group name commands general status, table_help, version, whoami ddl alter, alter_async, alter_status, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, get_table, is_disabled, is

使用Hbase协作器(Coprocessor)同步数据到ElasticSearch

非 Y 不嫁゛ 提交于 2019-12-04 15:28:10
使用Hbase协作器(Coprocessor)同步数据到ElasticSearch 最近项目中需要将Hbase中的数据同步到ElasticSearch中,需求就是只要往Hbase里面put或者delete数据,那么ES集群中,相应的索引下,也需要更新或者删除这条数据。本人使用了hbase-rirver插件,发现并没有那么好用,于是到网上找了一些资料,自己整理研究了一下,就自己写了一个同步数据的组件,基于Hbase的协作器,效果还不错,现在共享给大家,如果大家发现什么需要优化或者改正的地方,可以在我的csdn博客:我的csdn博客地址上面私信我给我留言,代码托管在码云上Hbase-Observer-ElasticSearch。同时要感谢Gavin Zhang 2shou,我虽然不认识Gavin Zhang 2shou,(2shou的同步数据博文)但是我是看了他写的代码以及博客之后,(2shou的同步组件代码)在他的基础之上对代码做了部分优化以及调整,来满足我本身的需求,所以在此表示感谢,希望我把我的代码开源出来,其他人看到之后也能激发你们的灵感,来写出更多更好更加实用的东西: Hbase协作器(Coprocessor) 编写组件 部署组件 验证组件 总结 Hbase协作器(Coprocessor) HBase 0.92版本后推出了Coprocessor — 协处理器

LSM树(Log-Structured Merge Tree)存储引擎浅析

独自空忆成欢 提交于 2019-12-04 07:28:09
其实每一种数据库,它都是一种抽象的数据结构的具体实现。 随着 rocksDB(facebook的),levelDB(google的),以及我们熟知的hbase,他们都是使用的LSM树结构的数据库。 它的核心思路其实非常简单,就是假定内存足够大,因此不需要每次有数据更新就必须将数据写入到磁盘中,而可以先将最新的数据驻留在内存中,等到积累到最后多之后,再使用归并排序的方式将内存内的数据合并追加到磁盘队尾(因为所有待排序的树都是有序的,可以通过合并排序的方式快速合并到一起)。下图是最简单的二层LSM Tree. 图来自 lsm论文 lsm tree,理论上,可以是内存中树的一部分和磁盘中第一层树做merge,对于磁盘中的树直接做update操作有可能会破坏物理block的连续性,但是实际应用中,一般lsm有多层,当磁盘中的小树合并成一个大树的时候,可以重新排好顺序,使得block连续,优化读性能。 一般数据库的存储一定要保持有序,有序是一个非常重要的概念(当然hash结构的除外, hash 不支持顺序扫描 ,对应的存储系统为key-value存储系统。对于key-value的插入以及查询,哈希表的复杂度都是O(1),明显比树的操作O(n)快,如果不需要有序的遍历数据,哈希表就是your Mr.Right ). LSM树相比于B+树(大量的叶节点操作, 不仅支持单条记录的增、删、读、改操作

CDH5 hadoop-hive-habse单机版配置

心已入冬 提交于 2019-12-03 23:17:18
CDH5 hadoop-hive-habse单机版配置 一、安装环境: OS:CentOS6.5 64位 JDK:jdk-7u72-linux-x64 hadoop:hadoop-2.3.0-cdh5.0.0. hbase:hbase-0.96.1.1-cdh5.0.0. hive:hive-0.12.0-cdh5.0.0.tar 我所用的都是基于CDH5.0.0的,使用CDH的发行版不会存在各个组件间不兼容,导致启动失败等异常。 CDH的其他版本可以在这里下载http://archive-primary.cloudera.com/cdh5/cdh/5/ 注意下载各个组件的时候其CDH的版本号一定都要相同。 文章中所有安装包和第三方jar包和配置文件都可以在这里下载到 http://pan.baidu.com/s/1pJDjHQN 二、基础准备 1.首先安装好linux系统,我这里的是:CentOS6.5,推荐为hadoop相关的操作再专门建立一个用户,因为root用户权限太大了 用root用户在shell下运行: //创建一个叫hadoop的用户 >useradd hadoop //给hadoop设置密码 >passwd hadoop 2.安装jdk,jdk就用root安装好了,linux下配置jdk的方式这里就不细说了,这里用rpm安装 >rpm -ivh jdk-7u72

为什么现在Java面试都要求掌握分布式知识!

懵懂的女人 提交于 2019-12-03 15:00:09
新的一年又开始了,各大招聘咨询机构都会对过去一年市场上的人才供需进行盘点。 根据高端招聘平台 100 offer 发布的 Java 人才盘点报告, 在过去的 2018 年, Java 仍然是最流行、招聘供需量最大的技术语言。 在此基础上,互联网行业针对 Java 开发的招聘需求,也是近年技术类岗位供需量最大,且变化最稳定的。企业对 Java 工程师发放的面邀数占比也远高于其他岗位,在 100 offer 平台上, Java 工程师的需求占总需求的近 60% ,可以说,在当前各大公司 “ 裁员 ” 的背景下, Java 工程师,尤其是资深 Java 工程师依旧是硬通货。 什么样的工程师才能被称为资深,又如何成为资深 Java 工程师呢? 从工作时间来看,资深工程师一般具备 3-5 年工作经验,企业对有 3-5 年经验的 Java 工程师,都会要求算法基础和编程能力扎实,有分布式、高并发经验优先,可独立负责一个模块的开发。在技术上一专多能,不仅限于写好 Java ,还要触类旁通,对公司业务所需的新技术能快速学习运用,以一个资深 Java 开发招聘为例: 从上面的招聘信息可以看到几个信息: 1 、 即使在这个 “ 裁员 ” 寒冬里,企业也是愿意为有能力的资深 Java 工程师付费的。 一个资深程序员达到 50w+ 的待遇是没问题的。在 IT 届也流传着一个观点: 1