kafka介绍
kakfa:
1.简介
1.定义: kafka是一个分布式、支持分区(paritition)、多副本的,基于zookeeper协调的分布式消息系统 2.能做什么 可以实时的处理大量数据,满足各种场景需求。hadoop批处理,spark/storm流式处理等 3.kafka的特性: 3.1 高吞吐、低延迟 kafka每秒可以处理几十万的消息,延迟最低只有几毫秒 每个topic可以分多个partition,consumer group对partition进行consume操作 3.2 可扩展性 kafka集群支持热扩展 3.3 持久性、可靠性 消息被持久化到本地磁盘,并且支持数据备份防止数据丢失 3.4 容错性 允许集群中节点失败(如果副本数n,允许n-1个节点失败) 3.5 高并发 支持数千个客户端同时读写 4.使用场景 4.1 日志收集 4.2 消息系统 4.3 流式处理 5.流程 producers 往brokers里面的指定topic写消息 consumer 从brokers里面拉取指定topic的消息进行业务处理
** kakfa.apache.org ** Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 重要名词: Producer(生产者) 消息产生者,产生消息,将其发送到Broker; Consumer(消费者) 使用数据的客户端,从Broker得到消息; Broker(中间人,消息中转站) 即kafka的Server;集群(cluster)由一堆Broker组成 Zookeeper 管理连接信息,包括各个节点的IP,端口等;Producer和Consumer需要到Zookeeper请求Broker的信息,从而进行消息的收发; 一个新的Broker的启动也需要到Zookeeper注册; zookeeper也可以配集群。目的是防止某一台挂了。 producer和consumer通过zookeeper去发现topic,并且通过zookeeper来协调生产和消费的过程。 Topic Topic,是kafka对消息分类的依据;一条消息,必须有一个与之对应的Topic; 比如现在又两个Topic,分别是Love和Hate,Producer向Love发送一个消息苹果,然后向Hate发送一个消息土豆;那么, 订阅Love的Consumer就会收到消息苹果,订阅Hate的Consumer就会收到消息土豆; 每个Consumer可以同时订阅多个Topic,也即是说,同时订阅Love和Hate的Consumer可以同时收到苹果和土豆。 Message Message就是我们所说的消息,是KAfKA操作的对象,消息是按照Topic存储的; KAFKA中按照一定的期限保存着所有发布过的Message,不管这些Message是否被消费过。kafka默认存储7天。
2.安装
kafka_2.10-0.8.2.1 ** 2.10是scala的版本,kafka是用Scala开发的,scale的安装版本应该对应 ** 0.8.2.1是kafka的版本 1、安装jdk和zookeeper,并启动 $ sbin/zkServer.sh start --启动 $ sbin/zkServer.sh status --查看状态,也可jps查看 2、安装scala [tom@blue01 cdh]$ tar zxvf /opt/softwares/scala-2.10.4.tgz $ su - # vi /etc/profile #SCALA_HOME SCALA_HOME=/opt/modules/cdh/scala-2.10.4 export PATH=$PATH:$SCALA_HOME/bin $ scala -version 3、安装kafka $ tar zxvf /opt/softwares/kafka_2.10-0.8.2.1.tgz 4、修改配置文件 a) server.properties: # 消息中转站,每个broker id必需唯一 broker.id=0 port=9092 # 主机名,去掉注解 host.name=blue01.mydomain # kafka存储数据的目录,并非存放日志的目录,$ mkdir data log.dirs=/opt/modules/cdh/kafka_2.10-0.8.2.1/data # 指定zookeeper服务器 zookeeper.connect=blue01.mydomain:2181 b) producer.properties: # broker列表 metadata.broker.list=blue01.mydomain:9092 c) consumer.properties: zookeeper.connect=blue01.mydomain:2181 5、启动kafka bin/kafka-server-start.sh config/server.properties kafka初次使用: 1、创建一个topic # 副本因子通常是奇数,不大于集群服务器台数 # 分区数不能大于集群服务器台数 bin/kafka-topics.sh --create --zookeeper blue01.mydomain:2181 --replication-factor 1 --partitions 1 --topic testTopic # 查看topic list bin/kafka-topics.sh --list --zookeeper blue01.mydomain:2181 2、启动生产者 bin/kafka-console-producer.sh --broker-list blue01.mydomain:9092 --topic testTopic 3、启动消费者,再开一个窗口 bin/kafka-console-consumer.sh --zookeeper blue01.mydomain:2181 --topic testTopic --from-beginning ** 生产者:flume、程序 ** 消费者:spark、storm、impala
3.kafka与flume整合
生产者flume和kafka整合: ** flume-collector channel1[c3] --> HDFS[k3] source[r3] channel2[c4] --> kafka[k4] 1、flume-apache.conf --不需要修改 ** 监控apache web应用的日志文件 2、flume-hive.conf --不需要修改 ** 监控hive日志文件 $ sbin/start-dfs.sh ;sbin/start-yarn.sh ;mr-jobhistory-daemon.sh start historyserver 3、修改flume-collector.conf ------------ # 一个源通过两个管道同时向两个目标下沉 agent3.sources = r3 agent3.channels = c3 c4 agent3.sinks = k3 k4 # 优化参数,复制 agent3.source.r3.selector.type = replicating # define sources agent3.sources.r3.type = avro agent3.sources.r3.bind = 192.168.122.128 agent3.sources.r3.port = 4545 # define channels --> c3 agent3.channels.c3.type = memory agent3.channels.c3.capacity = 1000 agent3.channels.c3.transactionCapacity = 100 # define channels --> c4 agent3.channels.c4.type = memory agent3.channels.c4.capacity = 1000 agent3.channels.c4.transactionCapacity = 100 # define sinks : k4 agent3.sinks.k4.type = org.apache.flume.sink.kafka.KafkaSink agent3.sinks.k4.brokerList = blue01.mydomain:9092 agent3.sinks.k4.topic = testTopic # define sinks : k3 #启用设置多级目录,这里按年/月/日/时 2级目录,每个小时生成一个文件夹 agent3.sinks.k3.type = hdfs agent3.sinks.k3.hdfs.path=hdfs://192.168.122.128:8020/flume3/%Y%m%d/%H agent3.sinks.k3.hdfs.filePrefix = accesslog #启用按时间生成文件夹 agent3.sinks.k3.hdfs.round=true #设置round单位:小时 agent3.sinks.k3.hdfs.roundValue=1 agent3.sinks.k3.hdfs.roundUnit=hour #使用本地时间戳 agent3.sinks.k3.hdfs.useLocalTimeStamp=true agent3.sinks.k3.hdfs.batchSize=1000 agent3.sinks.k3.hdfs.fileType=DataStream agent3.sinks.k3.hdfs.writeFormat=Text #设置解决文件过多过小问题 #每600秒生成一个文件 agent3.sinks.k3.hdfs.rollInterval=600 #当达到128000000bytes时,创建新文件 127*1024*1024 #实际环境中如果按照128M回顾文件,那么这里设置一般设置成127M agent3.sinks.k3.hdfs.rollSize=128000000 #设置文件的生成不和events数相关 agent3.sinks.k3.hdfs.rollCount=0 #设置成1,否则当有副本复制时就重新生成文件,上面三条则没有效果 agent3.sinks.k3.hdfs.minBlockReplicas=1 # bind the sources and sinks to the channels agent3.sources.r3.channels = c3 c4 agent3.sinks.k3.channel = c3 agent3.sinks.k4.channel = c4 ------------------ 测试:(接下来的操作要打开一堆窗口) 1、刷新网页 $ su - # service httpd start $ su - tom $ tail -F /var/log/httpd/access_log $ bin/flume-ng agent --conf conf/ --name agent1 --conf-file conf/flume-apache.conf 2、启动CDH Hadoop,启动hive $ tail -F /opt/modules/cdh/hive-0.13.1-cdh5.3.6/logs/hive.log > show databases; $ bin/flume-ng agent --conf conf/ --name agent2 --conf-file conf/flume-hive.conf 3、启动agent3: $ bin/flume-ng agent --conf conf/ --name agent3 --conf-file conf/flume-collector.conf 进入CDH Hadoop,监控日志变化,注意:路径要修改(监控.temp文件效果会明显点) $ bin/hdfs dfs -tail -f /flume3/20161226/11/accesslog.1482724356118.tmp 4、启动zookeeper $ sbin/zkServer.sh start 启动kafka $ bin/kafka-server-start.sh config/server.properties 启动kafka--消费者: $ bin/kafka-console-consumer.sh --zookeeper blue01.mydomain:2181 --topic testTopic --from-beginning PS: ** 查看之前执行过的命令 $ history | grep flume