前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【消息队列 MQ 专栏】消息队列之 Kafka

【消息队列 MQ 专栏】消息队列之 Kafka

作者头像
芋道源码
发布于 2018-07-31 09:08:21
发布于 2018-07-31 09:08:21
4K00
代码可运行
举报
文章被收录于专栏:芋道源码1024芋道源码1024
运行总次数:0
代码可运行

Kafka 特点

Kafka 最早是由 LinkedIn 公司开发一种分布式的基于发布/订阅的消息系统,之后成为 Apache 的顶级项目。主要特点如下:

1. 同时为发布和订阅提供高吞吐量

Kafka 的设计目标是以时间复杂度为 O(1) 的方式提供消息持久化能力,即使对TB 级以上数据也能保证常数时间的访问性能。即使在非常廉价的商用机器上也能做到单机支持每秒 100K 条消息的传输。

2. 消息持久化

将消息持久化到磁盘,因此可用于批量消费,例如 ETL 以及实时应用程序。通过将数据持久化到硬盘以及 replication 防止数据丢失

3. 分布式

支持 Server 间的消息分区及分布式消费,同时保证每个 partition 内的消息顺序传输。这样易于向外扩展,所有的producer、broker 和 consumer 都会有多个,均为分布式的。无需停机即可扩展机器。

4. 消费消息采用 pull 模式

消息被处理的状态是在 consumer 端维护,而不是由 server 端维护,broker 无状态,consumer 自己保存 offset。

5. 支持 online 和 offline 的场景。

同时支持离线数据处理和实时数据处理。

Kafka 中的基本概念

img

1. Broker

Kafka 集群中的一台或多台服务器统称为 Broker

2. Topic

每条发布到 Kafka 的消息都有一个类别,这个类别被称为 Topic 。(物理上不同Topic 的消息分开存储。逻辑上一个 Topic 的消息虽然保存于一个或多个broker上,但用户只需指定消息的 Topic 即可生产或消费数据而不必关心数据存于何处)

3. Partition

Topic 物理上的分组,一个 Topic 可以分为多个 Partition ,每个 Partition 是一个有序的队列。Partition 中的每条消息都会被分配一个有序的 id(offset)

4. Producer

消息和数据的生产者,可以理解为往 Kafka 发消息的客户端

5. Consumer

消息和数据的消费者,可以理解为从 Kafka 取消息的客户端

6. Consumer Group

每个 Consumer 属于一个特定的 Consumer Group(可为每个 Consumer 指定Group Name,若不指定 Group Name 则属于默认的 Group)。这是 Kafka 用来实现一个 Topic 消息的广播(发给所有的 Consumer )和单播(发给任意一个 Consumer )的手段。一个 Topic 可以有多个 Consumer Group。Topic 的消息会复制(不是真的复制,是概念上的)到所有的 Consumer Group,但每个 Consumer Group 只会把消息发给该 Consumer Group 中的一个 Consumer。如果要实现广播,只要每个 Consumer 有一个独立的 Consumer Group 就可以了。如果要实现单播只要所有的 Consumer 在同一个 Consumer Group 。用 Consumer Group 还可以将 Consumer 进行自由的分组而不需要多次发送消息到不同的 Topic 。

Kafka 安装

Mac 用户用 HomeBrew 来安装,安装前要先更新 brew

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
brew update

接着安装 kafka

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
brew install kafka

安装完成之后可以查看 kafka 的配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /usr/local/etc/kafka

kafka 配置文件

kafka 需要用到 zookeeper,HomeBrew 安装kafka 的时候会同时安装 zookeeper。下面先启动 zookeeper:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zookeeper-server-start /usr/local/etc/kafka/zookeeper.properties

接着启动 kafka

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /usr/local/Cellar/kafka/0.11.0.1
./bin/kafka-server-start /usr/local/etc/kafka/server.properties

创建 topic,设置 partition 数量为2,topic 的名字叫 test-topic,下面的例子都用这个 topic

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /usr/local/Cellar/kafka/0.11.0.1
./bin/kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 2 --topic test-topic

查看创建的 topic

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /usr/local/Cellar/kafka/0.11.0.1
./bin/kafka-topics --list --zookeeper localhost:2181

Kafka 命令行测试

发送消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /usr/local/Cellar/kafka/0.11.0.1/bin
kafka-console-producer --broker-list localhost:9092 --topic test-topic

