Kafka+Storm+HBase项目Demo(4)--Kafka使用

第一个需求是按地区实时计算销售额,并进行3D柱图实时展示结果,含周同比。图表的数据3s自动更新。
期望效果
这里写图片描述
项目的架构:
这里写图片描述
从Kafka开始。这里介绍Kafka一些概念。
Kafka is a distributed,partitioned,replicated commit logservice。它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。kafka对消息保存时根据Topic进行归类,发送消息者成为Producer,消息接受者成为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)成为broker。无论是kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性集群保存一些meta信息。

Topics/logs
一个Topic可以认为是一类消息,每个topic将被分成多个partition(区),每个partition在存储层面是append log文件。任何发布到此partition的消息都会被直接追加到log文件的尾部,每条消息在文件中的位置称为offset(偏移量),offset为一个long型数字,它是唯一标记一条消息。它唯一的标记一条消息。kafka并没有提供其他额外的索引机制来存储offset,因为在kafka中几乎不允许对消息进行“随机读写”。

Producers
Producer将消息发布到指定的Topic中,同时Producer也能决定将此消息归属于哪个partition;比如基于”round-robin”方式或者通过其他的一些算法等.

Consumers
本质上kafka只支持Topic.每个consumer属于一个consumer group;反过来说,每个group中可以有多个consumer.发送到Topic的消息,只会被订阅此Topic的每个group中的一个consumer消费.
如果所有的consumer都具有相同的group,这种情况和queue模式很像;消息将会在consumers之间负载均衡.
如果所有的consumer都具有不同的group,那这就是”发布-订阅”;消息将会广播给所有的消费者.
在kafka中,一个partition中的消息只会被group中的一个consumer消费;每个group中consumer消息消费互相独立;我们可以认为一个group是一个”订阅”者,一个Topic中的每个partions,只会被一个”订阅者”中的一个consumer消费,不过一个consumer可以消费多个partitions中的消息.kafka只能保证一个partition中的消息被某个consumer消费时,消息是顺序的.事实上,从Topic角度来说,消息仍不是有序的.
kafka的设计原理决定,对于一个topic,同一个group中不能有多于partitions个数的consumer同时消费,否则将意味着某些consumer将无法得到消息.

首先,我们建立一个Kafka 配置类,生产者消费者共用

package kafka.productor;

public interface KafkaProperties
{
  final static String zkConnect = "192.168.1.107:2181,192.168.1.108:2181";
  final static String broker_list = "192.168.1.107:9092,192.168.1.108:9092" ;
  final static  String groupId = "group1";
  final static String topic = "track";
  final static String Order_topic = "track";
}

现在需要生产者生成测试数据,就是一些关于各个地区销售额的随机数

package kafka.productor;

import java.util.Properties;
import java.util.Random;

import cloudy.tools.DateFmt;

import backtype.storm.utils.Utils;
import kafka.producer.KeyedMessage;
import kafka.producer.ProducerConfig;

public class Producer extends Thread {
    private final kafka.javaapi.producer.Producer<Integer, String> producer;
    private final String topic;
    private final Properties props = new Properties();

    public Producer(String topic) {
        props.put("serializer.class", "kafka.serializer.StringEncoder");// 字符串消息
        props.put("metadata.broker.list",KafkaProperties.broker_list);
        producer = new kafka.javaapi.producer.Producer<Integer, String>(
                new ProducerConfig(props));
        this.topic = topic;
    }

    public void run() {
        // order_id,order_amt,create_time,area_id
        Random random = new Random();
        String[] order_amt = { "10.10", "20.10", "50.2","60.0", "80.1" };
        String[] area_id = { "1","2","3","4","5" };

        int i =0 ;
        while(true) {
            i ++ ;
            String messageStr = i+"\t"+order_amt[random.nextInt(5)]+"\t"+DateFmt.getCountDate(null, DateFmt.date_long)+"\t"+area_id[random.nextInt(5)] ;
            System.out.println("product:"+messageStr);
            producer.send(new KeyedMessage<Integer, String>(topic, messageStr));
            Utils.sleep(1000) ;
        }

    }

    public static void main(String[] args) {
        Producer producerThread = new Producer(KafkaProperties.Order_topic);
        producerThread.start();
    }
}

这里需要测试数据能否生产出来,所以需要做一个消费者来test。

package kafka.consumers;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

import kafka.consumer.ConsumerConfig;
import kafka.consumer.ConsumerIterator;
import kafka.consumer.KafkaStream;
import kafka.javaapi.consumer.ConsumerConnector;
import kafka.productor.KafkaProperties;

public class OrderConsumer extends Thread {
    private final ConsumerConnector consumer;
    private final String topic;

    private Queue<String> queue = new ConcurrentLinkedQueue<String>() ;

    public OrderConsumer(String topic) {
        consumer = kafka.consumer.Consumer
                .createJavaConsumerConnector(createConsumerConfig());
        this.topic = topic;
    }

    private static ConsumerConfig createConsumerConfig() {
        Properties props = new Properties();
        props.put("zookeeper.connect", KafkaProperties.zkConnect);
        props.put("group.id", KafkaProperties.groupId);
        props.put("zookeeper.session.timeout.ms", "4000");
        props.put("zookeeper.sync.time.ms", "2000");
        props.put("auto.commit.interval.ms", "1000");//

        return new ConsumerConfig(props);

    }

    public void run() {
        Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
        topicCountMap.put(topic, new Integer(1));
        Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumer
                .createMessageStreams(topicCountMap);
        KafkaStream<byte[], byte[]> stream = consumerMap.get(topic).get(0);
        ConsumerIterator<byte[], byte[]> it = stream.iterator();

        while (it.hasNext()){
            //逻辑处理
            System.out.println("consumer:"+new String(it.next().message()));
            queue.add(new String(it.next().message())) ;
        }

    }

