複習總結06:Kafka

一、Kafka概述
核心組件:
Topic:消息分類,接收到的消息按照Topic進行分類。
Producer:發送消息。
Consumer:接收消息。
broker:每個Kafka實例。
zookeeper:依賴集羣保存meta信息
集羣模型


二、Kafka常用命令
1、創建topic
bin/kafka-topics.sh --create --zookeeper server:2181 --replication-factor1 --partitions1 --topic test
2、kafka生產者客戶端命令
bin/kafka-console-producer.sh  --broker-list server:9092 --topic test
3、kafka消費者客戶端命令
bin/kafka-console-consumer.sh  -zookeeper server:2181 --topic test
4、kafka服務啓動
bin/kafka-server-start.sh   config/server.properties
5、Kafka服務停用
bin/kafka-server-stop.sh

三、Kafka Java API
見總結5:KafkaAPI

四、Flume & Kafka 完成監測日誌
實時檢測1:flume監測,Kafka消費者輸出
1
private static final String topic = "itcast";
2
private static final Integer threads = 2;
3
4
 public static void main(String[] args) {
5
   
6
   Properties props = new Properties();
7
   props.put("zookeeper.connect", "server:2181,server02:2181,server03:2181");
8
   props.put("group.id", "vvvvv");
9
   props.put("auto.offset.reset", "smallest");
10
   
11
   //創建消費者連接器
12
   ConsumerConfig config = new ConsumerConfig(props);
13
   ConsumerConnector consumer =Consumer.createJavaConsumerConnector(config);
14
   
15
   Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
16
   topicCountMap.put(topic, threads);
17
   //Map下是字符串和一個List,List下是Kafka字節流
18
   Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumer.createMessageStreams(topicCountMap);
19
   //獲取某Topic下的消費者流
20
   List<KafkaStream<byte[], byte[]>> streams = consumerMap.get(topic);
21
   
22
   //遍歷,讀取
23
   for(final KafkaStream<byte[], byte[]> kafkaStream : streams){
24
      new Thread(new Runnable() {
25
         @Override
26
         public void run() {
27
            for(MessageAndMetadata<byte[], byte[]> mm : kafkaStream){
28
               String msg = new String(mm.message());
29
               System.out.println(msg);
30
            }
31
         }
32
      }).start();
33
   }
34
}

五、Kafka Producer-->>--KafkaSpout-->>--Bolt-->>--Redis
①Kafka Producer:適用於其他任何形式的生產者
1
public static void main(String[] args) {
2
    String TOPIC = "ccc";
3
    Properties props = new Properties();
4
    props.put("serializer.class", "kafka.serializer.StringEncoder");
5
    props.put("metadata.broker.list", "server:9092,server02:9092,server03:9092");
6
    props.put("request.required.acks", "1");
7
    props.put("partitioner.class", "kafka.producer.DefaultPartitioner");
8
9
    Producer<String, String> producer = new Producer<String, String>(new ProducerConfig(props));
10
    //每隔0.1秒發送一條訂單信息
11
    for (int messageNo = 1; messageNo < 10000; messageNo++) {
12
        producer.send(new KeyedMessage<String, String>(TOPIC, messageNo + " ",new OrderInfo().random() ));
13
        try {
14
            Thread.sleep(100);
15
        } catch (InterruptedException e) {
16
            e.printStackTrace();
17
        }
18
    }
19
}
20

②Kafka2StormTopologyMain
1
public static void main(String[] args) throws Exception{
2
    TopologyBuilder topologyBuilder = new TopologyBuilder();
3
    //設定Spout爲KafkaSpout
4
    topologyBuilder.setSpout("kafkaSpout",new KafkaSpout(new SpoutConfig(new ZkHosts("server:2181,server02:2181,server03:2181"),
5
              "ccc","/myKafka","kafkaSpout")),1);
6
    //設定Bolt,該Bolt完成到redis的數據存儲
7
    topologyBuilder.setBolt("mybolt1",new ParserOrderMqBolt(),1).shuffleGrouping("kafkaSpout");
8
9
    Config config = new Config();
10
    config.setNumWorkers(1);
11
12
   //3、提交任務 -----兩種模式 本地模式和集羣模式
13
    if (args.length>0) {
14
    StormSubmitter.submitTopology(args[0], config, topologyBuilder.createTopology());
15
    }else {
16
    LocalCluster localCluster = new LocalCluster();
17
    localCluster.submitTopology("storm2kafka", config, topologyBuilder.createTopology());
18
    }
19
}

③Bolt:緩存到Redis
1
        JedisPoolConfig config = new JedisPoolConfig();
2
3
        config.setMaxIdle(5);
4
        config.setMaxTotal(1000 * 100);
5
        config.setMaxWaitMillis(30);
6
        config.setTestOnBorrow(true);
7
        config.setTestOnReturn(true);
8
        /**
9
         *如果你遇到 java.net.SocketTimeoutException: Read timed out exception的異常信息
10
         *請嘗試在構造JedisPool的時候設置自己的超時值. JedisPool默認的超時時間是2秒(單位毫秒)
11
         */
12
        pool = new JedisPool(config, "127.0.0.1", 6379);  //設置JedisPool,獲得JedisPool對象
13
14
15
  public void execute(Tuple input) {
16
      
17
        //獲取發送過來的數據,是一個json
18
         String string = new String((byte[]) input.getValue(0));
19
         //解析json
20
         OrderInfo orderInfo = (OrderInfo) new Gson().fromJson(string, OrderInfo.class);
21
        
22
         //獲得jedis實例
23
         Jedis jedis = pool.getResource();
24
      
25
         String bid = getBubyProductId(orderInfo.getProductId(), "c");//獲取產品ID,
26
         jedis.incrBy(bid + "total Amount", orderInfo.getProductPrice());//將本商品ID的銷售額累加!在原來的value基礎上增加新訂單的銷售額
27
28
         String bid1 = getBubyProductId(orderInfo.getProductId(), "b");
29
         jedis.incrBy(bid1 + "total Amount", orderInfo.getProductPrice());
30
31
         String bid2 = getBubyProductId(orderInfo.getProductId(), "s");
32
         jedis.incrBy(bid2 + "total Amount", orderInfo.getProductPrice());
33
34
         String bid3 = getBubyProductId(orderInfo.getProductId(), "p");
35
         jedis.incrBy(bid3 + "_total Amount", orderInfo.getProductPrice());
36
37
         jedis.close();
38
  }

在本地執行redis-server,然後啓動Kafka生產者,啓動Topology將信息加載到本地的Redis中。
然後打開redis-cli ,執行 get id+total Amount 獲得該商品的銷售額。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章