消费消息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /usr/local/Cellar/kafka/0.11.0.1/bin
kafka-console-consumer --bootstrap-server localhost:9092 --topic test-topic --from-beginning

删除 topic

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /usr/local/Cellar/kafka/0.11.0.1/bin
./bin/kafka-topics --delete --zookeeper localhost:2181 --topic test-topic

如果 kafka 启动时加载的配置文件中 server.properties 没有配置delete.topic.enable=true,那么此时的删除并不是真正的删除,而是把 topic 标记为:marked for deletion

查看所有 topic

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /usr/local/Cellar/kafka/0.11.0.1/bin
./bin/kafka-topics --zookeeper localhost:2181 --list 

物理删除 topic

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
登录zookeeper客户端:/usr/local/Cellar/zookeeper/3.4.10/bin/zkCli
找到topic所在的目录:ls /brokers/topics
找到要删除的topic,执行命令:rmr /brokers/topics/test-topic 即可,此时topic被彻底删除

Java 客户端访问

1. maven工程的pom文件中添加依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>0.11.0.1</version>
</dependency>

2. 消息生产者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package org.study.kafka;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.HashMap;
import java.util.Map;
public class ProducerSample {
    public static void main(String[] args) {
        Map<String, Object> props = new HashMap<String, Object>();
        props.put("zk.connect", "127.0.0.1:2181");//zookeeper 的地址
        props.put("bootstrap.servers", "localhost:9092");//用于建立与 kafka 集群连接的 host/port 组。
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        String topic = "test-topic";
        Producer<String, String> producer = new KafkaProducer<String, String>(props);
        producer.send(new ProducerRecord<String, String>(topic, "idea-key2", "java-message 1"));
        producer.send(new ProducerRecord<String, String>(topic, "idea-key2", "java-message 2"));
        producer.send(new ProducerRecord<String, String>(topic, "idea-key2", "java-message 3"));
        producer.close();
    }
}

3. 消息消费者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package org.study.kafka;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.util.Arrays;
import java.util.Properties;
public class ConsumerSample {
    public static void main(String[] args) {
        String topic = "test-topic";// topic name
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");//用于建立与 kafka 集群连接的 host/port 组。
        props.put("group.id", "testGroup1");// Consumer Group Name
        props.put("enable.auto.commit", "true");// Consumer 的 offset 是否自动提交
        props.put("auto.commit.interval.ms", "1000");// 自动提交 offset 到 zookeeper 的时间间隔,时间是毫秒
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        Consumer<String, String> consumer = new KafkaConsumer(props);
        consumer.subscribe(Arrays.asList(topic));
        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(100);
            for (ConsumerRecord<String, String> record : records)
                System.out.printf("partition = %d, offset = %d, key = %s, value = %s%n", record.partition(), record.offset(), record.key(), record.value());
        }
    }
}

4. 启动 zookeeper

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zookeeper-server-start /usr/local/etc/kafka/zookeeper.properties

5. 启动 kafka 服务器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kafka-server-start /usr/local/etc/kafka/server.properties

6. 运行 Consumer

先运行 Consumer ,这样当生产者发送消息的时候能在消费者后端看到消息记录。

7. 运行 Producer

运行 Producer,发布几条消息,在 Consumer 的控制台能看到接收的消息

Consumer 控制台

Kafka 集群配置

kafka 的集群配置一般有三种,即: single node - single broker ,single node - multiple broker ,multiple node - multiple broker

前两种实际上官网有介绍。

single node - single broker

单节点单 broker

1. 启动 zookeeper
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zookeeper-server-start /usr/local/etc/kafka/zookeeper.properties
2. 启动 kafka broker
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kafka-server-start /usr/local/etc/kafka/server.properties
3. 创建一个 kafka topic
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 2 --topic topic-singlenode-singlebroker
4. 启动 producer 发送信息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kafka-console-producer --broker-list localhost:9092 --topic topic-singlenode-singlebroker

broker-list 和 topic 这两个参数是必须的,broker-list 指定要连接的 broker 的地址,格式为 node_address:port 。topic 是必须的,因为需要发送消息给订阅了该topic 的 consumer group 。现在可以在命令行里输入一些信息,每一行会被作为一个消息。

发送消息

5. 启动 consumer 消费消息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kafka-console-consumer --bootstrap-server localhost:9092 --topic topic-singlenode-singlebroker

