Apache Kafka是一个分布式发布-订阅消息系统和一个强大的队列,可以处理大量数据,并将消息从一个端点传递到另一个端点。
优点:
A. 可靠性,分布式、分区、复制和容错
B. 可扩展行,消息传递系统轻松缩放,不需要停机就能操作
C. 耐用性,使用“分布式提交日志”,消息尽量保留在磁盘上
D. 性能,对发布和订阅消息都具有高吞吐量且性能稳定
Kafka:主题、经纪人、生产者和消费者
主题:属于特定类别的消息流成为主题(Topic)
分区:主题可能有许多分区,因此可以处理任意数量的数据(Partition)
分区偏移:每个分区消息具有称为“offset”的唯一序列标识(Partition offset)
分区备份:副本是一个分区的“备份”,没有数据的读取和写入操作,用于防止 数据丢失(Replicas of partition)
经纪人:代理是负责维护发布数据的简单系统(Brokers)
Kafka集群:kafka有多个代理被称为集群(Kafka Cluster)
生产者:生产者是发送给一个或多个Kafka主题消息的发布者(Producers)
消费者:从经纪人处读取数据(Consumer)
领导者:负责给定分区的所有读取和写入节点,每个分区都有一个服务器充 当leader(Leader)
追随者:跟随领导者指令的节点,如果领导失败,一个追随者将自动成为新 的领导者(Follower)
1.下载Kafka,官方默认建议下载的镜像站点
We suggest the following mirror site for your download:
http://mirrors.shu.edu.cn/apache/kafka/1.1.0/kafka-1.1.0-src.tgz
Other mirror sites are suggested below.
It is essential that you verify the integrity of the downloaded file using the
PGP signature (.asc file) or a hash (.md5 or .sha* file).
Please only use the backup mirrors to download KEYS, PGP and MD5 sigs/hashes or
if no other mirrors are working.
2.解压、配置
tar -xzvf kafka_2.11-0.9.0.1.tgz
mv kafka_2.11-0.9.0.1 /opt/
vi /etc/profile
在末尾添加:
KAFKA_HOME=/opt/kafka_2.11-0.9.0.1
PATH=$PATH:$KAFKA_HOME/bin
cd /opt/kafka_2.11-0.9.0.1/config
vi server.properties
修改配置文件中的以下内容:
broker.id=0 //为依次增长的:0、1、2、3、4,集群中唯一id
log.dirs=/opt/kafka_2.11-0.9.0.1/logs //日志地址
zookeeper.connect=master:2181,slave1:2181,slave2:2181 //zookeeperServers列
表,各节点以逗号分开
3.启动程序
nohup bin/kafka-server-start.sh config/server.properties&
nohup &是实现在后台启动。
4.测试
启动producer
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
启动consumer
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-
beginning
增:新增一个topic:“hello”,为它分配一个分区,设置一个副本
bin/kafka-topics.sh --create --zookeeper localhost:2181
--replication-factor 1(父本因子)
--partitions 1(分区为1个) --topic hello
注意:partition-factor不能大于broker节点数
查:查询topic:hello的信息
查询指定topic的详细信息
bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic hello
查询所有可以使用的topic
Bin/kafka-topics.sh --list --zookeeper localhost:2181
改:修改hello为5个分区 alter:修改partition数(只能增加不能减少,因为删除partition会导致数据丢失)
bin/kafka-topics.sh --alter --zookeeper localhost:2181 --partitions 5 --topic hello
删:删除topic
Bin/kafka-topics.sh --delete --zookeeper localhost:2181 --topic hello(状态为标记 删除,但是还可以使用,不会报错)
是否开启topic的删除功能:默认为false,可以修改为true
Delete.topic.enable 在conf/server.properties中delete.topic.enable=true
创建生产者producer(必须的参数)
Broker-list:kafka的服务地址【多个用逗号隔开】
Topic:具体的单个topic
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic hello
创建消费者consumer(必须的参数)
Bootstrap-server:kafka的服务地址
Topic:具体的topic
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic hello
【--from-begining】表示从头开始消费,能够消费在此消费启动之前生产的数据
注意:标记为删除的topic也可以使用
Storm最初由Nathan Marz和BackType的团队创建。 在短时间内,Apache Storm成为分布式实时处理系统的标准,允许您处理大量数据。 Storm是非常快的,并且一个基准时钟为每个节点每秒处理超过一百万个元组。Apache Storm持续运行,从配置的源(Spouts)消耗数据,并将数据传递到处理管道(Bolts)。 联合,Spouts和Bolt构成一个拓扑。
Spouts是流的源
例如,一个喷头可以从Kafka Topic读取元组并将它们作为流发送。 Bolt消耗输入流,处理并可能发射新的流
Bolt可以从运行函数,过滤元组,执行流聚合,流连接,与数据库交谈等等做任何事情
Storm拓扑中的每个节点并行执行
拓扑无限运行,直到终止它。 Storm将自动重新分配任何失败的任务。 此外,Storm保证没有数据丢失,即使机器停机和消息被丢弃
Kafka和Storm集成是为了使开发人员更容易地从Storm拓扑获取和发布数据流。
主要有三个类集成Kafka与Storm,如下:
BrokerHosts-----是一个接口ZkHosts和StaticHosts是它的主要两个实现
ZkHosts-----用于通过在ZooKeeper中维护细节来动态跟踪Kafka代理
StaticHosts------用于手动/静态设置Kafka代理及其详细信息
ZkHosts是访问Kafka代理的简单快捷的方法,ZkHosts签名如下:
Public ZkHosts(String brokerZkStr,String brokerZkPath)
Public ZkHosts(String brokerZkStr)
brokerZkStr------是ZooKeeper主机
brokerZkPath-----是ZooKeeper路径一维护Kafka代理详细信息
用于定义Kafka集群的配置设置
Public KafkaConfig(BrokerHosts hosts,String topic)
BrokerHosts--------可以是ZkHosts,也可以是StaticHosts
Topic-----主题名称
是KafkaConfig的扩展,支持额外的ZooKeeper信息
Public SpoutConfig(BrokerHosts hosts,String topic,String zkRoot,String id)
BrokerHosts-------可以是是BrokerHosts接口的任何实现
zkRoot-------ZooKeeper根路径
Id--------spouts存储在ZooKeeper中消耗的偏移量的状态,id属唯一标识
SchemeAsMultiScheme是一个接口,用于指示如何将从Kafka中消耗的ByteBuffer转换为风暴元组
它源自MultiScheme并接受Scheme类的实现
有很多Scheme类的实现,一个这样的实现是StringScheme,它将字节解析为一个简单的字符串
Public SchemeAsMultiScheme(Scheme scheme)
Scheme-----从Kafka消耗的字节缓冲区
KafkaSpout是我们的spout实现,它将与Storm集成
它从kafka主题获取消息,并将其作为元组发送到Storm生态系统
KafkaSpout从SpoutConfig获取其配置详细信息
Spark Streaming API支持实时数据流的可扩展,高吞吐量,容错流处理。 数据可以从诸如Kafka,Flume,Twitter等许多源中提取,并且可以使用复杂的算法来处理,例如地图,缩小,连接和窗口等高级功能
最后,处理的数据可以推送到文件系统,数据库和活动仪表板
弹性分布式数据集(RDD)是Spark的基本数据结构
它是一个不可变的分布式对象集合
RDD中的每个数据集划分为逻辑分区,可以在集群的不同节点上计算
Kafka是Spark流式传输的潜在消息传递和集成平台
Kafka充当实时数据流的中心枢纽,并使用Spark Streaming中的复杂算法进行处理
一旦数据被处理,Spark Streaming可以将结果发布到另一个Kafka主题或存储在HDFS,数据库或仪表板中
下图描述了概念流程
它表示Spark应用程序的配置。 用于将各种Spark参数设置为键值对。
SparkConf 类有以下方法 -
set(string key,string value) - 设置配置变量。
remove(string key) - 从配置中移除密钥。
setAppName(string name) - 设置应用程序的应用程序名称。
get(string key) - get key
这是Spark功能的主要入口点。 SparkContext表示到Spark集群的连接,可用于在集群上创建RDD,累加器和广播变量。 签名的定义如下所示。
public StreamingContext(String master, String appName, Duration batchDuration,
String sparkHome, scala.collection.Seq
scala.collection.Map
主 - 要连接的群集网址(例如mesos:// host:port,spark:// host:port,local [4])。
appName - 作业的名称,以显示在集群Web UI上
batchDuration - 流式数据将被分成批次的时间间隔
public StreamingContext(SparkConf conf, Duration batchDuration)
通过提供新的SparkContext所需的配置创建StreamingContext。
conf - Spark参数
batchDuration - 流式数据将被分成批次的时间间隔
KafkaUtils API用于将Kafka集群连接到Spark流。 此API具有如下定义的显着方法 createStream 。
public static ReceiverInputDStream
StreamingContext ssc, String zkQuorum, String groupId,
scala.collection.immutable.Map
上面显示的方法用于创建从Kafka Brokers提取消息的输入流。
ssc - StreamingContext对象。
zkQuorum - Zookeeper quorum。
groupId - 此消费者的组ID。
主题 - 返回要消费的主题的地图。
storageLevel - 用于存储接收的对象的存储级别。
KafkaUtils API有另一个方法createDirectStream,用于创建一个输入流,直接从Kafka Brokers拉取消息,而不使用任何接收器。 这个流可以保证来自Kafka的每个消息都包含在转换中一次
Kafka在“org.apache.kafka.tools。"下打包的工具。 工具分为系统工具和复制工具
可以使用运行类脚本从命令行运行系统工具
bin/kafka-run-class.sh package.class - - options
a. Kafka迁移工具 - 此工具用于将代理从一个版本迁移到另一个版本。
b. Mirror Maker - 此工具用于向另一个Kafka集群提供镜像。
c. 消费者偏移检查器 - 此工具显示指定的主题和使用者组的消费者组,主题,分区,偏移量,日志大小,所有者。
Kafka复制是一个高级设计工具。 添加复制工具的目的是为了更强的耐用性和更高的可用性。 下面提到一些复制工具 -
d. 创建主题工具 - 这将创建一个带有默认分区数,复制因子的主题,并使用Kafka的默认方案进行副本分配。
e. 列表主题工具 - 此工具列出了指定主题列表的信息。 如果命令行中没有提供主题,该工具将查询Zookeeper以获取所有主题并列出它们的信息。 工具显示的字段是主题名称,分区,leader,replicas,isr。
f. 添加分区工具 - 创建主题,必须指定主题的分区数。 稍后,当主题的卷将增加时,可能需要用于主题的更多分区。 此工具有助于为特定主题添加更多分区,还允许手动复制分配已添加的分区。