kafka

kafka术语

|
|-1.Broker:消息中间件处理结点,一个Kafka节点就是一个broker,多个broker能够组成一个Kafka集群。
|
|-2.Topic:一类消息,比如page view日志、click日志等都能够以topic的形式存在。Kafka集群能够同一时候负责多个topic的分发。
|
|-3.Partition:topic物理上的分组。一个topic能够分为多个partition,每一个partition是一个有序的队列。
|
|-4.Segment:partition物理上由多个segment组成。
|
|-5.offset:每一个partition都由一系列有序的、不可变的消息组成,这些消息被连续的追加到partition中。
|           partition中的每一个消息都有一个连续的序列号叫做offset,用于partition中唯一标识的这条消息。

Kafka文件存储基本结构

|
|-文件名:partiton命名规则为topic名称+有序序号,第一个partiton序号从0开始,序号最大值为partitions数量减1
|
|-每个partion(分区)相当于一个巨型文件被平均分配到多个大小相等segment()数据文件中
| 但每个段segment file消息数量不一定相等,这种特性方便old segment file快速被删除。默认保留7天的数据
|
|-每个partiton只需要支持顺序读写就行了,segment文件生命周期由服务端配置参数决定(什么时候创建,什么时候删除)
 _____________________________________________________________________________________
|               ________________________________________________                      |
| Partition 0  |_0_|_1_|_2_|_3_|_4_|_5_|_6_|_7_|_8_|_9_|_10_|_11_| 12                 |
|                                                                   \                 |
|               ___________________________________                  \                |
| Partition 1  |_0_|_1_|_2_|_3_|_4_|_5_|_6_|_7_|_8_| 9 <-------------- Writes(顺序写) |
|                                                                    /                |
|               ____________________________________________        /                 |
| Partition 2  |_0_|_1_|_2_|_3_|_4_|_5_|_6_|_7_|_8_|_9_|_10_| 11   /                  |
|                                                                                     |
|              Old------------------------------------------------->New               |
|_____________________________________________________________________________________| 

topic中partition存储分布

| 
|-如果实验环境中Kafka集群仅仅有一个broker。
|
|-xxx/message-folder为数据文件存储根文件夹。
|
|-在Kafka broker中server.properties文件配置(參数log.dirs=xxx/message-folder)|
|-比如创建2个topic名称分别为report_push、launch_info|--存储路径和文件夹规则为:
| partitions数量都为partitions=4                    |  xxx/message-folder/
|                                                   |                    |–report_push-0
|                                                   |                    |–report_push-1
|                                                   |                    |–report_push-2
|                                                   |                    |–report_push-3
|                                                   |                    |–launch_info-0
|                                                   |                    |–launch_info-1
|                                                   |                    |–launch_info-2
|                                                   |                    |–launch_info-3

partiton中文件存储方式

| 
|-每一个partion(文件夹)相当于一个巨型文件被平均分配到多个大小相等segment()数据文件里。
| 
|-但每一个段segment file消息数量不一定相等,这样的特性方便old segment file高速被删除。(默认情况下每一个文件大小为1G)
| 
|-每一个partiton仅仅须要支持顺序读写即可了。segment文件生命周期由服务端配置參数决定。
| 
|-这样做的优点就是能高速删除无用文件。有效提高磁盘利用率。
 ________________________________________
|                                        |
|  partition 0   100GB+                  |
|  ______________        ______________  |
| |              |      |              | |
| |500MB         |      |500MB         | |
| |segment file 1|      |segment file 2| |
| |______________|      |______________| |
|                                        |
|  ______________                        |
| |              |                       |
| |500MB         |        ...            |
| |segment file 3|                       |
| |______________|                       |
|________________________________________|

partiton中segment文件存储结构

| 
|-segment file组成|--index file:后缀”.index”,表示为segment索引文件
|                 |--data  file:后缀“.log”  ,表示为segment数据文件
| 				|--2个文件一一相应,成对出现
| 
|-segment文件命名规则|--partion全局的第一个segment从0開始,
|                    |--兴许每一个segment文件名称为上一个segment文件最后一条消息的offset值。
|                    |--数值最大为64long大小。19位数字字符长度,没有数字用0填充。				
| 				
|-以下文件列表是在Kafka broker上做的一个实验,创建一个topicXXX包括1 partition,
| 设置每一个segment大小为500MB,并启动producer向Kafka broker写入大量数据,
| segment文件列表|--00000000000000000000.index
|                |--00000000000000000000.log
|                |--00000000000000368769.index
|                |--00000000000000368769.log
|                |--00000000000000737337.index
|                |--00000000000000737337.log
|                |--00000000000001105814.index
|                |--00000000000001105814.log
|                |  ...
|               
|-索引文件存储大量元数据,数据文件存储大量消息,索引文件里元数据指向相应数据文件里message的物理偏移地址
| 当中以索引文件里元数据3,497为例,依次在数据文件里表示第3个message、以及该消息的物理偏移地址为497
|                |________________________________________________________________
|                |                                                                |
|                | 00000000000000368769.index          00000000000000368769.log   |
|                | 1 , 0                               Message368770     0        |
|                | 3 , 497                             Message368771     139      |
|                | 6 , 1407                            Message368772     497      |
|                | 8 , 1686                            Message368773     830      |
|                | ...                                 Message368774     1262     |
|                | N , position                        Message368775     1407     |
|                | 									   Message368776     1508     |
|                | 									   Message368777     1686     |
|                | 									   ...               ...      |
|                | 									   Message36877+N    position |
|                |________________________________________________________________|                  
| 
|-数据文件(.log文件),message物理结构\ _________________________
|                |                     | 8 byte offset           |
|                |                     | 4 byte message size     |
|                |                     | 4 byte CRC32            |
|                |                     | 1 byte "magic"          |
|                |                     | 1 byte "attributes"     |
|                |                     | 4 byte key length       |
|                |                     | K byte key              |
|                |                     | 4 byte payload length   |
|                |                     |  _____________________  |
|                |                     | |                     | |
|                |                     | | value bytes payload | |
|                |                     | |_____________________| |
|                |                     |_________________________| 
| 				 |--8 byte offset  在parition(分区)内的每条消息都有一个有序的id号,这个id号被称为偏移(offset),它能够唯一确定每条消息在parition(分区)内的位置
|				 |--4 byte message size message大小
|				 |--4 byte CRC32   用crc32校验message
|				 |--1 byte "magic" 表示本次公布Kafka服务程序协议版本号
|				 |--1 byte "attributes" 表示为独立版本号、或标识压缩类型、或编码类型
|				 |--4 byte key length 表示key的长度,当key为-1,K byte key字段不填(K byte key 可选)
|                |--value bytes payload 表示实际消息数据