在不同的终端窗口里分别启动 zookeeper、broker、producer、consumer 后,在producer 终端里输入消息,消息就会在 consumer 终端中显示了。

消息显示

single node - multiple broker

单节点多 broker

1. 启动 zookeeper
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
zookeeper-server-start /usr/local/etc/kafka/zookeeper.properties
2. 启动broker

如果需要在单个节点(即一台机子)上面启动多个 broker(这里作为例子启动三个 broker),需要准备多个server.properties文件即可,所以需要复制 /usr/local/etc/kafka/server.properties 文件。因为需要为每个 broker 指定单独的属性配置文件,其中 broker.id 、 port 、 log.dir 这三个属性必须是不同的。

新建一个 kafka-example 目录和三个存放日志的目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir kafka-example
mkdir kafka-logs-1
mkdir kafka-logs-2
mkdir kafka-logs-3

复制 /usr/local/etc/kafka/server.properties 文件三份

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cp server.properties /Users/niwei/Downloads/kafka-example/server-1.properties
cp server.properties /Users/niwei/Downloads/kafka-example/server-2.properties
cp server.properties /Users/niwei/Downloads/kafka-example/server-3.properties

在 broker1 的配置文件 server-1.properties 中,相关要修改的参数为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
broker.id=1
port=9093
log.dirs=/Users/niwei/Downloads/kafka-example/kafka-logs-1

broker2 的配置文件 server-2.properties 中,相关要修改的参数为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
broker.id=2
port=9094
log.dirs=/Users/niwei/Downloads/kafka-example/kafka-logs-2

broker3 的配置文件 server-3.properties 中,相关要修改的参数为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
broker.id=3
port=9095
log.dirs=/Users/niwei/Downloads/kafka-example/kafka-logs-3

启动每个 broker

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /Users/niwei/Downloads/kafka-example
kafka-server-start server-1.properties
kafka-server-start server-2.properties
kafka-server-start server-3.properties
3. 创建 topic

创建一个名为 topic-singlenode-multiplebroker 的topic

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kafka-topics --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic topic-singlenode-multiplebroker
4. 启动 producer 发送信息

如果一个 producer 需要连接多个 broker 则需要传递参数 broker-list

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kafka-console-producer --broker-list localhost:9093, localhost:9094, localhost:9095 --topic topic-singlenode-multiplebroker
5. 启动 consumer 消费消息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kafka-console-consumer --zookeeper localhost:2181 --topic topic-singlenode-multiplebroker

单节点多 broker 消费消息

multiple node - multiple broker

多节点多 broker

搭建 zookeeper 集群

1. Kafka 的集群配置
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
broker.id=1  #当前机器在集群中的唯一标识
port=9093 #当前 kafka 对外提供服务的端口,默认是 9092
host.name=192.168.121.101 #这个参数默认是关闭的,在0.8.1有个bug,DNS解析问题,失败率的问题。
log.dirs=/Users/niwei/Downloads/kafka-example/kafka-logs-1 #消息存放的目录,这个目录可以配置为逗号分割的表达式
zookeeper.connect=192.168.120.101:2181,192.168.120.102:2181,192.168.120.103:2181 #设置 zookeeper 集群的连接端口
num.network.threads=3 #这个是 borker 进行网络处理的线程数
num.io.threads=5 #这个是 borker 进行 IO 处理的线程数
socket.send.buffer.bytes=102400 #发送缓冲区的大小,数据先回存储到缓冲区了到达一定的大小后在发送能提高性能
socket.receive.buffer.bytes=102400 #接收缓冲区的大小,当数据到达一定大小后在序列化到磁盘
socket.request.max.bytes=104857600 #这个参数是向 kafka 请求消息或者向 kafka 发送消息的请求的最大数,这个值不能超过 jvm 的堆栈大小
num.partitions=1 #默认的分区数,一个 topic 默认1个分区数
log.retention.hours=24 #默认消息的最大持久化时间,24小时
message.max.byte=5242880  #消息保存的最大值5M
default.replication.factor=2  #kafka 保存消息的副本数,如果一个副本失效了,另一个还可以继续提供服务
replica.fetch.max.bytes=5242880  #取消息的最大直接数
log.segment.bytes=1073741824 #这个参数是因为 kafka 的消息是以追加的形式落地到文件,当超过这个值的时候,kafka 会新建一个文件
log.retention.check.interval.ms=300000 #每隔 300000 毫秒去检查上面配置的 log 失效时间(log.retention.hours=24 ),到目录查看是否有过期的消息如果有则删除
log.cleaner.enable=false #是否启用 log 压缩,一般不用启用,启用的话可以提高性能

