栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

大数据部分笔记

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

大数据部分笔记

大数据部分笔记 Flume
  1. 特点:flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(比如文本、HDFS、Hbase等)的能力

  2. Flume的可靠性:当节点出现故障时,日志能够被传送到其他节点上而不会丢失。

    1. Flume提供了三种级别的可靠性保障:
      1. end to end:收到数据agent首先将event写到磁盘上,当数据传送成功后,再删除;如果数据发送失败,可以重新发送。
      2. Store on failure:这也是scribe采用的策略,当数据接收方crash时,将数据写到本地,待恢复后,继续发送
      3. Besteffort:数据发送到接收方后,不会进行确认
  3. Flume的可恢复性:使用FileChannel,事件持久化在本地文件系统里(性能较差)

  4. Flume的一些核心概念:

    名称说明
    Agent(代理)使用JVM 运行Flume。每台机器运行一个agent,但是可以在一个agent中包含多个sources和sinks。
    Client(委托)生产数据,运行在一个独立的线程。
    Source(来源)从Client收集数据,传递给Channel。
    Sink(接收器)从Channel收集数据,运行在一个独立线程。
    Channel(通道)连接 sources 和 sinks ,类似一个队列。
    Events(事件)可以是日志记录、 avro 对象等。
  5. 部署类型:

    1. 单一流程:Flume以agent为最小的独立运行单位。一个agent就是一个JVM。单agent由Source、Sink和Channel三大组件构成。

    2. 多代理流程:可以将多个Agent顺序连接起来,将最初的数据源经过收集,存储到最终的存储系统中。这是最简单的情况,一般情况下,应该控制这种顺序连接的Agent 的数量,因为数据流经的路径变长了,如果不考虑failover的话,出现故障将影响整个Flow上的Agent收集服务。

    3. 流的合并:这种情况应用的场景比较多,比如要收集Web网站的用户行为日志, Web网站为了可用性使用的负载集群模式,每个节点都产生用户行为日志,可以为每 个节点都配置一个Agent来单独收集日志数据,然后多个Agent将数据最终汇聚到一个用来存储数据存储系统,如HDFS上。

    4. 多路复用流:Flume还支持多级流,什么多级流?来举个例子,当syslog, java, nginx、 tomcat等混合在一起的日志流开始流入一个agent后,可以agent中将混杂的日志流分开,然后给每种日志建立一个自己的传输通道。

    5. 负载平衡:将Channel暂存的Event均衡到对应的多个Sink组件上,而每个Sink组件分别连接到一个独立的Agent上 。

  6. Flume抓取日志类型

    1. Avro序列化:Avro可以发送一个给定的文件给Flume

    2. Spool:Spool监测配置的目录下新增的文件,并将文件中的数据读取出来

    3. Exec:EXEC执行一个给定的命令获得源的变化。

    4. Syslogtcp:Syslogtcp监听TCP的端口做为数据源。

    5. JSONHandler:接受json格式数据。

    6. Hadoop sink:配置Hadoop接受数据。

    7. File Roll Sink:配置本地文件接受数据。

