一、kafka文件存储机制 

 1.topic存储

   在Kafka文件存储中,同一个topic下有多个不同partition,每个partition为一个目录,partiton命名规则为topic名称+有序序号,第一个partiton序号从0开始,序号最大值为partitions数量减1。

  以上面创建的topic_1为例,在mini1这台机器上的目录如下:

  

  综合查看3台机器的分布,如下所示:

  1. mini1:
  2. 1 2 3
  3. mini2:
  4. 0 2 3
  5. mini3:
  6. 0 1

// 这里是设置了副本数量,如果为了看清楚分配情况,可以设置一个副本来进行查看,其中,分区的分配是通过以下一个简单的小算法进行确认的:

  1. list(mini1,mini2,mini3)
  2. for(int i = 0; i < partitionNum; i++) {
  3. broIdx = i%broker;
  4. hostname = list.get(broIdx);//borIdx+1?
  5. }

// 最好的方式是试验验证!

  2.segment

  每一个partition目录下的文件被平均切割成大小相等(有一个默认的滚动的大小,可以手动去设置)的数据文件,
  每一个数据文件都被称为一个段(segment file),但每个段消息数量不一定相等,这种特性能够使得老的segment可以被快速清除。
  默认保留7天的数据。

  

  滚动的示意如下:

  

二、其他问题

  主要是第一篇kafka入门中提出的几个问题

  1. 1kafka是什么
  2. JMS消息队列,结合JMS中的两种模式,可以有多个消费者主动拉取数据,在JMS中只有点对点模式才有消费者主动拉取数据。
  3. kafka是一个生产-消费模型。
  4. Producer:生产者,只负责数据生产,生产者的代码可以集成到任务系统中。
  5. 数据的分发策略由producer决定,默认是defaultPartition Utils.abs(key.hashCode) % numPartitions
  6. Broker:当前服务器上的Kafka进程,俗称拉皮条。只管数据存储,不管是谁生产,不管是谁消费。
  7. 在集群中每个broker都有一个唯一brokerid,不得重复。
  8. Topic:目标发送的目的地,这是一个逻辑上的概念,落到磁盘上是一个partition的目录。
            partition的目录中有多个segment组合(index,log)
  9. 一个Topic对应多个partition[0,1,2,3],一个partition对应多个segment组合。一个segment有默认的大小是1G
  10. 每个partition可以设置多个副本(replication-factor 1),会从所有的副本中选取一个leader出来。
            所有读写操作都是通过leader来进行的。
  11. 特别强调,和mysql中主从有区别,mysql做主从是为了读写分离,在kafka中读写操作都是leader
  12. ConsumerGroup:数据消费者组,ConsumerGroup可以有多个,每个ConsumerGroup消费的数据都是一样的。
  13. 可以把多个consumer线程划分为一个组,组里面所有成员共同消费一个topic的数据,组员之间不能重复消费。
  14.  
  15. 2kafka生产数据时的分组策略
  16. 默认是defaultPartition(在kafkaproductor.properties中有相关配置) Utils.abs(key.hashCode) % numPartitions
  17. 上文中的keyproducer在发送数据时传入的,produer.send(KeyedMessage(topic,myPartitionKey,messageContent))
  18.  
  19. 3kafka如何保证数据的完全生产
  20. ack机制:broker表示发来的数据已确认接收无误,表示数据已经保存到磁盘。
  21. 0:不等待broker返回确认消息
  22. 1:等待topic中某个partition leader保存成功的状态反馈
  23. -1:等待topic中某个partition 所有副本都保存成功的状态反馈
  24.  
  25. 4broker如何保存数据
  26. 在理论环境下,broker按照顺序读写的机制,可以每秒保存600M的数据。主要通过pagecache机制,
      尽可能的利用当前物理机器上的空闲内存来做缓存。
  27. 当前topic所属的broker,必定有一个该topicpartitionpartition是一个磁盘目录。
      partition的目录中有多个segment组合(index,log)
  28.  
  29. 5partition如何分布在不同的broker
  30. int i = 0
  31. list{kafka01,kafka02,kafka03}
  32.  
  33. for(int i=0;i<5;i++){
  34. brIndex = i%broker;
  35. hostName = list.get(brIndex) // brIndex+1?
  36. }
  37.  
  38. 6consumerGroup的组员和partition之间如何做负载均衡
  39. 最好是一一对应,一个partition对应一个consumer
  40. 如果consumer的数量过多,必然有空闲的consumer
  41.  
  42. 算法:
  43. 假如topic1,具有如下partitions: P0,P1,P2,P3
  44. 加入group中,有如下consumer: C1,C2
  45. 首先根据partition索引号对partitions排序: P0,P1,P2,P3
  46. 根据consumer.id排序: C0,C1
  47. 计算倍数: M = [P0,P1,P2,P3].size / [C0,C1].size,本例值M=2(向上取整)
  48. 然后依次分配partitions: C0 = [P0,P1],C1=[P2,P3],即Ci = [P(i * M),P((i + 1) * M -1)]
  49.  
  50. 7、如何保证kafka消费者消费数据是全局有序的
  51. 伪命题
  52. 如果要全局有序的,必须保证生产有序,存储有序,消费有序。
  53. 由于生产可以做集群,存储可以分片,消费可以设置为一个consumerGroup,要保证全局有序,就需要保证每个环节都有序。
  54. 只有一个可能,就是一个生产者,一个partition,一个消费者。这种场景和大数据应用场景相悖。