由于是多节点多 broker 的,所以每个 broker 的配置文件 server.properties 都要按以上说明修改

2. producer 的配置修改
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kafka-console-producer --broker-list 192.168.21.1:9092,192.168.21.2:9092,192.168.21.3:9092 --topic topic-multiplenode-multiplebroker
3. consumer 的配置修改
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kafka-console-consumer --zookeeper 192.168.120.101:2181,192.168.120.102:2181,192.168.120.103:2181 --topic topic-multiplenode-multiplebroker

Kafka 高可靠性配置

Kafka 提供了很高的数据冗余弹性,对于需要数据高可靠性的场景可以增加数据冗余备份数(replication.factor),调高最小写入副本数的个数(min.insync.replicas)等等,但是这样会影响性能。反之,性能提高而可靠性则降低,用户需要自身业务特性在彼此之间做一些权衡性选择。

要保证数据写入到 Kafka 是安全的、高可靠的,需要如下的配置:

1. topic 的配置

replication.factor>=3,即副本数至少是3个2<=min.insync.replicas<=replication.factor

2. broker 的配置

leader 的选举条件 unclean.leader.election.enable=false

3. producer 的配置

request.required.acks=-1,producer.type=sync

Kafka 高吞吐量的秘诀

消息中间件从功能上看就是写入数据、读取数据两大类,优化也可以从这两方面来看。

为了优化写入速度 Kafak 采用以下技术:

1. 顺序写入

磁盘大多数都还是机械结构(SSD不在讨论的范围内),如果将消息以随机写的方式存入磁盘,就需要按柱面、磁头、扇区的方式寻址,缓慢的机械运动(相对内存)会消耗大量时间,导致磁盘的写入速度与内存写入速度差好几个数量级。为了规避随机写带来的时间消耗,Kafka 采取了顺序写的方式存储数据,如下图所示:

顺序写

消费消息

2. 内存映射文件

即便是顺序写入硬盘,硬盘的访问速度还是不可能追上内存。所以 Kafka 的数据并不是实时的写入硬盘,它充分利用了现代操作系统分页存储来利用内存提高I/O效率。Memory Mapped Files (后面简称mmap)也被翻译成内存映射文件,在64位操作系统中一般可以表示 20G 的数据文件,它的工作原理是直接利用操作系统的 Page 来实现文件到物理内存的直接映射。完成映射之后对物理内存的操作会被同步到硬盘上(由操作系统在适当的时候)。通过 mmap 进程像读写硬盘一样读写内存,也不必关心内存的大小,有虚拟内存为我们兜底。使用这种方式可以获取很大的 I/O 提升,因为它省去了用户空间到内核空间复制的开销(调用文件的 read 函数会把数据先放到内核空间的内存中,然后再复制到用户空间的内存中)但这样也有一个很明显的缺陷——不可靠,写到 mmap 中的数据并没有被真正的写到硬盘,操作系统会在程序主动调用 flush 的时候才把数据真正的写到硬盘。所以 Kafka 提供了一个参数—— producer.type 来控制是不是主动 flush,如果Kafka 写入到 mmap 之后就立即 flush 然后再返回 Producer 叫同步(sync);如果写入 mmap 之后立即返回,Producer 不调用 flush ,就叫异步(async)。

3. 标准化二进制消息格式

为了避免无效率的字节复制,尤其是在负载比较高的情况下影响是显著的。为了避免这种情况,Kafka 采用由 Producer,Broker 和 Consumer 共享的标准化二进制消息格式,这样数据块就可以在它们之间自由传输,无需转换,降低了字节复制的成本开销。

而在读取速度的优化上 Kafak 采取的主要是零拷贝

零拷贝(Zero Copy)的技术:

传统模式下我们从硬盘读取一个文件是这样的

文件传输到 Socket 的常规方式

(2) 应用将数据从内核空间读到用户空间的缓存中

(3) 应用将数据写会内核空间的套接字缓存中

(4)操作系统将数据从套接字缓存写到网卡缓存中,以便将数据经网络发出