Zookeeper
  1. 分布式应用的优点:

    1. 可靠性- 单个或几个系统的故障不会使整个系统出现故障。
    2. 可扩展性- 可以在需要时增加性能,通过添加更多机器,在应用程序配置中进行微小的更改,而不会有停机时间。
    3. 透明性- 隐藏系统的复杂性,并将其显示为单个实体/应用程序。
  2. 分布式应用的挑战:

    1. 竞争条件- 两个或多个机器尝试执行特定任务,实际上只需在任意给定时间由单个机器完成。例如,共享资源只能在任意给定时间由单个机器修改。
    2. 死锁- 两个或多个操作等待彼此无限期完成。
    3. 服务发现 -client如何发现server,检测server存活性。
    4. 不一致- 数据的部分失败。
  3. 概念:

    1. 观察者模式:zk的核心功能,监听数据的变化
    2. 服务管理框架:zk的重要性就体现在对绝大部分分布式架构的服务治理
  4. 提供的常见服务:

    1. 命名服务- 按名称标识集群中的节点。它类似于DNS,但仅对于节点。
    2. 配置管理- 加入节点的最近的和最新的系统配置信息。
    3. 集群管理- 实时地在集群和节点状态中加入/离开节点。
    4. 选举算法- 选举一个节点作为协调目的的leader。
    5. 锁定和同步服务- 在修改数据的同时锁定数据。此机制可帮助你在连接其他分布式应用程序(如Apache Hbase)时进行自动故障恢复。
    6. 高度可靠的数据注册表- 即使在一个或几个节点关闭时也可以获得数据。
  5. 架构:

    组件描述
    Client(客户端)客户端,我们的分布式应用集群中的一个节点,从服务器访问信息。对于特定的时间间隔,每个客户端向服务器发送消息以使服务器知道客户端是活跃的。 类似地,当客户端连接时,服务器发送确认码。如果连接的服务器没有响应,客户端会自动将消息重定向到另一个服务器。
    Server(服务器)服务器,我们的ZooKeeper总体中的一个节点,为客户端提供所有的服务。向客户端发送确认码以告知服务器是活跃的。
    EnsembleZooKeeper服务器组。形成ensemble所需的最小节点数为3。
    Leader服务器节点,如果任何连接的节点失败,则执行自动恢复。Leader在服务启动时被选举。
    Follower跟随leader指令的服务器节点。
  6. ZooKeeper的层次命名空间:

    1. ZooKeeper节点称为 znode :每个znode都维护着一个stat结构。一个stat仅提供一个znode的元数据。它由版本号,操作控制列表(ACL),时间戳和数据长度组成。
    2. Znode的类型:
      1. 持久节点:即使在创建该特定znode的客户端断开连接后,持久节点仍然存在。默认情况下,除非另有说明,否则所有znode都是持久的。
      2. 临时节点- 客户端活跃时,临时节点就是有效的。当客户端与ZooKeeper集合断开连接时,临时节点会自动删除。因此,只有临时节点不允许有子节点。如果临时节点被删除,则下一个合适的节点将填充其位置。临时节点在leader选举中起着重要作用。
      3. 顺序节点- 顺序节点可以是持久的或临时的。当一个新的znode被创建为一个顺序节点时,ZooKeeper通过将10位的序列号附加到原始名称来设置znode的路径。例如,如果将具有路径/myapp的znode创建为顺序节点,则ZooKeeper会将路径更改为/myapp0000000001,并将下一个序列号设置为0000000002。如果两个顺序节点是同时创建的,那么ZooKeeper不会对每个znode使用相同的数字。顺序节点在锁定和同步中起重要作用。
  7. Watches(监视): 监视是一种简单的机制,使客户端收到关于ZooKeeper集合中的更改的通知。客户端可以在读取特定znode时设置Watches。Watches会向注册的客户端发送任何znode(客户端注册表)更改的通知。Znode更改是与znode相关的数据的修改或znode的子项中的更改。只触发一次watches。如果客户端想要再次通知,则必须通过另一个读取操作来完成。当连接会话过期时,客户端将与服务器断开连接,相关的watches也将被删除。

    1. keeperState:反应当前的节点状态,节点发生了什么样的变化
    2. eventType:反应当前的事件状态,对节点做了什么操作
    3. 可以监听的范围:
      1. 创建连接的时候
      2. 子节点操作
      3. 当前节点的数据操作
      4. 监听指定节点的存在情况
    4. 监听器默认情况下,只能监听到一次;如果需要让他一直生效,需要循环监听
    5. 由于监听者是由一个守护线程来维持的,所以当用户线程结束后,守护线程自动结束;由代理来调用该process方法
  8. 数据发布与订阅:发布与订阅即所谓的配置管理,顾名思义就是将数据发布到zk节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,地址列表等就非常适合使用。

    1. 索引信息和集群中机器节点状态存放在zk的一些指定节点,供各个客户端订阅使用。
    2. 系统日志(经过处理后的)存储,这些日志通常2-3天后被清除。
    3. 应用中用到的一些配置信息集中管理,在应用启动的时候主动来获取一次,并且在节点上注册一个Watcher,以后每次配置有更新,实时通知到应用,获取最新配置信息。
    4. 业务逻辑中需要用到的一些全局变量,比如一些消息中间件的消息队列通常有个offset,这个offset存放在zk上,这样集群中每个发送者都能知道当前的发送进度。
    5. 系统中有些信息需要动态获取,并且还会存在人工手动去修改这个信息。以前通常是暴露出接口,例如JMX接口,有了zk后,只要将这些信息存放到zk节点上即可。
  9. 分布通知/协调:ZooKeeper 中特有watcher注册与异步通知机制,能够很好的实现分布式环境下不同系统之间的通知与协调,实现对数据变更的实时处理。使用方法通常是不同系统都对 ZK上同一个znode进行注册,监听znode的变化(包括znode本身内容及子节点的),其中一个系统update了znode,那么另一个系统能 够收到通知,并作出相应处理。

    1. 另一种心跳检测机制:检测系统和被检测系统之间并不直接关联起来,而是通过zk上某个节点关联,大大减少系统耦合。
    2. 另一种系统调度模式:某系统有控制台和推送系统两部分组成,控制台的职责是控制推送系统进行相应的推送工作。管理人员在控制台作的一些操作,实际上是修改 了ZK上某些节点的状态,而zk就把这些变化通知给他们注册Watcher的客户端,即推送系统,于是,作出相应的推送任务。
    3. 另一种工作汇报模式:一些类似于任务分发系统,子任务启动后,到zk来注册一个临时节点,并且定时将自己的进度进行汇报(将进度写回这个临时节点),这样任务管理者就能够实时知道任务进度。 总之,使用zookeeper来进行分布式通知和协调能够大大降低系统之间的耦合。
  10. 分布式锁:分布式锁,这个主要得益于ZooKeeper为我们保证了数据的强一致性,即用户只要完全相信每时每刻,zk集群中任意节点(一个zk server)上的相同znode的数据是一定是相同的。锁服务可以分为两类,一个是保持独占,另一个是控制时序。

    1. 保持独占,就是所有试图来获取这个锁的客户端,最终只有一个可以成功获得这把锁。通常的做法是把zk上的一个znode看作是一把锁,通过create znode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。
    2. 控制时序,就是所有视图来获取这个锁的客户端,最终都是会被安排执行,只是有个全局时序了。做法和上面基本类似,只是这里 /distribute_lock 已经预先存在,客户端在它下面创建临时有序节点(这个可以通过节点的属性控制:CreateMode.EPHEMERAL_SEQUENTIAL来指定)。Zk的父节点(/distribute_lock)维持一份sequence,保证子节点创建的时序性,从而也形成了每个客户端的全局时序。
  11. 集群管理:

    1. 集群机器监控:这通常用于那种对集群中机器状态,机器在线率有较高要求的场景,能够快速对集群中机器变化作出响应。这样的场景中,往往有一个监控系统,实时检测集群机器是否存活。过去的做法通常是:监控系统通过某种手段(比如ping)定时检测每个机器,或者每个机器自己定时向监控系统汇报“我还活着”。 这种做法可行,但是存在两个比较明显的问题:1. 集群中机器有变动的时候,牵连修改的东西比较多。2. 有一定的延时。 利用ZooKeeper有两个特性,就可以实时另一种集群机器存活性监控系统:a. 客户端在节点 x 上注册一个Watcher,那么如果 x 的子节点变化了,会通知该客户端。b. 创建EPHEMERAL类型的节点,一旦客户端和服务器的会话结束或过期,那么该节点就会消失。
    2. Master选举则是zookeeper中最为经典的使用场景了。 在分布式环境中,相同的业务应用分布在不同的机器上,有些业务逻辑(例如一些耗时的计算,网络I/O处理),往往只需要让整个集群中的某一台机器进行执行, 其余机器可以共享这个结果,这样可以大大减少重复劳动,提高性能,于是这个master选举便是这种场景下的碰到的主要问题。 利用ZooKeeper的强一致性,能够保证在分布式高并发情况下节点创建的全局唯一性,即:同时有多个客户端请求创建 /currentMaster 节点,最终一定只有一个客户端请求能够创建成功。
  12. 节点状态

    1. czxid 创建该节点的事务ID
    2. ctime 创建该节点的时间
    3. mZxid 更新该节点的事务ID
    4. mtime 更新该节点的时间
    5. pZxid 操作当前节点的子节点列表的事物ID(包含增加子节点,删除子节点)
    6. cversion 当前节点的子节点版本号
    7. dataVersion 当前节点的数据版本号 aclVersion 当前节点的acl权限版本号
    8. ephemeralowner 当前节点的如果是临时节点,该属性是临时节点的事物ID
    9. dataLength 当前节点的数据长度
    10. numchildren 当前节点的子节点个数
  13. 基本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();
    }
    
  14. 监听服务器的变化:

    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;
        }
    }
    
  15. watcher注册api:

    API说明
    getChildrenNodeChildrenChanged新建子节点【激活】
    删除子节点【激活】
    修改子节点【不激活】
    getDataNodeDataChanged修改该节点
    NodeDeleted删除该节点
    existsNodeCreated新建该节点
    NodeDataChanged修改该节点
    NodeDeleted删除该节点
  16. 验证模式(scheme):

    权限说明
    digestClient端由用户名和密码验证,譬如user:password,digest的密码生成方式是Sha1摘要的base64形式
    auth不使用任何id,代表任何已确认用户。
    ipClient端由IP地址验证,譬如172.2.0.0/24
    world固定用户为anyone,为所有Client端开放权限
    super在这种scheme情况下,对应的id拥有超级权限,可以做任何事情(cdrwa)

    注意: exists操作和getAcl操作并不受ACL许可控制,因此任何客户端可以查询节点的状态和节点的ACL。

  17. 节点的权限(perms)

    权限说明
    Create允许对子节点Create操作
    Read允许对本节点GetChildren和GetData操作
    Write允许对本节点SetData操作
    Delete允许对子节点Delete操作
    Admin允许对本节点setAcl操作
  18. Paxos算法的目的:为了解决分布式环境下一致性的问题。多个节点并发操纵数据,如何保证在读写过程中数据的一致性,并且解决方案要能适应分布式环境下的不可靠性(系统如何就一个值达到统一)

  19. Paxos有两个原则:

    1. 安全原则—保证不能做错的事:针对某个实例的表决只能有一个值被批准,不能出现一个被批准的值被另一个值覆盖的情况;(假设有一个值被多数Acceptor批准了,那么这个值就只能被学习)。每个节点只能学习到已经被批准的值,不能学习没有被批准的值。
    2. 存活原则—只要有多数服务器存活并且彼此间可以通信,最终都要做到的下列事情:
      最终会批准某个被提议的值;一个值被批准了,其他服务器最终会学习到这个值。
  20. 三军问题场景:

    1. 先后提议的场景

    2. 交叉场景

  21. CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。这三个要素最多只能同时实现两点,不可能三者兼顾。

  22. zookeeper中节点分四种状态:

    1. looking:选举Leader的状态(集群刚启动时或崩溃恢复状态下,也就是需要选举的时候)
    2. following:跟随者(follower)的状态,服从Leader命令
    3. leading:当前节点是Leader,负责协调工作。
    4. observing:observer(观察者),不参与选举,只读节点。
  23. zookeeper选举过程:leader挂了,需要选举新的leader

    1. 阶段一:崩溃恢复
    2. 阶段二:消息广播
    3. 阶段三:数据同步
  24. 选举过程:

    1. 找到新的leader(myid:zxid)
    2. 新的leader广播信息,告诉所有的follower我要进行数据同步
    3. follower接受到信息准备好之后会告诉leader我准备好了
    4. leader判断是否有半数以上follower准备好了
    5. 如果超过半数则再次广播同意写入,follower接受到同意的信息后,完成写入工作
    6. 如果有新节点加入或者有数据要写入,过程参照上面数据同步的流程(2-5)
