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

 

 

 

 

posted @ 2019-04-27 14:31  问题不大1  阅读(348)  评论(0编辑  收藏  举报