这样做明显是低效的,这里有四次拷贝,两次系统调用。针对这种情况 Unix 操作系统提供了一个优化的路径,用于将数据从页缓存区传输到 socket。在 Linux 中,是通过 sendfile 系统调用来完成的。Java提供了访问这个系统调用的方法:FileChannel.transferTo API。这种方式只需要一次拷贝:操作系统将数据直接从页缓存发送到网络上,在这个优化的路径中,只有最后一步将数据拷贝到网卡缓存中是需要的。

零拷贝方式传输到 Socket

Kafka 速度的秘诀在于它把所有的消息都变成一个的文件。通过 mmap 提高 I/O的速度,写入数据的时候是末尾添加所以速度最优;读取数据的时候配合sendfile 直接暴力输出。所以单纯的去测试 MQ 的速度没有任何意义,Kafka 的这种暴力的做法已经脱了 MQ 的底裤,更像是一个暴力的数据传送器。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 芋道源码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
动物育种统计发展的百年--翻译版
Daniel Gianola1–5 and Guilherme J.M. Rosa1,2
邓飞
2023/09/06
3600
动物育种统计发展的百年--翻译版
植物碰撞动物的火花--数据分析进阶
本来,植物育种的数据分析都是随机区组、增广试验、空间分析之类的,当碰到动物育种的领域,系谱信息、个体动物模型就出来了,更别提多性状模型、基因组选择、基因与环境互作,这些都是进阶的内容。
邓飞
2022/12/12
4610
植物碰撞动物的火花--数据分析进阶
我的农学转数据分析之花花草草
数据分析界育种知识最好、育种界编程最扎实、段子讲得最好的数据分析师,所以:编程+数据分析+育种,就是我的日常工作了。
邓飞
2022/12/12
5460
我的农学转数据分析之花花草草
GWAS和GS的结合:SSGWAS的应用
满血复活。注意:这个blupf90的新功能,貌似有点问题,好几个人测试显示SSGWAS结果P-value不显示。还未坐实,待我测试后公布。
邓飞
2019/09/04
1.7K0
GWAS和GS的结合:SSGWAS的应用
会议回顾 | 基因组育种技术助力畜禽水产等动物育种的选择及产业应用
2022年12月8日,由影子基因、华大智造和翌圣生物联合举办,农业动物遗传育种与繁殖教育部重点实验室、深圳国家基因库、国家畜牧科技创新联盟以及基因组育种前沿支持的动物基因组育种前沿与产业应用线上研讨会成功召开。本次研讨会得到动物遗传育种领域专家学者的广泛关注,组织单位6个平台同步直播,累计观看人数达到1.2万人次,听会师生踊跃提问交流,均表示通过此次学术研讨会受益匪浅。
尐尐呅
2023/03/02
6070
会议回顾 | 基因组育种技术助力畜禽水产等动物育种的选择及产业应用
基因组选择分析软件调研
目前, 基因组选择进入了一个高速发展的阶段, 各种新的算法和模型被提出。为了解相关软件应用的整体情况,也为选择合适的软件进行全基因组选择分析提供决策,这里对基因组选择的软件进行一个汇总。
邓飞
2019/06/13
1.9K0
ASReml文献解析|如何分析猪繁殖性状遗传参数估计
asreml软件功能非常强大,使用简单,遗传评估和基因组选择的利器,5月份有个遗传评估和基因组选择的培训班(见文末),
邓飞
2024/05/11
2990
ASReml文献解析|如何分析猪繁殖性状遗传参数估计
读文献:全基因组选择模型进展及展望
随着全基因组选择统计模型的不断改进优化,模型的稳定性及准确性不断提高,但是依然面临两个重要的挑战,即计算准确性和计算效率;直接法(GBLUP为代表)计算效率较高,但是计算准确性略差于间接法(BayesB为代表),虽然学者对直接法进行了改进,但是由于改进的策略中人为设定参数较多,因此模型的预测准确性受主观因素影响较大;间接法计算准确性较高,但是由于参数求解过程中计算量庞大,且无法实现并行运算,而育种讲求时效性,所以难以高效指导育种实践;因此,如何优化模型,尽可能减少人为设定参数,与机器学习方法有效结合,并融入高效可并行运算,既能保证较高准确性的同时,大大提升计算效率,是未来全基因组选择模型优化的方向。
邓飞
2019/12/05
1.1K0
一步法中混合线性模型方程组构建和控制--blupf90
参考文献 http://nce.ads.uga.edu/wiki/lib/exe/fetch.php?media=singlestepblupf90.pdf 1,ABLUP VS SSGBLUP 传统
邓飞
2019/07/07
1K0
一步法中混合线性模型方程组构建和控制--blupf90
育种数据分析中转化数据对结果的影响
在模型假定中,数据需要符合正态分布,在动物模型分析中,如果对数据进行转化,对育种值和方差组分变化的情况,进行测试。
邓飞
2019/12/05
6570
全基因组选择介绍及实践-1
这篇是基因组选择的理论加实践,因为我看到一句话,Talk is cheap. Show me the code,很有感触,有感而写。使用的包是R的sommer和asreml,其实强健的还是成熟的软件,比如DMU,BLUPF90,PIBLUP,ASreml等,但sommer作为基本功能的演示,非常合适。
邓飞
2019/06/13
2.1K0
农学的为何要学习神经网络???
在我刚开始学习GS的时候,我是从混合线性模型(LMM)的基础上理解的,因为动物模型BLUP,所以基因组选择GBLUP,再所以一步法ssGBLUP。
邓飞
2022/12/13
3270
农学的为何要学习神经网络???
育种数据分析神器:线性混合模型
这里使用sleepstudy数据集,看一下免费的R包lme4和付费包asreml如何处理不同的混合线性模型,以加深对混合线性模型的理解。
邓飞
2022/12/13
9060
育种数据分析神器:线性混合模型
丢失的遗传力是个什么鬼?
这两天被黄三文老师的团队刷屏了(2022年6月8日,中国农业科学院深圳农业基因组研究所(“基因组所”)黄三文团队在Nature 杂志同时在线发表了两篇研究论文),报道了该团队在植物基因组学领域的两项重要研究成果,为实现泛基因组在作物育种的应用提供了新的解决方案。其中一篇《Graph pangenome captures missing heritability and empowers tomato breeding》介绍了通过图泛基因组(Graph Pan-genome)解释了重要的数量遗传学的问题:丢失的遗传力。
邓飞
2022/07/27
8710
丢失的遗传力是个什么鬼?
环境遗传相关 | 育种中的基因与环境互作
基因与环境互作,植物中同一个品种多年多点种植,评价基因与环境互作,找到品种最适合推广的区域。
邓飞
2022/12/13
1.1K0
环境遗传相关 | 育种中的基因与环境互作
通过基因组选择预测杂交水稻的表现(数据挖掘)
基因组选择,预测杂种优势,在水稻可以用,在玉米,高粱中也可以用,在动物选择配套系时也可以用,根据加性效应和非加性效应进行预测,前景广阔。
邓飞
2019/06/13
9640
农业数据分析师的职业规划
农业的数据分析以后会越来越重要,因为分子数据的落地,包括分子标记辅助、GWAS和GS的应用,特别是基因组选择(GS)的落地,使得育种的效率大大提升,以后使用数据去育种将不再是纸面上冠冕堂皇的话,而是事实。
邓飞
2022/12/13
3530
农业数据分析师的职业规划
学习一个PPT:育种中混线性模型的应用
可以看出,GS的方法比传统系谱的方法准确性要高。对于一些甚至系谱也没有应用,只靠家系或者表型选择的中低遗传力性状,GS呈现碾压式优势。所谓的降维打击既是如此。
邓飞
2019/12/19
8930
文献阅读: 林木中遗传参数评估
这篇文章, 非常具有代表性, 可以为林木和作物的数据分析提供思路, 不一定非要有系谱才可以计算育种值和遗传相关, 混合线性模型代替一般线性模型进行育种值的筛选, 是大势所趋, 必须推而广之.
邓飞
2019/06/13
6390
文献阅读: ABLUP-GBLUP-SSGBLUP模拟数据比较
全基因组选择, 参考群需要建多大, 这篇文章用实际数据和模拟数据证明, 参考群至少要有500才有效果. 另外, 多性状SSGBLUP比单性状SSGBLUP要好. 所以, 学好传统的数量遗传学对于基因组选择也是有帮助的.
邓飞
2019/06/13
2.1K0
推荐阅读
相关推荐
动物育种统计发展的百年--翻译版
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档