kafka精炼之搭建Kafka开发环境(3)

三、搭建Kafka开发环境

我们搭建了kafka的服务器,并可以使用Kafka的命令行工具创建topic,发送和接收消息。下面我们来搭建kafka的开发环境。
添加依赖

搭建开发环境需要引入kafka的jar包,一种方式是将Kafka安装包中lib下的jar包加入到项目的classpath中,这种比较简单了。不过我们使用另一种更加流行的方式:使用maven管理jar包依赖。
创建好maven项目后,在pom.xml中添加以下依赖:
 

  1. <dependency>
  2.         <groupId> org.apache.kafka</groupId >
  3.         <artifactId> kafka_2.10</artifactId >
  4.         <version> 0.8.0</ version>
  5. </dependency>

复制代码


添加依赖后你会发现有两个jar包的依赖找不到。没关系我都帮你想好了,点击这里下载这两个jar包,解压后你有两种选择,第一种是使用mvn的install命令将jar包安装到本地仓库,另一种是直接将解压后的文件夹拷贝到mvn本地仓库的com文件夹下,比如我的本地仓库是d:\mvn,完成后我的目录结构是这样的:

<ignore_js_op> 


配置程序

首先是一个充当配置文件作用的接口,配置了Kafka的各种连接参数:

  1. package com.sohu.kafkademon;
  2. public interface KafkaProperties
  3. {
  4.     final static String zkConnect = "10.22.10.139:2181";
  5.     final static String groupId = "group1";
  6.     final static String topic = "topic1";
  7.     final static String kafkaServerURL = "10.22.10.139";
  8.     final static int kafkaServerPort = 9092;
  9.     final static int kafkaProducerBufferSize = 64 * 1024;
  10.     final static int connectionTimeOut = 20000;
  11.     final static int reconnectInterval = 10000;
  12.     final static String topic2 = "topic2";
  13.     final static String topic3 = "topic3";
  14.     final static String clientId = "SimpleConsumerDemoClient";
  15. }

复制代码


producer
 

  1. package com.sohu.kafkademon;
  2. import java.util.Properties;
  3. import kafka.producer.KeyedMessage;
  4. import kafka.producer.ProducerConfig;
  5. /**
  6. * @author leicui bourne_cui@163.com
  7. */
  8. public class KafkaProducer extends Thread
  9. {
  10.     private final kafka.javaapi.producer.Producer<Integer, String> producer;
  11.     private final String topic;
  12.     private final Properties props = new Properties();
  13.     public KafkaProducer(String topic)
  14.     {
  15.         props.put("serializer.class", "kafka.serializer.StringEncoder");
  16.         props.put("metadata.broker.list", "10.22.10.139:9092");
  17.         producer = new kafka.javaapi.producer.Producer<Integer, String>(new ProducerConfig(props));
  18.         this.topic = topic;
  19.     }
  20.     @Override
  21.     public void run() {
  22.         int messageNo = 1;
  23.         while (true)
  24.         {
  25.             String messageStr = new String("Message_" + messageNo);
  26.             System.out.println("Send:" + messageStr);
  27.             producer.send(new KeyedMessage<Integer, String>(topic, messageStr));
  28.             messageNo++;
  29.             try {
  30.                 sleep(3000);
  31.             } catch (InterruptedException e) {
  32.                 // TODO Auto-generated catch block
  33.                 e.printStackTrace();
  34.             }
  35.         }
  36.     }
  37. }

复制代码


