一作:Mark, 资深大数据架构师、Java架构师,近20年Java、大数据架构和开发经验。资深架构导师,成功指导了多个中级Java、高级Java转型架构师岗位。
二作:尼恩,41岁资深老架构师, IT领域资深作家、著名博主。《Java 高并发核心编程 加强版 卷1、卷2、卷3》创世作者。 《K8S学习圣经》《Docker学习圣经》《Go学习圣经》等11个PDF 圣经的作者。 也是一个 资深架构导师、架构转化 导师, 成功指导了多个中级Java、高级Java转型架构师岗位, 最高的学员年薪拿到近100W。
HBase 是一个分布式、可扩展、高性能的列式存储系统,它基于 Google 的 Bigtable 设计。HBase 的主要存储结构包括表(Table)、区域(Region)、列族(Column Family)、列(Column)和值(Value)。
HBase 的存储结构还包括以下组件:
总之,HBase 的存储结构由表、区域、列族、列和值组成,这些组件通过 HRegionServer、HMaster 和 Store 等组件进行管理。这种结构使得 HBase 具有高性能、可扩展性和高可用性,能够轻松地处理海量数据。
HBase采用Master/Slave架构搭建集群,它隶属于Hadoop生态系统,由一下类型节点组成: HMaster 节点、HRegionServer 节点、 ZooKeeper 集群,而在底层,它将数据存储于HDFS中,因而涉及到HDFS的NameNode、DataNode等,总体结构如下:
各组件说明:
Client:
访问数据的入口,包含访问HBase的API接口,维护着一些cache来加快对HBase的访问
HMaster:NAMENODE RESOURCEMANAGER
HMaster 没有单点问题,HBase中可以启动多个HMaster,通过Zookeeper保证总有一个Master在运行。
HMaster主要负责Table和Region的管理工作:
HRegionServer:DATANODE NODEMANAGER
HBase中最核心的模块;
Zookeeper:
HBase
Hive
类型
列式数据库
数据仓库
内部机制
数据库引擎
MapReduce
增删改查
都支持
只支持导入和查询
Schema
只需要预先定义列族,不需要具体到列列可以动态修改
需要预先定义表格
应用场景
实时
离线处理
特点
以K-V形式存储
类SQL
Hive是一种类SQL的引擎,并且运行MapReduce任务,HBase是一种在Hadoop之上的NoSQL 的Key/vale数据库。
HBase运行在hdfs上,和hive不一样,HBase能够在数据库上实时运行,而不是运行MapReduce任务。
应用场景
HBase非常适合用来进行大数据的实时查询。
首先一点需要明白:Hbase是基于HDFS来存储的。
主要原因是由其架构和底层的数据结构决定的,即由LSM-Tree(Log-Structured Merge-Tree)+HTable(region分区)+Cache决定。
客户端可以直接定位到要查数据所在的Hregion-server服务器,然后直接在服务器的一个region上查找要匹配的数据,并且这些数据部分是经过cache缓存的。
HBase会将数据保存到内存中,在内存中的数据是有序的,如果内存空间满了,会刷写到HFile中,而在HFile中保存的内容也是有序的。当数据写入HFile后,内存中的数据会被丢弃.HFile文件为磁盘顺序读取做了优化。
HBase的写入速度快是因为他其实并不是真的立即写入文件中,而是先写入内存,随后异步刷入HFile。所以在客户端看来,写入数据速度很快。另外,写入时候随机写入转换成顺序写,数据写入速度也很稳定。读取速度很快是因为他使用了LSM树形结构,而不是B或B+树。 磁盘顺序读取速度很快,但是相比而言,寻找磁道的速度就要慢很多。HBase的存储结构导致他需要磁盘寻道时间在可预测范围内,并且读取与所要查询的rowkey连续的任意数量的记录都不会引发额外的寻道开销。比如有五个存储文件,那么最多需要5次磁盘寻道就可以。而关系型数据库,即使有索引,也无法确定磁盘寻道次数。而且,HBase读取首先会在缓存(BlockCache)中查找,它采用了LRU(最近最少使用算法),如果缓存中没找到,会从内存中的MemStore中查找,只有这两个地方都找不到时,才会加载HFile中的内容。
RowKey的长度不宜过长,不宜超过16个字节,最大长度64kb,实际应用中一般为10-100bytes,以byte[]形式保存。一条数据是根据rowkey来当成索引的,如果过长就会快速占据memstore的128M,然后被刷写到磁盘,也就是说相同的空间存贮的内容被rowkey占据了一大部分,减少了主要内容的存贮。
必须在设计上保证其唯一性, rowkey可以锁定唯一的一行数据,rowkey重复的话后put的数据会覆盖前面插入的数据
HBase的查询实现只提供两种方式:
2)scan 可以通过setStartRow 与setEndRow 来限定范围([start,end)start 是闭区间,end 是开区间)。范围越小,性能越高。
3)scan 可以通过setFilter 方法添加过滤器,这也是分页、多条件查询的基础。
HBase中的Cell表示的是表中的单元格,由{rowkey, column Family:columu, version} 唯一确定的单元。cell中的数据是没有类型的,全部是字节码形式存贮。其中 version 就是这个单元格中的 Time Stamp。
在 HBase 中,一个 cell 的结构由以下三个部分组成:
version:version 是 cell 的时间戳,用于记录 cell 的创建时间或修改时间。在 HBase 中,每个 cell 都有一个唯一的时间戳,用于唯一确定该 cell 的版本。
数据:data 是 cell 中存储的数据,数据类型可以是任何字节码形式。在 HBase 中,数据是以字节码形式存储的,而不是特定的数据类型。这种存储方式使得 HBase 可以存储任何类型的数据,例如文本、图片、音频等。
值:value 是 cell 中存储的实际数据值。在 HBase 中,值是由字节码形式存储的,而不是特定的数据类型。这种存储方式使得 HBase 可以存储任何类型的数据,例如文本、图片、音频等。
HBase 中的 cell 是表中的基本存储单元,由 rowkey、column family、column 和 version 唯一确定。cell 中的数据是以字节码形式存储的,可以是任何类型的数据。
在 HBase 中,分布式存储的最小单元是 Region。每个 Region 都是一个独立的存储单元,包含一个或多个 StoreFile。Region 是 HBase 中数据存储和访问的基本单位,也是 HBase 中分布式存储和负载均衡的基础。
然而,Region 并不是存储的最小单元。在 HBase 中,存储的最小单元是 StoreFile。StoreFile 是 HBase 中的数据存储文件,每个 StoreFile 都包含一个或多个列族的数据。StoreFile 的大小通常由
因此,虽然 Region 是分布式存储的最小单元,但 StoreFile 才是 HBase 中存储的最小单元。
在 HBase 中,region 太小和 region 太大都可能导致性能问题和数据丢失。
下面是一些解决这些问题的方法:
其中,预分区参数指定了要创建的 region 数量。
在 HBase 中,compact 用于合并多个 storefile,从而减少磁盘上的文件数量,提高查询效率。Compact 操作会清理过期数据和删除标记,从而避免数据丢失和磁盘空间浪费。
Compact 的作用:
HBase 中实现了两种compaction 的方式:minor 和 major。
Minor compaction 和 major compaction 的区别在于合并的范围和执行的频率。
HBase默认建表时有一个region。这个region的rowkey是没有边界的,即没有startkey和endkey,在数据写入时,所有数据都会写入这个默认的region,随着数据的不断增加,此region已经不能承受不断增长的数据量,会进行split,分成2个region.。在此过程中,会产生两个问题:
基于此我们可以控制在建表的时候,创建多个空region,并确定每个region的起始和终止rowkey,这样只要我们的rowkey设计能均匀的命中各个region,就不会存在写热点问题。自然split的几率也会大大降低。当然随着数量的不断增长,该split的还是要进行split。像这样预先创建HBase表分区的方式,称之为预分区
创建预分区可以通过shell或者java代码实现
的流程如下:
2)解析参数(0.96 版本及以后才可以带唯一参数 autorestart,作用就是重启)
3)调用 来启动 master
4)调用 来启动 regionserver zookeeper master-backup
HBase 是一个分布式、可扩展、高性能的列式存储系统,它支持多种查询方式以满足不同场景的需求。
以下是 HBase 的查询方式的详细描述:
1)按指定的 rowkey 获取唯一一条数据,使用 get 方法。get 方法分为两种,分别是设置了 closestRowBefore 和没有设置的 rowlock。只要保证行的事务性,即每一个 get 以一个 row 来标记的,一个 row 中可以有多个 family 和 column。例如,获取 rowkey 为 "1" 的第一列数据,可以使用以下命令:
2)按指定的条件获取一批记录,使用 scan 方法进行条件查询。scan 方法可以通过以下方式进行优化:
使用 setCaching 和 setBatch 方法来提高速度。例如,设置每次 RPC 请求返回的行数为 10,可以使用以下命令:
使用 setStartRow 和 setEndRow 方法来限定范围(左闭右开)。例如,要查询 rowkey 从 "1" 到 "2" 的数据,可以使用以下命令:
使用 setFilter 方法来添加过滤器。例如,要查询列族 cf 中的列 column1,可以使用以下命令:
总之,HBase 提供了多种查询方式以满足不同场景的需求。根据实际应用场景选择合适的查询方式,可以提高 HBase 的性能。
1)HRegisonServer保存着.meta.表及数据表,首先client先访问zk,访问-ROOT-表,然后在zk上面获取.meta.表所在的位置信息,找到这个meta表在哪个HRegionServer上面保存着。
2)接着client访问HRegionServer表从而读取.meta.进而获取.meta.表中存放的元数据。
3)client通过.meta.中的元数据信息,访问对应的HRegionServer,然后扫描HRegionServer的Memstore和StoreFile来查询数据。
4)最后把HRegionServer把数据反馈给client。
1)client访问zk中的-ROOT-表,然后后在访问.meta.表,并获取.meta.中的元数据。
2)确定当前要写入的HRegion和HRegionServer。
3)clinet向HRegionServer发出写相应的请求,HRegionServer收到请求并响应。
4)client先将数据写入到HLog中,以防数据丢失。
5)然后将数据写入到MemStore中。
6)如果HLog和MemStore都写入成功了,那么表示这个条数据写入成功了。
7)如果MemStore写入的数据达到了阈值,那么将会flush到StoreFile中。
8)当StoreFile越来越多,会触发Compact合并操作,将过多的StoteFile合并成一个大的StoreFile。
9)当StoreFile越来越多时,Region也会越来越大,当达到阈值时,会触发spilit操作,将这个Region一分为二。
ps:HBase中所有的更新和删除操作都会在后续的compact中进行,使得用户的写操作只需要进入内存中就行了。实现了HBase的 I/O高性能。
HBase 的 flush 流程是指将内存中的数据写入磁盘的过程,它分为三个阶段:prepare、flush 和 commit。下面对这三个阶段进行详细描述:
HBase 的 flush 流程旨在确保数据的一致性、完整性和高效性。通过将内存中的数据写入磁盘,可以释放内存资源,以便后续的读写操作。同时,flush 流程的设计也保证了数据在写入磁盘过程中的高可用性和可靠性。
HBase 是一个面向列的数据库,所以在进行模型设计时,重点在于如何高效地存储和查询数据。HBase 的设计目标是尽可能地利用列存储和查询的优势,提高系统的性能和可扩展性。
在一张表中定义多少个 Column Family 最合适,这个问题没有一个确切的答案,因为 Column Family 的个数具体看表的数据。一般来说,划分标准是根据数据访问频度,如一张表里有些列访问相对频繁,而另一些列访问很少,这时可以把这张表划分成两个列族,分开存储,提高访问效率。
另外,也需要考虑数据的类型、长度和访问模式等因素,以便合理地分配存储资源和提高查询效率。在实际应用中,根据业务场景和数据特点进行合理的列族和列的设计,以及行键和二级索引的设计,以最大化地利用 HBase 的存储和查询优势。
提高 HBase 客户端的读写性能需要从多个方面进行优化。
以下是一些可能有用的优化方法:
总之,优化 HBase 客户端的读写性能需要从多个方面进行考虑,包括内存配置、Compaction 策略、缓存策略、MemStore 大小以及读写负载的分配等。根据实际情况调整这些参数,可以显著提高 HBase 的性能。
某个小的时段内,对HBase的读写请求集中到极少数的Region上,导致这些region所在的RegionServer处理请求量骤增,负载量明显偏大,而其他的RgionServer明显空闲。
热点发生在大量的client直接访问集群的一个或极少数个节点(访问可能是读,写或者其他操作)。大量访问会使热点region所在的单个机器超出自身承受能力,引起性能下降甚至region不可用,这也会影响同一个RegionServer上的其他region,由于主机无法服务其他region的请求。
为了避免写热点,设计rowkey使得不同行在同一个region,但是在更多数据情况下,数据应该被写入集群的多个region,而不是一个。常见的方法有以下这些:
HBase 中的大合并和小合并都是针对 HFile 文件的管理操作。HFile 是 HBase 中的存储文件,每个 HFile 文件都包含一个或多个 Region 的数据。当数据在 HFile 文件中被删除时,该记录会被打上标记 DeleteColumn,并且使用 get 和 scan 查询不到,但是该记录仍然存在于 HFile 文件中。
HBase 中的大合并和小合并都是通过 HFile 文件进行数据管理的操作。大合并用于删除标记为 DeleteColumn 的记录,并确保数据的一致性和完整性;小合并用于减少 HFile 文件的数量,提高查询效率。这两种合并操作在 HBase 集群中进行,以确保数据的安全性和一致性。
第1章 Spring相关1.1 什么是控制反转(IOC)?什么是依赖注入? 控制反转是应用于软件工程领域中的,在运行时被装配器对象来绑定耦合对象的一种编程技巧,对象之间耦合关系在编译时通常是未知的。在传统的编程方式中,业务逻辑的流程是由应用程序中的早已被设定好关联关系的对象来决定的。在使用控制反转的情况下,业务逻辑的流程是由对象关系图来决定的,该对象关系图由装配器负责实例化,这种实现方式还可以将对
《尼恩 大数据 面试宝典》PDF 后面会不断升级,不断 迭代, 变成大数据领域 学习和面试的必读书籍,帮助大家成长为 三栖合一架构师,进了大厂,拿了高薪。
Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。并且 Flink 提供了数据分布、容错机制以及资源管理等核心功能。Flink提供了诸多高抽象层的API以便用户编写分布式任务。
40+ 个非常有用的 Oracle 查询语句,主要涵盖了日期操作,获取服务器信息,获取执行状态,计算数据库大小等等方面的查询。这些是所有 Oracle 开发者都必备的技能,所以快快收藏吧!日期/时间 相关查询获取当前月份的第一天运行这个命令能快速返回当前月份的第一天。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。SELECT TRUNC (SYSDATE, 'MONT
ElasticSearch 深度分页 (史上最全)说明: ElasticSearch 深度分页 是面试的高频题目,社群小伙伴要求,尼恩写个博客来介绍一下,于是,此文就出来了三大ElasticSearch分页方式传统方式(from&size)顶部查询,查询10000以内的文档 场景:需要实时获取顶部的部分文档。eg: 例如查询最新的订单。Scroll 滚动游标 方式深度分页,用于非实时查询场
史上最全 Java 面试题之:Netty 篇友情提示此文持续迭代,最新版本,请咨询尼恩40岁老架构师尼恩暗语:如果在简历上写了Netty,那么:下面的面试题,最好都会如果要面试高端的开发、大厂的开发、或者架构师,那么: 简历上一定要写nettyso,下面的面试题,越烂熟于心,越好Netty 是什么?Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Ne
ElasticSearch基础:一、Elasticsearch 的基本概念:1、什么是Elasticsearch: Elasticsearch 是基于 Lucene 的 Restful 的分布式实时全文搜索引擎,每个字段都被索引并可被搜索,可以快速存储、搜索、分析海量的数据。全文检索是指对每一个词建立一个索引,指明该词在文章中出现的次数和位置。当查询时,根据事先建立的索引进行查找,并将查找的结果反
Spring面试题 专题部分什么是spring?Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持。Spring负责基础架构,因此Java开发者可以专注于应用程序的开发。Sprin
1.什么是活锁、饥饿、无锁、死锁?死锁、活锁、饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现 了这三种情况,即线程不再活跃,不能再正常地执行下去了。死锁死锁是多线程中最差的一种情况,多个线程相互占用对方的资源的锁,而又相互等 对方释放锁,此时若无外力干预,这些线程则一直处理阻塞的假死状态,形成死锁。 举个例子,A 同学抢了 B 同学的钢笔,B 同学抢了 A 同学的书,两个人都相互占
最后这段时间是否全面复习:这个问题我是坚持的反对的!因为在自学学习的知识面,是很广的,而真正工作中用到的不会有这么多。大家现在所要做的,就是把简历精心的准备好,把简历上涉及到的知识点掌握熟就可以了。完全不必要把自学学过的知识再从头到尾复习一遍,这样即消耗了大量的时间,对找工作帮助也不是很大。文档的命名:XXX应聘android开发.doc XXX_android_3年工作经验.doc写简历:
# 如何实现“史上最全的 Spark 面试题”在进入开发领域后,尤其是在大数据和数据处理的职业中,Apache Spark 是一个不可或缺的工具。作为一名经验丰富的开发者,我将指导一位刚入行的小白如何实现一个“史上最全的 Spark 面试题”的项目。以下是整个过程的详细说明,包括步骤表格和代码示例。## 流程概述为了系统地收集和实现 Spark 面试题,我们可以将整个过程分为以下几个步
自Spring Boot诞生以来,就引起了业界轰动,目前越来越多的公司技术选型选择拥抱Spring Boot。所以Spring Boot也成为面试必问的问题之一。下面的问题是小胖哥面试了很多候选人后总结出来的,希望对你有所帮助问 Spring和Spring Boot有什么区别?答Spring Framework提供了多种功能,使Web应用程序的开发更加容易。这些功能包括依赖注入
最近我开始偷偷投简历了。与老东家的合同快要到期,想知道自己的斤两,续签
目录1、不同版本的 Spring Framework 有哪些主要功能? 2、什么是 Spring Framework? 3、列举 Spring Framework 的优点。 4、Spring Framework 有哪些不同的功能? 5、Spring Framework 中有多少个模块,它们分别是什
问题1- Swift 1.0 or later什么是optional类型,它是用来解决什么问题的?答案:optional类型被用来表示任何类型的变量都可以表示缺少值。在Objective-C中,引用类型的变量是可以缺少值得,并且使用nil作为缺少值。基本的数据类型如int 或者float没有这种功能。Swift用optional扩展了在基本数据类型和引用类型中缺少值的概念。一个optional类型的变量,在任何时候都可以保存一个值或者为nil。问题2- Swift 1.0 or later
【面试妥了】史上最全Spark面试题Spark问题精华Q:什么是Spark? A:简单理解,Spark是在Hadoop基础上的改进,是UC Berkeley AMP lab所开源的类Hadoop MapReduc...
本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉水. 前一阵系统的学习了一下MySQL,也有一些实际操作经验,偶然看到一篇和MySQL相关的面试文章,发现其中的一些问题自己也回答不好,虽然知识点大部分都知道,但是无法将知识串联起来. 因此决定搞一个 ...
由于shuffle阶段涉及磁盘的读写和网络IO,因此shuffle性能的高低直接影响整个程序的性能和吞吐量。 【注:毕竟有些东西我没有实际应用、经历,所以文中难免有错,还请各路大神多多指正!】1. spark的shuffle 是什么?过程? 怎么调优?在MapReduce过程中需要将各个节点上的同一类数据汇集到一个节点进行计算。把这些分布在不同节点的数据按照一定规则聚集到一起的过程,就称之为sh
一、核心概念与继承体系二、Queue 核心方法与实现1. 核心操作:方法说明异常处理offer(e)添加元素(推荐)失败返回falseadd(e)添加元素失败抛IllegalStateExceptionpoll()移除并返回队头元素空队列返回nullremove()移除并返回队头元素空队列抛NoSuchElementExceptionpeek()查看队头元素(不删除)空队列返回nullelemen
说来真的是惭愧,作为一个把《A Byte of Vim》打印成册送给了两三位朋友的人,本人居然没有通读过一遍《A Byte of Vim》,今天才准备正式就是通读并且验证一下书中的一些用法 已经学习了的有,在vim正常模式下的 :help :edit 这里面是一些关于:edit指令及其参数的一些说明 ...
1. 栈 (Stack) 的工作方式 栈是一种后进先出 (LIFO - Last In, First Out) 的数据结构。你可以把它想象成一个叠盘子,最后放上去的盘子,最先被拿走。 在计算机中,栈主要用于: 函数调用: 当一个函数被调用时,需要保存当前程序的执行位置(返回地址),并将参数传递给新函 ...