kafka配置及基本命令
kafka: 分布式消息系统 p2p + ps = 消费者组 JMS: java message service p2p: peer to peer point to point ps: publish && subscribe kafka: scala + java =============== 用于实时流处理 特点:1、持久化数据 2、高吞吐量 3、分布式 4、多客户端支持 5、实时性 kafka:broker:代理 生产者 消费者 kafka_2.11-1.1.0.tgz: // 2.11 ===> scala版本 // 1.1.0 ==> kafka版本 kafka安装: ======================== 1、解压 2、符号链接 3、环境变量 # kafka环境变量 export KAFKA_HOME=/soft/kafka export PATH=$PATH:$KAFKA_HOME/bin 4、生效环境变量 5、 kafka本地模式: ======================= 1、修改配置文件:/soft/kafka/config/server.properties 修改zookeeper.connect=s102:2181,s103:2181,s104:2181 修改log.dirs=/home/centos/kafka/logs 修改listeners=PLAINTEXT://s101:9092 2、启动kafka kafka-server-start.sh [-daemon] /soft/kafka/config/server.properties 3、jps查看kafka进程 4、关闭kafka kafka-server-stop.sh kafka完全分布式:s102-s104 1、同步kafka安装目录和符号链接 xsync.sh /soft/kafka xsync.sh /soft/kafka_2.11-1.1.0 2、root同步环境变量 su root xsync.sh /etc/profile exit 3、分别使s102-s104环境变量生效 s102> source /etc/profile s103> source /etc/profile s104> source /etc/profile 4、分别修改s102-s104的kafka配置文件/soft/kafka/config/server.properties s102: 修改broker.id=102 修改listeners=PLAINTEXT://s102:9092 s103: 修改broker.id=103 修改listeners=PLAINTEXT://s103:9092 s104: 修改broker.id=104 修改listeners=PLAINTEXT://s104:9092 5、分别启动s102-s104的kafka s102> kafka-server-start.sh -daemon /soft/kafka/config/server.properties s103> kafka-server-start.sh -daemon /soft/kafka/config/server.properties s104> kafka-server-start.sh -daemon /soft/kafka/config/server.properties 6、编写批量启动kafka #!/bin/bash if [ $# -ge 1 ] ; then echo param must be 0 ; exit ; fi for (( i=102 ; i<=104 ; i++ )) ; do tput setaf 2 echo ================ s$i starting kafka ================ tput setaf 9 ssh s$i "source /etc/profile ; kafka-server-start.sh -daemon /soft/kafka/config/server.properties" done 7、编写批量关闭kafka #!/bin/bash if [ $# -ge 1 ] ; then echo param must be 0 ; exit ; fi for (( i=102 ; i<=104 ; i++ )) ; do tput setaf 2 echo ================ s$i stoping kafka ================ tput setaf 9 ssh s$i "source /etc/profile ; kafka-server-stop.sh" done 8、结合:xkafka.sh #!/bin/bash cmd=$1 if [ $# -gt 1 ] ; then echo param must be 1 ; exit ; fi for (( i=102 ; i<=104 ; i++ )) ; do tput setaf 2 echo ================ s$i $cmd kafka ================ tput setaf 9 case $cmd in start ) ssh s$i "source /etc/profile ; kafka-server-start.sh -daemon /soft/kafka/config/server.properties" ;; stop ) ssh s$i "source /etc/profile ; kafka-server-stop.sh" ;; * ) echo illegal argument ; exit ;; esac done kafka基本命令:s102-s104操作 ============================== 开启kafka服务:kafka-server-start.sh -daemon /soft/kafka/config/server.properties 关闭kafka :kafka-server-stop.sh topic: kafka生产消费的基本单位 record:kafka生产消费的基本数据单位 以K-V形式存在 topic: kafka向指定topic生产数据,向指定topic消费数据 创建topic: kafka-topics.sh --create --topic t1 --zookeeper s102:2181 --partitions 2 --replication-factor 2 列出topic: kafka-topics.sh --list --zookeeper s102:2181 创建生产者:kafka-console-producer.sh --broker-list s102:9092 --topic t1 创建消费者:kafka-console-consumer.sh --zookeeper s102:2181 --topic t1 //接着上一次位置消费 kafka-console-consumer.sh --zookeeper s102:2181 --topic t1 --from-beginning //从头开始消费 kafka使用API生产者和消费者: ============================== 1、pom文件 <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.11</artifactId> <version>1.1.0</version> </dependency> 2、编写生产者 public class MyProducer { public static void main(String[] args) throws Exception { //初始化java配置文件 Properties props = new Properties(); props.put("metadata.broker.list", "s102:9092, s103:9093, s104:9094 "); props.put("serializer.class", "kafka.serializer.StringEncoder"); props.put("request.required.acks", "1"); //将java配置文件封装成kafka配置文件 ProducerConfig config = new ProducerConfig(props); Producer<String, String> producer = new Producer<String, String>(config); for (int i = 0; i < 100; i++) { String msg = "tom" + i; System.out.println(msg); // 创建kafka消息实例 KeyedMessage<String, String> data = new KeyedMessage<String, String>("t1", msg); // 发送数据 producer.send(data); System.out.println("Message Count - " + i); Thread.sleep(1000); } // 关闭生产者 producer.close(); } } 3、编写消费者 public class MyConsumer { public static void main(String[] args) { Properties props = new Properties(); props.put("zookeeper.connect", "s102:2181,s103:2181,s104:2181"); props.put("group.id", "g1"); props.put("zookeeper.session.timeout.ms", "500"); props.put("zookeeper.sync.time.ms", "250"); props.put("auto.commit.interval.ms", "1000"); //初始化consumer配置 ConsumerConfig config = new ConsumerConfig(props); //初始化consumer ConsumerConnector consumer = kafka.consumer.Consumer .createJavaConsumerConnector(config); Map<String, Integer> topicMap = new HashMap<String, Integer>(); //指定消费线程数 topicMap.put("t1", 1); //创建消息对象 //Map<topic, List<k, message>> Map<String, List<KafkaStream<byte[], byte[]>>> consumerStreamsMap = consumer.createMessageStreams(topicMap); //获取t1主题的数据(k-v) List<KafkaStream<byte[], byte[]>> streamList = consumerStreamsMap.get("t1"); for (final KafkaStream<byte[], byte[]> stream : streamList) { ConsumerIterator<byte[], byte[]> consumerIte = stream.iterator(); while (consumerIte.hasNext()) { //迭代取出消息数据 System.out.println("value: " + new String(consumerIte.next().message())); } } if (consumer != null) { consumer.shutdown(); } } }