Kafka
  1. 定义:大吞吐量,内置分区,可以进行数据备份,同时具备数据容错性的消息系统。

    1. Kafka可以完成在线或者离线数据消费,所谓离线数据消费实际上就是kafka将消息数据保留在磁盘上。
    2. kafka会做数据备份,防止节点宕机从而导致数据丢失。
    3. 和spark产品的整合性非常好,可以完成实时的大数据分析
    4. kafka的节点可以无限扩容
  2. 消息系统:将数据从一个应用程序传递到另一个应用程序,分布式系统利用消息系统,在多应用之间进行高效、稳定、安全的数据传递。

  3. 两种消息模式:

    1. 点对点:若干个生产和消费者,处理队列当中的数据,一旦该数据被消费,则从队列当中被移除。(多线程:生产消费者模型)
    2. 发布-订阅:消息是被保留在主题当中,消费者一个消费一个或者若干个主题当中的消息
  4. 术语:

    术语****1术语****2
    Topics(主题)Kafka Cluster(Kafka集群)
    Partition(分区)Producers(生产者)
    Partition offset(分区偏移)Consumers(消费者)
    Replicas of partition(分区备份)Leader(领导者)
    Brokers(经纪人)Follower(追随者)
  5. 发布和订阅的流程

    1. 生产者向主题当中提交消息,代理将主题当中的数据在主题的分区当中依次保存;
    2. 消费者向代理请求获取消息,代理向消费者提供偏移量,消费者根据偏移量要求获取消息。
    3. 消费者排队的前提,消费者数量大于分区数量
  6. 生产者需要指定生产的主题

  7. 消费者:

  8. 要指定消费者的分组:默认情况下,分组是test

  9. 消费者可以同时消费若干个主题:

  10. 消息是已key-value格式进行发送

  11. 每个key如果重复发送,其偏移量会递增

  12. 新的key的偏移量从0开始

  13. 消费者要放在一个独立的线程当中,才能始终处于消费状态

  14. Spring是没有办法直接给线程当中进行依赖注入的

  15. 消费者的线程如果要通知其他的任务执行,需要从Spring的bean当中获取相关的业务对象

  16. kafka写消息的路由策略

    1. 如果指定分区:直接使用分区进行路由
    2. 指定了key,但是没有指定分区,那么会对key进行hash运算,通过运算的值得到一个分区
    3. 如果都没指定,那么会轮询写入一个分区
  17. kafka写硬盘:

    1. 传统写硬盘是随机写
    2. kafka是顺序写硬盘,是随机写硬盘速度的6000倍
    3. 写数据的流程
      1. 首先找到leader
      2. 将消息写入leader的日志文件
      3. Followers(包含ISR中的成员,也包含不在ISR中的成员)会同步leader当中的消息,同步完以后会向leader发送一个ACK确认。
      4. leader在接收到isr所有成员的ACK确认后,正式提交commit保存
  18. kafka的消息安全策略

    1. 默认是保证一定成功(同步)
    2. 不重复发送,不保证成功(异步)
  19. kafka的备份

    1. 备份是由分区来创建的
    2. 一个分区有1个leader和0-n个follower,只要leader不宕机,所有的follower都宕机了也不影响读写。follower只负责数据备份,不负责数据读写。
  20. Kafka的isr:

    1. 同步备份:保证isr集合当中至少存活一个,如果leader不挂,正常提供服务,如果leader挂了,重新选leader然后提供服务;每个分区都有自己的isr
      1. 备份的算法:
        1. 分区:分区编号,取余代理数量 (p_i mod b_num)
        2. 备份:分区编号 + 备份编号之和, 取余 代理数量(p_i+r_j) mod b_num
    2. 判定存活:配置延时replica.log.max.messages,replica.log.time.max.ms来判定是否宕机
    3. kafka如何解决zookeeper的压力的
      1. Kafka有容器机制
      2. 每一个代理会创建一个新的容器
      3. 容器负责维护leader的读写,和选举
    4. leader是在zk上竞争创建节点来获取leader资格,如果leader宕机,选举策略是所有的follower(ISR当中保存的成员)重新竞争创建节点,获取leader资格;容器会记录新的leader,并保持
    5. 如果所有的ISR成员都死亡:
      1. 等待ISR成员任意一个苏醒,但是这个过程是不可控的
      2. 默认:只要有一个不是isr的成员存活,把这个作为新的leader。但是并不能保证这个成员是否数据和原本leader数据一致。
  21. kafka的数据保存:

    1. Kafka的日志分为两种,一种是运行日志;还有一种是用于保存消息的日志;
    2. 一个分区对应日志当中的一个目录
      1. 索引文件
      2. 数据文件
        1. 数据长度
        2. 数据类型
        3. 时间戳
        4. 偏移量
        5. Key
        6. Value
        7. 头信息
      3. 数据保留策略
        1. 时间:
        2. 大小:
        3. 注意:清理数据对kafka的读写没有任何影响
        4. Kafka是在硬盘磁道上进行顺序读写,所以性能和文件大小没有任何关系
  22. 主题的创建和删除流程:

    1. 创建主题,是首先获取代理的ids,然后将这些ids组成一个isr,作为一个新的容器
    2. 删除主题:
      1. 默认情况下delete.topic.enable=false;也就是被删除的节点会被移入zk的这个节点/admin/delete_topics
      2. 要彻底删除
        1. delete.topic.enable=true:一旦删除,容器会清空在/admin/delete_topics节点上的监听
        2. auto.create.topics.enable=false:自动创建主题,如果他为true,那么只要还有一个用户在往这个主题当中写消息,这个主题就不会真正被删除。即便是你已经删了,他依然还会创建一个出来。
