-
特点:flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(比如文本、HDFS、Hbase等)的能力
-
Flume的可靠性:当节点出现故障时,日志能够被传送到其他节点上而不会丢失。
- Flume提供了三种级别的可靠性保障:
- end to end:收到数据agent首先将event写到磁盘上,当数据传送成功后,再删除;如果数据发送失败,可以重新发送。
- Store on failure:这也是scribe采用的策略,当数据接收方crash时,将数据写到本地,待恢复后,继续发送
- Besteffort:数据发送到接收方后,不会进行确认
- Flume提供了三种级别的可靠性保障:
-
Flume的可恢复性:使用FileChannel,事件持久化在本地文件系统里(性能较差)
-
Flume的一些核心概念:
名称 说明 Agent(代理) 使用JVM 运行Flume。每台机器运行一个agent,但是可以在一个agent中包含多个sources和sinks。 Client(委托) 生产数据,运行在一个独立的线程。 Source(来源) 从Client收集数据,传递给Channel。 Sink(接收器) 从Channel收集数据,运行在一个独立线程。 Channel(通道) 连接 sources 和 sinks ,类似一个队列。 Events(事件) 可以是日志记录、 avro 对象等。 -
部署类型:
-
单一流程:Flume以agent为最小的独立运行单位。一个agent就是一个JVM。单agent由Source、Sink和Channel三大组件构成。
-
多代理流程:可以将多个Agent顺序连接起来,将最初的数据源经过收集,存储到最终的存储系统中。这是最简单的情况,一般情况下,应该控制这种顺序连接的Agent 的数量,因为数据流经的路径变长了,如果不考虑failover的话,出现故障将影响整个Flow上的Agent收集服务。
-
流的合并:这种情况应用的场景比较多,比如要收集Web网站的用户行为日志, Web网站为了可用性使用的负载集群模式,每个节点都产生用户行为日志,可以为每 个节点都配置一个Agent来单独收集日志数据,然后多个Agent将数据最终汇聚到一个用来存储数据存储系统,如HDFS上。
-
多路复用流:Flume还支持多级流,什么多级流?来举个例子,当syslog, java, nginx、 tomcat等混合在一起的日志流开始流入一个agent后,可以agent中将混杂的日志流分开,然后给每种日志建立一个自己的传输通道。
-
负载平衡:将Channel暂存的Event均衡到对应的多个Sink组件上,而每个Sink组件分别连接到一个独立的Agent上 。
-
-
Flume抓取日志类型
-
Avro序列化:Avro可以发送一个给定的文件给Flume
-
Spool:Spool监测配置的目录下新增的文件,并将文件中的数据读取出来
-
Exec:EXEC执行一个给定的命令获得源的变化。
-
Syslogtcp:Syslogtcp监听TCP的端口做为数据源。
-
JSONHandler:接受json格式数据。
-
Hadoop sink:配置Hadoop接受数据。
-
File Roll Sink:配置本地文件接受数据。
-
-
分布式应用的优点:
- 可靠性- 单个或几个系统的故障不会使整个系统出现故障。
- 可扩展性- 可以在需要时增加性能,通过添加更多机器,在应用程序配置中进行微小的更改,而不会有停机时间。
- 透明性- 隐藏系统的复杂性,并将其显示为单个实体/应用程序。
-
分布式应用的挑战:
- 竞争条件- 两个或多个机器尝试执行特定任务,实际上只需在任意给定时间由单个机器完成。例如,共享资源只能在任意给定时间由单个机器修改。
- 死锁- 两个或多个操作等待彼此无限期完成。
- 服务发现 -client如何发现server,检测server存活性。
- 不一致- 数据的部分失败。
-
概念:
- 观察者模式:zk的核心功能,监听数据的变化
- 服务管理框架:zk的重要性就体现在对绝大部分分布式架构的服务治理
-
提供的常见服务:
- 命名服务- 按名称标识集群中的节点。它类似于DNS,但仅对于节点。
- 配置管理- 加入节点的最近的和最新的系统配置信息。
- 集群管理- 实时地在集群和节点状态中加入/离开节点。
- 选举算法- 选举一个节点作为协调目的的leader。
- 锁定和同步服务- 在修改数据的同时锁定数据。此机制可帮助你在连接其他分布式应用程序(如Apache Hbase)时进行自动故障恢复。
- 高度可靠的数据注册表- 即使在一个或几个节点关闭时也可以获得数据。
-
架构:
组件 描述 Client(客户端) 客户端,我们的分布式应用集群中的一个节点,从服务器访问信息。对于特定的时间间隔,每个客户端向服务器发送消息以使服务器知道客户端是活跃的。 类似地,当客户端连接时,服务器发送确认码。如果连接的服务器没有响应,客户端会自动将消息重定向到另一个服务器。 Server(服务器) 服务器,我们的ZooKeeper总体中的一个节点,为客户端提供所有的服务。向客户端发送确认码以告知服务器是活跃的。 Ensemble ZooKeeper服务器组。形成ensemble所需的最小节点数为3。 Leader 服务器节点,如果任何连接的节点失败,则执行自动恢复。Leader在服务启动时被选举。 Follower 跟随leader指令的服务器节点。 -
ZooKeeper的层次命名空间:
- ZooKeeper节点称为 znode :每个znode都维护着一个stat结构。一个stat仅提供一个znode的元数据。它由版本号,操作控制列表(ACL),时间戳和数据长度组成。
- Znode的类型:
- 持久节点:即使在创建该特定znode的客户端断开连接后,持久节点仍然存在。默认情况下,除非另有说明,否则所有znode都是持久的。
- 临时节点- 客户端活跃时,临时节点就是有效的。当客户端与ZooKeeper集合断开连接时,临时节点会自动删除。因此,只有临时节点不允许有子节点。如果临时节点被删除,则下一个合适的节点将填充其位置。临时节点在leader选举中起着重要作用。
- 顺序节点- 顺序节点可以是持久的或临时的。当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将10位的序列号附加到原始名称来设置znode的路径。例如,如果将具有路径/myapp的znode创建为顺序节点,则ZooKeeper会将路径更改为/myapp0000000001,并将下一个序列号设置为0000000002。如果两个顺序节点是同时创建的,那么ZooKeeper不会对每个znode使用相同的数字。顺序节点在锁定和同步中起重要作用。
-
Watches(监视): 监视是一种简单的机制,使客户端收到关于ZooKeeper集合中的更改的通知。客户端可以在读取特定znode时设置Watches。Watches会向注册的客户端发送任何znode(客户端注册表)更改的通知。Znode更改是与znode相关的数据的修改或znode的子项中的更改。只触发一次watches。如果客户端想要再次通知,则必须通过另一个读取操作来完成。当连接会话过期时,客户端将与服务器断开连接,相关的watches也将被删除。
- keeperState:反应当前的节点状态,节点发生了什么样的变化
- eventType:反应当前的事件状态,对节点做了什么操作
- 可以监听的范围:
- 创建连接的时候
- 子节点操作
- 当前节点的数据操作
- 监听指定节点的存在情况
- 监听器默认情况下,只能监听到一次;如果需要让他一直生效,需要循环监听
- 由于监听者是由一个守护线程来维持的,所以当用户线程结束后,守护线程自动结束;由代理来调用该process方法
-
数据发布与订阅:发布与订阅即所谓的配置管理,顾名思义就是将数据发布到zk节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,地址列表等就非常适合使用。
- 索引信息和集群中机器节点状态存放在zk的一些指定节点,供各个客户端订阅使用。
- 系统日志(经过处理后的)存储,这些日志通常2-3天后被清除。
- 应用中用到的一些配置信息集中管理,在应用启动的时候主动来获取一次,并且在节点上注册一个Watcher,以后每次配置有更新,实时通知到应用,获取最新配置信息。
- 业务逻辑中需要用到的一些全局变量,比如一些消息中间件的消息队列通常有个offset,这个offset存放在zk上,这样集群中每个发送者都能知道当前的发送进度。
- 系统中有些信息需要动态获取,并且还会存在人工手动去修改这个信息。以前通常是暴露出接口,例如JMX接口,有了zk后,只要将这些信息存放到zk节点上即可。
-
分布通知/协调:ZooKeeper 中特有watcher注册与异步通知机制,能够很好的实现分布式环境下不同系统之间的通知与协调,实现对数据变更的实时处理。使用方法通常是不同系统都对 ZK上同一个znode进行注册,监听znode的变化(包括znode本身内容及子节点的),其中一个系统update了znode,那么另一个系统能 够收到通知,并作出相应处理。
- 另一种心跳检测机制:检测系统和被检测系统之间并不直接关联起来,而是通过zk上某个节点关联,大大减少系统耦合。
- 另一种系统调度模式:某系统有控制台和推送系统两部分组成,控制台的职责是控制推送系统进行相应的推送工作。管理人员在控制台作的一些操作,实际上是修改 了ZK上某些节点的状态,而zk就把这些变化通知给他们注册Watcher的客户端,即推送系统,于是,作出相应的推送任务。
- 另一种工作汇报模式:一些类似于任务分发系统,子任务启动后,到zk来注册一个临时节点,并且定时将自己的进度进行汇报(将进度写回这个临时节点),这样任务管理者就能够实时知道任务进度。 总之,使用zookeeper来进行分布式通知和协调能够大大降低系统之间的耦合。
-
分布式锁:分布式锁,这个主要得益于ZooKeeper为我们保证了数据的强一致性,即用户只要完全相信每时每刻,zk集群中任意节点(一个zk server)上的相同znode的数据是一定是相同的。锁服务可以分为两类,一个是保持独占,另一个是控制时序。
- 保持独占,就是所有试图来获取这个锁的客户端,最终只有一个可以成功获得这把锁。通常的做法是把zk上的一个znode看作是一把锁,通过create znode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。
- 控制时序,就是所有视图来获取这个锁的客户端,最终都是会被安排执行,只是有个全局时序了。做法和上面基本类似,只是这里 /distribute_lock 已经预先存在,客户端在它下面创建临时有序节点(这个可以通过节点的属性控制:CreateMode.EPHEMERAL_SEQUENTIAL来指定)。Zk的父节点(/distribute_lock)维持一份sequence,保证子节点创建的时序性,从而也形成了每个客户端的全局时序。
-
集群管理:
- 集群机器监控:这通常用于那种对集群中机器状态,机器在线率有较高要求的场景,能够快速对集群中机器变化作出响应。这样的场景中,往往有一个监控系统,实时检测集群机器是否存活。过去的做法通常是:监控系统通过某种手段(比如ping)定时检测每个机器,或者每个机器自己定时向监控系统汇报“我还活着”。 这种做法可行,但是存在两个比较明显的问题:1. 集群中机器有变动的时候,牵连修改的东西比较多。2. 有一定的延时。 利用ZooKeeper有两个特性,就可以实时另一种集群机器存活性监控系统:a. 客户端在节点 x 上注册一个Watcher,那么如果 x 的子节点变化了,会通知该客户端。b. 创建EPHEMERAL类型的节点,一旦客户端和服务器的会话结束或过期,那么该节点就会消失。
- Master选举则是zookeeper中最为经典的使用场景了。 在分布式环境中,相同的业务应用分布在不同的机器上,有些业务逻辑(例如一些耗时的计算,网络I/O处理),往往只需要让整个集群中的某一台机器进行执行, 其余机器可以共享这个结果,这样可以大大减少重复劳动,提高性能,于是这个master选举便是这种场景下的碰到的主要问题。 利用ZooKeeper的强一致性,能够保证在分布式高并发情况下节点创建的全局唯一性,即:同时有多个客户端请求创建 /currentMaster 节点,最终一定只有一个客户端请求能够创建成功。
-
节点状态
- czxid 创建该节点的事务ID
- ctime 创建该节点的时间
- mZxid 更新该节点的事务ID
- mtime 更新该节点的时间
- pZxid 操作当前节点的子节点列表的事物ID(包含增加子节点,删除子节点)
- cversion 当前节点的子节点版本号
- dataVersion 当前节点的数据版本号 aclVersion 当前节点的acl权限版本号
- ephemeralowner 当前节点的如果是临时节点,该属性是临时节点的事物ID
- dataLength 当前节点的数据长度
- numchildren 当前节点的子节点个数
-
基本api:
//创建节点 public static void createNode() throws Exception { ZooKeeper zk = new ZooKeeper("192.168.10.12:2181", 100000, null); String str = "真帅"; String result = zk.create("/testNode/test1", //路径 str.getBytes(), //获取数据的字节码 ZooDefs.Ids.OPEN_ACL_UNSAFE, //任何人都拥有所有权限 CreateMode.PERSISTENT);//永久节点 System.out.println(result);//返回当前已经创建的路径 zk.close(); } //获取节点 public static void getNode() throws Exception { ZooKeeper zk = new ZooKeeper("192.168.10.12:2181", 100000, null); // States stats = zk.getState();//获取状态-运行状态 // System.out.println(stats); //数据节点状态 Stat stat = new Stat(); byte[] data = zk.getData("/testNode/test1", null, stat); System.out.println(new String(data));//节点数据 System.out.println(stat.toString());//节点状态 zk.close(); } //修改节点 public static void setNode() throws Exception { ZooKeeper zk = new ZooKeeper("192.168.10.12:2181", 100000, null); Stat stat = zk.setData("/testNode/test1", "杨斌斌真帅!!!!".getBytes(), -1); System.out.println(stat.toString());//节点状态 zk.close(); } //删除节点 public static void removeNode() throws Exception { ZooKeeper zk = new ZooKeeper("192.168.10.12:2181", 100000, null); zk.delete("/testNode/test1", -1); zk.close(); } -
监听服务器的变化:
private Semaphore sp = new Semaphore(1); //监听时,服务器要保证客户端一定能收到消息,反复不断的向客户端发送状态 private boolean flag = true;//加一个状态防止虚假提交 public synchronized void test() throws Exception { ZooKeeper zk = new ZooKeeper("192.168.10.102:21811", 100000, null); //信号量 while(true) { zk.getData("/testNode/test1", new Watcher() { public void process(WatchedEvent event) { if(!flag) {//每次注册之后,只接收一次数据 return; } System.out.println(event.getState().name());//节点状态 System.out.println(event.getType().name());//操作类型 System.out.println(event.getPath());//那个节点发生了变化 sp.release(1);//清空信号量 flag = false; } }, new Stat()); sp.acquire(1);//信号量加满,线程也就停下来了 flag = true; } } -
watcher注册api:
API 说明 getChildren NodeChildrenChanged 新建子节点【激活】 删除子节点【激活】 修改子节点【不激活】 getData NodeDataChanged 修改该节点 NodeDeleted 删除该节点 exists NodeCreated 新建该节点 NodeDataChanged 修改该节点 NodeDeleted 删除该节点 -
验证模式(scheme):
权限 说明 digest Client端由用户名和密码验证,譬如user:password,digest的密码生成方式是Sha1摘要的base64形式 auth 不使用任何id,代表任何已确认用户。 ip Client端由IP地址验证,譬如172.2.0.0/24 world 固定用户为anyone,为所有Client端开放权限 super 在这种scheme情况下,对应的id拥有超级权限,可以做任何事情(cdrwa) 注意: exists操作和getAcl操作并不受ACL许可控制,因此任何客户端可以查询节点的状态和节点的ACL。
-
节点的权限(perms)
权限 说明 Create 允许对子节点Create操作 Read 允许对本节点GetChildren和GetData操作 Write 允许对本节点SetData操作 Delete 允许对子节点Delete操作 Admin 允许对本节点setAcl操作 -
Paxos算法的目的:为了解决分布式环境下一致性的问题。多个节点并发操纵数据,如何保证在读写过程中数据的一致性,并且解决方案要能适应分布式环境下的不可靠性(系统如何就一个值达到统一)
-
Paxos有两个原则:
- 安全原则—保证不能做错的事:针对某个实例的表决只能有一个值被批准,不能出现一个被批准的值被另一个值覆盖的情况;(假设有一个值被多数Acceptor批准了,那么这个值就只能被学习)。每个节点只能学习到已经被批准的值,不能学习没有被批准的值。
- 存活原则—只要有多数服务器存活并且彼此间可以通信,最终都要做到的下列事情:
最终会批准某个被提议的值;一个值被批准了,其他服务器最终会学习到这个值。
-
三军问题场景:
-
先后提议的场景
-
交叉场景
-
-
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。这三个要素最多只能同时实现两点,不可能三者兼顾。
-
zookeeper中节点分四种状态:
- looking:选举Leader的状态(集群刚启动时或崩溃恢复状态下,也就是需要选举的时候)
- following:跟随者(follower)的状态,服从Leader命令
- leading:当前节点是Leader,负责协调工作。
- observing:observer(观察者),不参与选举,只读节点。
-
zookeeper选举过程:leader挂了,需要选举新的leader
- 阶段一:崩溃恢复
- 阶段二:消息广播
- 阶段三:数据同步
-
选举过程:
- 找到新的leader(myid:zxid)
- 新的leader广播信息,告诉所有的follower我要进行数据同步
- follower接受到信息准备好之后会告诉leader我准备好了
- leader判断是否有半数以上follower准备好了
- 如果超过半数则再次广播同意写入,follower接受到同意的信息后,完成写入工作
- 如果有新节点加入或者有数据要写入,过程参照上面数据同步的流程(2-5)
-
定义:大吞吐量,内置分区,可以进行数据备份,同时具备数据容错性的消息系统。
- Kafka可以完成在线或者离线数据消费,所谓离线数据消费实际上就是kafka将消息数据保留在磁盘上。
- kafka会做数据备份,防止节点宕机从而导致数据丢失。
- 和spark产品的整合性非常好,可以完成实时的大数据分析
- kafka的节点可以无限扩容
-
消息系统:将数据从一个应用程序传递到另一个应用程序,分布式系统利用消息系统,在多应用之间进行高效、稳定、安全的数据传递。
-
两种消息模式:
- 点对点:若干个生产和消费者,处理队列当中的数据,一旦该数据被消费,则从队列当中被移除。(多线程:生产消费者模型)
- 发布-订阅:消息是被保留在主题当中,消费者一个消费一个或者若干个主题当中的消息
-
术语:
术语****1 术语****2 Topics(主题) Kafka Cluster(Kafka集群) Partition(分区) Producers(生产者) Partition offset(分区偏移) Consumers(消费者) Replicas of partition(分区备份) Leader(领导者) Brokers(经纪人) Follower(追随者) -
发布和订阅的流程
- 生产者向主题当中提交消息,代理将主题当中的数据在主题的分区当中依次保存;
- 消费者向代理请求获取消息,代理向消费者提供偏移量,消费者根据偏移量要求获取消息。
- 消费者排队的前提,消费者数量大于分区数量
-
生产者需要指定生产的主题
-
消费者:
-
要指定消费者的分组:默认情况下,分组是test
-
消费者可以同时消费若干个主题:
-
消息是已key-value格式进行发送
-
每个key如果重复发送,其偏移量会递增
-
新的key的偏移量从0开始
-
消费者要放在一个独立的线程当中,才能始终处于消费状态
-
Spring是没有办法直接给线程当中进行依赖注入的
-
消费者的线程如果要通知其他的任务执行,需要从Spring的bean当中获取相关的业务对象
-
kafka写消息的路由策略
- 如果指定分区:直接使用分区进行路由
- 指定了key,但是没有指定分区,那么会对key进行hash运算,通过运算的值得到一个分区
- 如果都没指定,那么会轮询写入一个分区
-
kafka写硬盘:
- 传统写硬盘是随机写
- kafka是顺序写硬盘,是随机写硬盘速度的6000倍
- 写数据的流程
- 首先找到leader
- 将消息写入leader的日志文件
- Followers(包含ISR中的成员,也包含不在ISR中的成员)会同步leader当中的消息,同步完以后会向leader发送一个ACK确认。
- leader在接收到isr所有成员的ACK确认后,正式提交commit保存
-
kafka的消息安全策略
- 默认是保证一定成功(同步)
- 不重复发送,不保证成功(异步)
-
kafka的备份
- 备份是由分区来创建的
- 一个分区有1个leader和0-n个follower,只要leader不宕机,所有的follower都宕机了也不影响读写。follower只负责数据备份,不负责数据读写。
-
Kafka的isr:
- 同步备份:保证isr集合当中至少存活一个,如果leader不挂,正常提供服务,如果leader挂了,重新选leader然后提供服务;每个分区都有自己的isr
- 备份的算法:
- 分区:分区编号,取余代理数量 (p_i mod b_num)
- 备份:分区编号 + 备份编号之和, 取余 代理数量(p_i+r_j) mod b_num
- 备份的算法:
- 判定存活:配置延时replica.log.max.messages,replica.log.time.max.ms来判定是否宕机
- kafka如何解决zookeeper的压力的
- Kafka有容器机制
- 每一个代理会创建一个新的容器
- 容器负责维护leader的读写,和选举
- leader是在zk上竞争创建节点来获取leader资格,如果leader宕机,选举策略是所有的follower(ISR当中保存的成员)重新竞争创建节点,获取leader资格;容器会记录新的leader,并保持
- 如果所有的ISR成员都死亡:
- 等待ISR成员任意一个苏醒,但是这个过程是不可控的
- 默认:只要有一个不是isr的成员存活,把这个作为新的leader。但是并不能保证这个成员是否数据和原本leader数据一致。
- 同步备份:保证isr集合当中至少存活一个,如果leader不挂,正常提供服务,如果leader挂了,重新选leader然后提供服务;每个分区都有自己的isr
-
kafka的数据保存:
- Kafka的日志分为两种,一种是运行日志;还有一种是用于保存消息的日志;
- 一个分区对应日志当中的一个目录
- 索引文件
- 数据文件
- 数据长度
- 数据类型
- 时间戳
- 偏移量
- Key
- Value
- 头信息
- 数据保留策略
- 时间:
- 大小:
- 注意:清理数据对kafka的读写没有任何影响
- Kafka是在硬盘磁道上进行顺序读写,所以性能和文件大小没有任何关系
-
主题的创建和删除流程:
- 创建主题,是首先获取代理的ids,然后将这些ids组成一个isr,作为一个新的容器
- 删除主题:
- 默认情况下delete.topic.enable=false;也就是被删除的节点会被移入zk的这个节点/admin/delete_topics
- 要彻底删除
- delete.topic.enable=true:一旦删除,容器会清空在/admin/delete_topics节点上的监听
- auto.create.topics.enable=false:自动创建主题,如果他为true,那么只要还有一个用户在往这个主题当中写消息,这个主题就不会真正被删除。即便是你已经删了,他依然还会创建一个出来。
- 什么是Hbase:
- 是一个非关系型数据库(稀疏矩阵)
- 关系型数据库:有固定的列,每一列的数据类型明确
- 非结构化数据,半结构化数据。
- 存储的目标数据
- 数据量大
- 结构简单
- 基于key的快速查找能力
- 可以面向列进行查询
- 为什么要有hbase,为什么不用hdfs:
- 因为hdfs适用的场景是海量的数据批读写,不支持海量数据中的个别数据修改
- 而Hbase支持在海量数据中,修改某一个数据。
- Hbase的快,是相对于hdfs来说的。
- 是一个非关系型数据库(稀疏矩阵)
- 数据仓库的特点
- 面向主题:每一种数据分析的方向都有对应的主题,主题是一个抽象的概念,主题不是固定的。
- 数据集成:任何一个主题的数据,最好是可以轻易的集成在一起。
- 非易失:用于保存历史归档数据,同时也是增量数据。
- 反应历史变化:通常不会删,会一直保存下去
- hbase的数据结构
- 逻辑结构
- 列族:多个列的组合
- 在数据底层当中,各个列族之间,数据是分开存储的。
- 列:一个列族下有若干的列
- 注意:hbase的列,没有数据类型,都是string
- 不需要在建表时声明
- 行:rowkey
- 所有的列族,所有的列,都可以引用同一个行号,但是不强制要求各个行之间对应
- 可以当做索引用
- 按字典顺序排序的
- 要在hbase当中查某一行,只能通过行号来查,因为hbase是基于列数据进行查询的。但是行号是可以过滤的,行号是可以随意设置的。可以把某个常用列的值作为key的一部分,方便过滤。
- Hbase是有分区的,同一行数据,只会出现在一个分区当中
- 一个分区中有若干的Store,一个Store中保存一个列族
- 列族:多个列的组合
- 逻辑结构
- 物理结构
- 物理存储结构,即在物理文件当中,hbase数据的存储格式。
- hbase是基于列进行查询的,任何一个字段单元格都是一个独立的数据。
- Rowkey
- 列族名
- 列名
- 时间戳
- 操作类型
- 值
- 版本号
- 在hbase当中没有真正意义上的update,所谓的修改和删除,是追加了一条数据,已最新的时间戳来显示。如果是删除数据,会将该数据的类型改为delete,删除的数据不会永久保留,如果没有正在进行的读写,那么就会启动删除。牺牲了一部分读的性能,换取写的性能。
- hbase的shell操作
- 建表:create ‘[命名空间:]表名’,’列族名1’,’列族名2’……
- 添加/修改记录:put ‘[命名空间:]表明’,’行名’,’列族名:列名’,’值’
- 获取一行记录:get ‘[命名空间:]表明’,’行名’
- 获取记录数:count ‘[命名空间:]表明’ ---- 行数!!!
- 删除记录:delete ‘[命名空间:]表明’,’行名’,’列族名:列名’
- scan命令:
- 属性
- 查询指定列
- 指定行数
- 起始行
- 结束行
- 时间戳
- 版本
- 过滤器:
- 对值过滤
- binary等值
- substring包含
- 列前缀过滤
- 列明包含过滤
- Rowkey前缀过滤
- 属性