三、更多参考

  参考博文:https://blog.csdn.net/lingbo229/article/details/80761778

      https://www.jianshu.com/p/d3e963ff8b70

大数据入门第十七天——storm上游数据源 之kafka详解(三)其他问题的更多相关文章

  1. 大数据入门第十七天——storm上游数据源 之kafka详解(一)入门与集群安装

    一.概述 1.kafka是什么 根据标题可以有个概念:kafka是storm的上游数据源之一,也是一对经典的组合,就像郭德纲和于谦 根据官网:http://kafka.apache.org/intro ...

  2. 大数据入门第十七天——storm上游数据源 之kafka详解(二)常用命令

    一.kafka常用命令 1.创建topic bin/kafka-topics. --replication-factor --zookeeper mini1: // 如果配置了PATH可以省略相关命令 ...

  3. 大数据入门第十六天——流式计算之storm详解(一)入门与集群安装

    一.概述 今天起就正式进入了流式计算.这里先解释一下流式计算的概念 离线计算 离线计算:批量获取数据.批量传输数据.周期性批量计算数据.数据展示 代表技术:Sqoop批量导入数据.HDFS批量存储数据 ...

  4. 大数据入门第十八天——kafka整合flume、storm

    一.实时业务指标分析 1.业务 业务: 订单系统---->MQ---->Kakfa--->Storm 数据:订单编号.订单时间.支付编号.支付时间.商品编号.商家名称.商品价格.优惠 ...

  5. 大数据入门第十六天——流式计算之storm详解(二)常用命令与wc实例

    一.常用命令 1.提交命令 提交任务命令格式:storm jar [jar路径] [拓扑包名.拓扑类名] [拓扑名称] torm jar examples/storm-starter/storm-st ...

  6. 大数据入门第八天——MapReduce详解(三)MR的shuffer、combiner与Yarn集群分析

    /mr的combiner /mr的排序 /mr的shuffle /mr与yarn /mr运行模式 /mr实现join /mr全局图 /mr的压缩 今日提纲 一.流量汇总排序的实现 1.需求 对日志数据 ...

  7. 大数据入门第二十天——scala入门(一)入门与配置

    一.概述 1.什么是scala  Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性.Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序. ...

  8. 大数据入门第十九天——推荐系统与mahout(一)入门与概述

    一.推荐系统概述 为了解决信息过载和用户无明确需求的问题,找到用户感兴趣的物品,才有了个性化推荐系统.其实,解决信息过载的问题,代表性的解决方案是分类目录和搜索引擎,如hao123,电商首页的分类目录 ...

  9. 大数据入门第七天——MapReduce详解(一)入门与简单示例

    一.概述 1.map-reduce是什么 Hadoop MapReduce is a software framework for easily writing applications which ...

随机推荐

  1. 【java】一些零碎的知识点

    java注释文档 一些常用的javadoc标签 常用javadoc标签 @see: other-class 引用other-class 生成的html文档会有一个See Alse 作为超链接的只是条目 ...

  2. IIS 下调用证书出现异常解决方案 (C#)

    程序发布前,跑在vs上是没问题的,当发布后,程序就报错了.通过系统日志找到了错误所在:证书调用时出现了异常.原因是:在IIS上调用证书是需要配置的,具体配置如下: 一. 确保证书已安装 1. 点击 [ ...

  3. 排错-tcpreplay回放错误:send() [218] Message too long (errno = 90)

    排错-tcpreplay回放错误:send() [218] Message too long (errno = 90) by:授客 QQ:1033553122 问题描述: tcpreplay回放.pc ...

  4. Android工程中javax annotation Nullable找不到的替代方案

    我们在某些Android开源库中会遇到下面的引用找不到的问题:import javax.annotation.Nonnull;import javax.annotation.Nullable; 其实A ...

  5. onlyoffice新版5.1.2版解决中文汉字输入重复等问题

    一个星期前新版更新,从5.07到了5.1.2.9.所以我的网盘中的镜像也做了相应的更新. 原来说的几个缺点,已经修改了几个,比如chrome浏览器和opera浏览器中,输入汉字,然后输入符号的时候,会 ...

  6. CentOS7安装mysql后无法启动服务,提示Unit not found

    首发日期: 2018-01-30 现象: 在centOS7中启动MySQL数据库提示: Failed to start mysqld.service: Unit not found [明明已经安装了, ...

  7. json_encode无返回结果

    今天写php curl模拟客户端访问测试一个抽奖post数据,拿回来的数据是json,使用json_decode函数就是没结果,百度谷歌好久.终于发现是BOM的文件头造成的, 微软为utf-8文件添加 ...

  8. 使用IDEA创建Java Web项目并部署

    前面给大家介绍了IDEA的安装和基本配置,睡觉前Alan再给大家分享一下使用IDEA创建Java Web并部署访问. 打开IDEA,File>New>Project,进入Java Ente ...

  9. SQL Server中数据库文件的存放方式,文件和文件组 (转载)

    简介 在SQL SERVER中,数据库在硬盘上的存储方式和普通文件在Windows中的存储方式没有什么不同,仅仅是几个文件而已.SQL SERVER通过管理逻辑上的文件组的方式来管理文件.理解文件和文 ...

  10. leveldb源码阅读

    http://blog.csdn.net/sparkliang/article/details/8567602 http://brg-liuwei.github.io/tech/2014/10/15/ ...