Hbase
  1. 什么是Hbase:
    1. 是一个非关系型数据库(稀疏矩阵)
      1. 关系型数据库:有固定的列,每一列的数据类型明确
      2. 非结构化数据,半结构化数据。
    2. 存储的目标数据
      1. 数据量大
      2. 结构简单
      3. 基于key的快速查找能力
      4. 可以面向列进行查询
    3. 为什么要有hbase,为什么不用hdfs:
      1. 因为hdfs适用的场景是海量的数据批读写,不支持海量数据中的个别数据修改
      2. 而Hbase支持在海量数据中,修改某一个数据。
      3. Hbase的快,是相对于hdfs来说的。
  2. 数据仓库的特点
    1. 面向主题:每一种数据分析的方向都有对应的主题,主题是一个抽象的概念,主题不是固定的。
    2. 数据集成:任何一个主题的数据,最好是可以轻易的集成在一起。
    3. 非易失:用于保存历史归档数据,同时也是增量数据。
    4. 反应历史变化:通常不会删,会一直保存下去
  3. hbase的数据结构
    1. 逻辑结构
      1. 列族:多个列的组合
        1. 在数据底层当中,各个列族之间,数据是分开存储的。
      2. 列:一个列族下有若干的列
        1. 注意:hbase的列,没有数据类型,都是string
        2. 不需要在建表时声明
      3. 行:rowkey
        1. 所有的列族,所有的列,都可以引用同一个行号,但是不强制要求各个行之间对应
        2. 可以当做索引用
        3. 按字典顺序排序的
        4. 要在hbase当中查某一行,只能通过行号来查,因为hbase是基于列数据进行查询的。但是行号是可以过滤的,行号是可以随意设置的。可以把某个常用列的值作为key的一部分,方便过滤。
        5. Hbase是有分区的,同一行数据,只会出现在一个分区当中
        6. 一个分区中有若干的Store,一个Store中保存一个列族
  4. 物理结构
    1. 物理存储结构,即在物理文件当中,hbase数据的存储格式。
    2. hbase是基于列进行查询的,任何一个字段单元格都是一个独立的数据。
      1. Rowkey
      2. 列族名
      3. 列名
      4. 时间戳
      5. 操作类型
      6. 版本号
    3. 在hbase当中没有真正意义上的update,所谓的修改和删除,是追加了一条数据,已最新的时间戳来显示。如果是删除数据,会将该数据的类型改为delete,删除的数据不会永久保留,如果没有正在进行的读写,那么就会启动删除。牺牲了一部分读的性能,换取写的性能。
  5. hbase的shell操作
    1. 建表:create ‘[命名空间:]表名’,’列族名1’,’列族名2’……
    2. 添加/修改记录:put ‘[命名空间:]表明’,’行名’,’列族名:列名’,’值’
    3. 获取一行记录:get ‘[命名空间:]表明’,’行名’
    4. 获取记录数:count ‘[命名空间:]表明’ ---- 行数!!!
    5. 删除记录:delete ‘[命名空间:]表明’,’行名’,’列族名:列名’
    6. scan命令:
      1. 属性
        1. 查询指定列
        2. 指定行数
        3. 起始行
        4. 结束行
        5. 时间戳
        6. 版本
      2. 过滤器:
        1. 对值过滤
        2. binary等值
        3. substring包含
        4. 列前缀过滤
        5. 列明包含过滤
        6. Rowkey前缀过滤
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/295463.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号