Kafka特性

| 
|-Kafka执行时间非常少,有大量读磁盘的操作。主要是定期批量写磁盘操作。因此操作磁盘非常高效。
| 这跟Kafka文件存储中读写message的设计是息息相关的。
| 
|-Kafka中读写message特点|--写message:消息从java堆转入page cache(即物理内存)。由异步线程刷盘,消息从page cache刷入磁盘。
| 					    |
| 					    |--读message:消息直接从page cache转入socket发送出去。
| 					    |  当从page cache没有找到相应数据时,此时会产生磁盘IO,从磁盘Load消息到page cache,然后直接从socket发出去
| 
|-Kafka高效文件存储设计特点|--1.Kafka把topic中一个parition大文件分成多个小文件段。通过多个小文件段,就easy定期清除或删除已经消费完文件。降低磁盘占用。
|                          |--2.通过索引信息能够高速定位message和确定response的最大大小。
|                          |--3.通过index元数据所有映射到memory,能够避免segment file的IO磁盘操作。
|                          |--4.通过索引文件稀疏存储,能够大幅降低index文件元数据占用空间大小。
|                         
|-kafka为什么快|--Kafka在磁盘上只做Sequence I/O,由于消息系统读写的特殊性,这并不存在什么问题 
|              |       
|              |--Kafka使用了底层操作系统提供的PageCache功能。
|              |  当上层有写操作时,操作系统只是将数据写入PageCache,同时标记Page属性为Dirty。          
|              |  当读操作发生时,先从PageCache中查找,如果发生缺页才进行磁盘调度,最终返回需要的数据。          
|              |  实际上PageCache是把尽可能多的空闲内存都当做了磁盘缓存来使用。
|              |  同时如果有其他进程申请内存,回收PageCache的代价又很小,所以现代的OS都支持PageCache。
|              |  使用PageCache功能同时可以避免在JVM内部缓存数据,JVM为我们提供了强大的GC能力,同时也引入了一些问题不适用与Kafka的设计。
|			   |
|              |--Kafka为了进一步的优化性能还采用了Sendfile技术(直接在内核区完成数据拷贝)

Kafka部署及使用

|
|-1.download the code|--> tar -xzf kafka_2.11-0.11.0.0.tgz 
|                    |--> cd kafka_2.11-0.11.0.0
|
|-2.Start the Server
|   Kafka uses Zookeeper so you need to first start a Zookeeper server
|
|-3.$kafka_home/config/server.properties|--broker.id = 0
|                                       |--listeners
|                                       |--host.name
|                                       |--log.dirs
|                                       |--zookeeper.connect
|
|-4.start|--> bin/zookeeper-server-start.sh config/zookeeper.properties 
|        |--> bin/kafka-server-start.sh     config/server.properties
|
|-5.test|--> bin/kafka-topics.sh --create --zookeeper hadoop000.2181 --replication-factor 1 --partitions 1 --topic test
|       |--> bin/kafka-topics.sh --list --zookeeper hadoop000:2181
|       |--> bin/kafka-console-producer.sh --broker-list hadoop000.9092 --topic test
|       |--> bin/kafka-console-consumer.sh --zookeeper hadoop000.2181 --topic test --from-beginning
|       |--> bin/kafka-topics.sh --describe --zookeeper hadoop000:2181
|       |--> bin/kafka-topics.sh --describe --zookeeper hadoop000:2181 --topic test  
|
|-6.生产者API|--Properties props = new Properties();
|            |  props.put("metadata.broker.list",KafaPropUtils.BROKER_LIST);
|            |  props.put("serializer.class","kafka.serializer.StringEncoder");
|            |  props.put("request.required.acks","1");
|            |  Producer<Integer,String> producer = new Producer<Integer, String>(new ProducerConfig(props));
|            |  producer.send(new KeyedMessage<Integer, String>("topic01","message01"));
|
|-7.消费者API|--Properties props = new Properties();
|            |  props.put("zookeeper.connect",KafaPropUtils.ZK);
|            |  props.put("group.id",KafaPropUtils.GROUP_ID);
|            |  ConsumerConnector consumer = Consumer.createJavaConsumerConnector(new ConsumerConfig(props));
|            |  consumer.createMessageStreams(topicCountMap);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值