consumer

  1. package com.sohu.kafkademon;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import java.util.Map;
  5. import java.util.Properties;
  6. import kafka.consumer.ConsumerConfig;
  7. import kafka.consumer.ConsumerIterator;
  8. import kafka.consumer.KafkaStream;
  9. import kafka.javaapi.consumer.ConsumerConnector;
  10. /**
  11. * @author leicui bourne_cui@163.com
  12. */
  13. public class KafkaConsumer extends Thread
  14. {
  15.     private final ConsumerConnector consumer;
  16.     private final String topic;
  17.     public KafkaConsumer(String topic)
  18.     {
  19.         consumer = kafka.consumer.Consumer.createJavaConsumerConnector(
  20.                 createConsumerConfig());
  21.         this.topic = topic;
  22.     }
  23.     private static ConsumerConfig createConsumerConfig()
  24.     {
  25.         Properties props = new Properties();
  26.         props.put("zookeeper.connect", KafkaProperties.zkConnect);
  27.         props.put("group.id", KafkaProperties.groupId);
  28.         props.put("zookeeper.session.timeout.ms", "40000");
  29.         props.put("zookeeper.sync.time.ms", "200");
  30.         props.put("auto.commit.interval.ms", "1000");
  31.         return new ConsumerConfig(props);
  32.     }
  33.     @Override
  34.     public void run() {
  35.         Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
  36.         topicCountMap.put(topic, new Integer(1));
  37.         Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumer.createMessageStreams(topicCountMap);
  38.         KafkaStream<byte[], byte[]> stream = consumerMap.get(topic).get(0);
  39.         ConsumerIterator<byte[], byte[]> it = stream.iterator();
  40.         while (it.hasNext()) {
  41.             System.out.println("receive:" + new String(it.next().message()));
  42.             try {
  43.                 sleep(3000);
  44.             } catch (InterruptedException e) {
  45.                 e.printStackTrace();
  46.             }
  47.         }
  48.     }
  49. }

复制代码


简单的发送接收

运行下面这个程序,就可以进行简单的发送接收消息了:

  1. package com.sohu.kafkademon;
  2. /**
  3. * @author leicui bourne_cui@163.com
  4. */
  5. public class KafkaConsumerProducerDemo
  6. {
  7.     public static void main(String[] args)
  8.     {
  9.         KafkaProducer producerThread = new KafkaProducer(KafkaProperties.topic);
  10.         producerThread.start();
  11.         KafkaConsumer consumerThread = new KafkaConsumer(KafkaProperties.topic);
  12.         consumerThread.start();
  13.     }
  14. }

复制代码


高级别的consumer

下面是比较负载的发送接收的程序:

  1. package com.sohu.kafkademon;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import java.util.Map;
  5. import java.util.Properties;
  6. import kafka.consumer.ConsumerConfig;
  7. import kafka.consumer.ConsumerIterator;
  8. import kafka.consumer.KafkaStream;
  9. import kafka.javaapi.consumer.ConsumerConnector;
  10. /**
  11. * @author leicui bourne_cui@163.com
  12. */
  13. public class KafkaConsumer extends Thread
  14. {
  15.     private final ConsumerConnector consumer;
  16.     private final String topic;
  17.     public KafkaConsumer(String topic)
  18.     {
  19.         consumer = kafka.consumer.Consumer.createJavaConsumerConnector(
  20.                 createConsumerConfig());
  21.         this.topic = topic;
  22.     }
  23.     private static ConsumerConfig createConsumerConfig()
  24.     {
  25.         Properties props = new Properties();
  26.         props.put("zookeeper.connect", KafkaProperties.zkConnect);
  27.         props.put("group.id", KafkaProperties.groupId);
  28.         props.put("zookeeper.session.timeout.ms", "40000");
  29.         props.put("zookeeper.sync.time.ms", "200");
  30.         props.put("auto.commit.interval.ms", "1000");
  31.         return new ConsumerConfig(props);
  32.     }
  33.     @Override
  34.     public void run() {
  35.         Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
  36.         topicCountMap.put(topic, new Integer(1));
  37.         Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumer.createMessageStreams(topicCountMap);
  38.         KafkaStream<byte[], byte[]> stream = consumerMap.get(topic).get(0);
  39.         ConsumerIterator<byte[], byte[]> it = stream.iterator();
  40.         while (it.hasNext()) {
  41.             System.out.println("receive:" + new String(it.next().message()));
  42.             try {
  43.                 sleep(3000);
  44.             } catch (InterruptedException e) {
  45.                 e.printStackTrace();
  46.             }
  47.         }
  48.     }
  49. }

复制代码

