リサーチニュースミドルウェア
メッセージミドルウェア-kafka(II)
ビルドへの環境
ステップ1:ダウンロードカフカ、ダウンロードをクリックして、最新バージョンを解凍します。
tar -xzf kafka_2.9.2-0.8.1.1.tgz
cd kafka_2.9.2-0.8.1.1
ステップ2:サービスの開始
カフカは、まずスタートZookperの、単にZookkeeper以下のサービスの単一のインスタンスを有効、飼育係を使用しています。あなたが始めることができるようにするには、コマンドコンソールのアドオン&シンボルの終了後に残すことができます。
bin/zookeeper-server-start.sh config/zookeeper.properties &
スタートカフカ:
bin/kafka-server-start.sh config/server.properties
ステップ3:トピックを作成します
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
トピックを作成するには、listコマンドで表示
bin/kafka-topics.sh --list --zookeeper localhost:2181 test
ステップ4:メッセージを送信する。
カフカは、単純なコマンドライン・プロデューサを使用して、またはサーバへの標準入力および送信メッセージからファイルから読み取ります。メッセージを送信するには、各コマンドをデフォルト。
いくつかの実行プロデューサーとコンソールメッセージを出力し、これらのメッセージは、サーバーに送信されます
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
ステップ5:スタートコンシューマー
ライン消費者がメッセージを読み、標準出力にすることができます
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
結果を達成する:
コマンドライン端末で実行消費者は、他の端末の実行プロデューサコマンドラインは、入力メッセージを端末とすることができる、他の端末は、メッセージを読み取り。
ステップ6:ビルドはより多くのブローカクラスタの
今のクラスタからなる3つのブローカーで始まる、これらはまた、このマシン上のブローカーノードである:
まず、各ノードの書込み設定ファイル:
cp config/server.properties config/server-1.properties
cp config/server.properties config/server-2.properties
次のパラメータでのファイルの新しいコピーを追加します。
config/server-1.properties:
broker.id=1
port=9093
log.dir=/tmp/kafka-logs-1
config/server-2.properties:
broker.id=2
port=9094
log.dir=/tmp/kafka-logs-2
同じマシン上で、別のポートを開発し、上書きされたデータを防ぐために、ログファイルをする必要があるため、クラスタ内のノードをマークするだけbroker.id。
飼育係はすでに開始している可能性があり、ノードは、他の2つのノードは今開始します
bin/kafka-server-start.sh config/server-1.properties &
bin/kafka-server-start.sh config/server-2.properties &
トピックを作成3つのコピーがあります。
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic
今、私たちはどのように各ノードそれについての情報を知るために、クラスタを設定しましたか?ファイル名を指定して実行「は、それに対してコマンド」のトピックについて説明します」。
bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic
//效果
Topic:my-replicated-topic PartitionCount:1 ReplicationFactor:3 Configs:
Topic: my-replicated-topic Partition: 0 Leader: 1 Replicas: 1,2,0 Isr: 1,2,0
下面解释一下这些输出。第一行是对所有分区的一个描述,然后每个分区都会对应一行,因为我们只有一个分区所以下面就只加了一行。
eader:负责处理消息的读和写,leader是从所有节点中随机选择的.
replicas:列出了所有的副本节点,不管节点是否在服务中.
isr:是正在服务中的节点.
カフカテストフォールトトレランス機構(省略)
ビルドにカフカの開発環境
Mavenのプロジェクトで、のpom.xmlに依存関係を追加します
<dependency>
<groupId> org.apache.kafka</groupId >
<artifactId> kafka_2.10</artifactId >
<version> 0.8.0</ version>
</dependency>
設定プログラムは、
最初の接続の様々な構成インターフェイスコンフィギュレーションファイルの役割として作用カフカパラメータ:
kage com.sohu.kafkademon;
public interface KafkaProperties
{
final static String zkConnect = "10.22.10.139:2181";
final static String groupId = "group1";
final static String topic = "topic1";
final static String kafkaServerURL = "10.22.10.139";
final static int kafkaServerPort = 9092;
final static int kafkaProducerBufferSize = 64 * 1024;
final static int connectionTimeOut = 20000;
final static int reconnectInterval = 10000;
final static String topic2 = "topic2";
final static String topic3 = "topic3";
final static String clientId = "SimpleConsumerDemoClient";
}
プロデューサー
import java.util.Properties;
import kafka.producer.KeyedMessage;
import kafka.producer.ProducerConfig;
/**
* @author leicui [email protected]
*/
public class KafkaProducer extends Thread
{
private final kafka.javaapi.producer.Producer<Integer, String> producer;
private final String topic;
private final Properties props = new Properties();
public KafkaProducer(String topic)
{
props.put("serializer.class", "kafka.serializer.StringEncoder");
props.put("metadata.broker.list", "10.22.10.139:9092");
producer = new kafka.javaapi.producer.Producer<Integer, String>(new ProducerConfig(props));
this.topic = topic;
}
@Override
public void run() {
int messageNo = 1;
while (true)
{
String messageStr = new String("Message_" + messageNo);
System.out.println("Send:" + messageStr);
producer.send(new KeyedMessage<Integer, String>(topic, messageStr));
messageNo++;
try {
sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
消費者
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import kafka.consumer.ConsumerConfig;
import kafka.consumer.ConsumerIterator;
import kafka.consumer.KafkaStream;
import kafka.javaapi.consumer.ConsumerConnector;
/**
* @author leicui [email protected]
*/
public class KafkaConsumer extends Thread
{
private final ConsumerConnector consumer;
private final String topic;
public KafkaConsumer(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", "40000");
props.put("zookeeper.sync.time.ms", "200");
props.put("auto.commit.interval.ms", "1000");
return new ConsumerConfig(props);
}
@Override
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("receive:" + new String(it.next().message()));
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
シンプル送受信が
次のプログラムを実行して、あなたは、単に受信したメッセージを送ることができます。
public class KafkaConsumerProducerDemo
{
public static void main(String[] args)
{
KafkaProducer producerThread = new KafkaProducer(KafkaProperties.topic);
producerThread.start();
KafkaConsumer consumerThread = new KafkaConsumer(KafkaProperties.topic);
consumerThread.start();
}
}
出典ます。https://blog.csdn.net/wangzhanzheng/article/details/79720029