    public Queue<String> getQueue()
    {
        return queue ;
    }

    public static void main(String[] args) {
        OrderConsumer consumerThread = new OrderConsumer(KafkaProperties.Order_topic);
        consumerThread.start();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: flume是一个数据采集工具,可以将数据从不同的数据源采集到kafka中。kafka是一个分布式消息队列,可以将数据进行缓存和分发。sparkstream是一个流处理框架,可以对实时数据进行处理和分析。hbase是一个分布式的NoSQL数据库,可以存储海量的结构化数据。mysql是一个关系型数据库,可以存储结构化数据。hive是一个数据仓库工具,可以将结构化数据进行查询和分析。 在这个架构中,flume将数据采集到kafka中,sparkstream从kafka中读取数据进行实时处理和分析,处理后的数据可以存储到hbase中。同时,mysql可以作为一个数据源,将数据导入到hive中进行分析。hbase和hive之间可以通过HBaseStorageHandler实现映射,将hbase中的数据映射到hive中进行查询和分析。 ### 回答2: Flume、Kafka、Spark Streaming、HBase、MySQL和Hive都是大数据处理和分析中常见的工具和技术。这些工具和技术可以协同工作以实现更高效、更精确的数据分析和处理。下面将从多角度分析这些工具之间的映射关系。 1. 数据采集和传输 Flume和Kafka是主要的数据采集和传输工具。Flume通常用于将数据从不同来源采集到HDFS或HBase等目标位置。Kafka则更适用于构建大规模的分布式消息流平台。Kafka可以接收来自多个来源的数据,然后在进行处理之前将其传输到队列中。这些工具都可以与HBase和MySQL等数据存储系统合作使用。 2. 实时数据处理 Spark Streaming则是实时数据处理和分析的主要技术。Spark Streaming可以将Kafka、Flume和其他来源的数据进行实时处理和分析,可以将结果直接存储到HBase或MySQL中。 3. 数据存储 MySQL和Hive是两个不同的SQL引擎。MySQL可以作为一种关系型数据库管理系统(RDBMS),可以在大多数情况下有效地存储结构化数据。Hive则可以将数据存储在Hadoop集群的HDFS中,并生成一个结构化查询语言(SQL)接口,允许开发人员和数据科学家方便地访问Hadoop中的数据。因此,Hive更适合非结构化或半结构化数据存储。 HBase则可以作为一个高性能、分布式的NoSQL数据库,专门用于在Hadoop集群上存储大数据和实时数据。因此,HBase比MySQL更适合存储半结构化和非结构化数据。 4. 数据映射 Hadoop和Hive之间的映射是首选的方式之一。Hive提供了一个SQL界面,允许数据科学家和开发人员访问和处理存储在Hadoop集群上的数据。因此,在Hive中创建的表会自动映射到Hadoop集群上的HDFS文件中。 HBase则局限于存储半结构化和非结构化数据,可以使用Hive和Apache Phoenix来更方便地访问和操作HBase数据。Apache Phoenix提供了一个SQL界面,允许开发人员和数据科学家使用标准SQL来访问和操作HBase数据。 因此,Flume、Kafka、Spark Streaming、HBase、MySQL和Hive之间的映射关系可以根据实际需求进行不同的组合。例如,Flume和Kafka可以协同工作,将数据传输到Hadoop集群上的HDFS或HBase中进行存储。Spark Streaming可以实时处理来自Hadoop集群上的HDFS、HBaseKafka的数据。MySQL和Hive可以作为SQL引擎,提供方便的接口用于访问Hadoop集群的数据。HBase作为一个高性能、分布式的NoSQL数据库,可以在Hadoop集群上有效地处理半结构化和非结构化数据。 ### 回答3: flume、kafka、sparkstream、hbase、mysql和hive是在大数据生态系统中非常重要和流行的一些工具和技术。它们都具有独特的功能和用途,并广泛用于大规模数据处理和分析。 在这些工具和技术之间建立映射是非常重要的,因为它们可以协同工作并发挥其最大潜力。尤其是在大规模数据处理和分析方面,正确的工具和技术映射可以帮助我们更好地管理和处理海量数据。 flume是一个日志采集和处理系统,可以从数据源收集数据并将其传输到目标位置,如hbase、hive或Kafka。flume和kafka之间的映射通常用于处理数据流,其中flume作为生产者将日志数据发送到kafka,然后消费者可以使用sparkstream或其他工具将这些数据进行处理和分析。 kafka是一个分布式流处理平台,它可以处理大量数据流并实现实时数据处理。kafkahbase之间的映射通常是将kafka作为数据来源,然后将数据写入hbase进行存储和管理。此外,可以使用hive或其他工具对hbase中存储的数据进行查询和分析。 sparkstream是一个实时流处理引擎,它可以处理来自kafka、flume等数据源的实时数据流。与hbase和mysql之间的映射通常是,sparkstream可以从这些存储系统中读取数据并对其进行处理和分析,并将结果存储回这些存储系统中。 hbase是一个分布式NoSQL数据库,它可以存储大量非结构化和半结构化数据。与hive之间的映射通常是,hive可以使用hbase表中存储的数据进行查询和分析,而hbase则提供了一个高可靠性的数据存储和管理系统。 mysql是一个关系型数据库管理系统,常用于较小的数据集合。(In 300 words) 总之,这些工具和技术都是互相关联的,在大数据生态系统中扮演着重要角色。正确的映射可以使它们协同工作,并处理大规模数据集的难题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值