### 图像处理Transformer 模型的使用与实现 Transformer 是一种基于自注意力机制(Self-Attention Mechanism)的神经网络架构,最初被设计用于自然语言处理 (NLP)[^3]。然而,近年来其在计算机视觉领域的应用也取得了显著进展。以下是关于如何在图像处理任务中使用和实现 Transformer 的详细介绍。 #### 1. Transformer图像处理中的应用场景 Transformer 已经成功应用于多种图像处理任务,包括但不限于图像分类、目标检测、语义分割以及图像生成等[^2]。这些任务的核心在于利用 Transformer 对全局上下文关系的强大建模能力,从而提升模型性能。 #### 2. 基本原理 Transformer 的核心组件是多头自注意力机制(Multi-head Self-Attention),它可以捕捉输入数据之间的长期依赖关系。在图像处理场景下,通常会先将图像划分为固定大小的小块(Patches),并将其展平为一维向量序列作为 Transformer 输入[^4]。这种操作类似于 NLP 中的词嵌入(Word Embedding)。 为了进一步增强表征学习效果,在实际应用过程中还会引入位置编码(Positional Encoding)。这是因为原始图片经过切片后丢失了空间顺序信息,而位置编码能够帮助模型重新恢复这一特性[^1]。 #### 3. PyTorch 实现示例 下面是一个简单版本的基于 PyTorch 构建的 Vision Transformer(ViT): ```python import torch from torch import nn, optim class PatchEmbedding(nn.Module): def __init__(self, img_size=224, patch_size=16, embed_dim=768): super().__init__() self.proj = nn.Conv2d(3, embed_dim, kernel_size=patch_size, stride=patch_size) def forward(self, x): x = self.proj(x).flatten(2).transpose(1, 2) return x class MultiHeadAttention(nn.Module): def __init__(self, dim, num_heads=8): super(MultiHeadAttention, self).__init__() assert dim % num_heads == 0 self.num_heads = num_heads head_dim = dim // num_heads self.scale = head_dim ** -0.5 self.qkv = nn.Linear(dim, dim * 3, bias=False) self.attn_drop = nn.Dropout(0.) self.proj = nn.Linear(dim, dim) def forward(self, x): B, N, C = x.shape qkv = self.qkv(x).reshape(B, N, 3, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4) q, k, v = qkv.unbind(0) attn = (q @ k.transpose(-2, -1)) * self.scale attn = attn.softmax(dim=-1) attn = self.attn_drop(attn) x = (attn @ v).transpose(1, 2).reshape(B, N, C) x = self.proj(x) return x class ViTBlock(nn.Module): def __init__(self, dim, num_heads, mlp_ratio=4., drop_rate=0.): super(ViTBlock, self).__init__() self.norm1 = nn.LayerNorm(dim) self.msa = MultiHeadAttention(dim, num_heads=num_heads) self.drop_path = DropPath(drop_rate) if drop_rate > 0. else nn.Identity() self.norm2 = nn.LayerNorm(dim) hidden_features = int(dim * mlp_ratio) self.mlp = Mlp(in_features=dim, hidden_features=hidden_features, act_layer=nn.GELU, drop=drop_rate) def forward(self, x): x = x + self.drop_path(self.msa(self.norm1(x))) x = x + self.drop_path(self.mlp(self.norm2(x))) return x def build_vit(img_size=224, patch_size=16, embed_dim=768, depth=12, num_heads=12, class_num=1000): model = nn.Sequential( PatchEmbedding(img_size=img_size, patch_size=patch_size, embed_dim=embed_dim), *[ViTBlock(embed_dim, num_heads=num_heads) for _ in range(depth)], nn.LayerNorm(embed_dim), nn.Linear(embed_dim, class_num)) return model model = build_vit() print(model(torch.randn((1, 3, 224, 224))).shape # 输出形状应为 [batch_size, class_num] ``` 上述代码展示了如何构建一个基础版的 Vision Transformer 结构,并通过 `build_vit` 函数创建了一个完整的模型实例。 --- #### 4. 总结 Transformer 不仅限于文本领域,在图像处理方面同样表现出巨大潜力。通过合理的设计与优化策略,可以有效解决各类复杂的视觉问题。未来随着技术进步及相关研究深入,相信会有更多创新成果涌现出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值