記事ディレクトリ
I.概要
1.1カフカストリーム
カフカストリーム。ApacheKafkaオープンソースプロジェクトの不可欠な部分。強力で使いやすいライブラリです。これは、Kafka上で高度に分散されたスケーラブルで障害耐性のあるアプリケーションを構築するために使用されます。
1.2カフカストリームの特徴
1.強力
- 高いスケーラビリティ、柔軟性、耐障害性
2.軽量
- 専用クラスターは必要ありません
- フレームワークではなくライブラリ
3.完全に統合
- Kafka 0.10.0バージョンと100%互換性があります
- 既存のアプリケーションに簡単に統合できます
4.リアルタイム
- ミリ秒の遅延
- マイクロバッチではありません
- ウィンドウは順不同のデータを許可します
- 遅延データを許可する
1.3なぜKafkaStreamsが必要なのですか
すでに多くのストリーミングシステムがありますが、最もよく知られ、最も使用されているオープンソースストリーミングシステムは、SparkStreamingとApacheStormです。Apache Stormは長年にわたって開発されており、幅広いアプリケーションがあります。レコードレベルの処理機能を提供し、現在SQL onStreamをサポートしています。SparkStreamingはApacheSparkに基づいており、グラフコンピューティングやSQL処理と簡単に統合できます。強力な機能を備えており、他のSparkアプリケーション開発に精通しているユーザーにとってはしきい値が低くなっています。さらに、ClouderaやHortonworksなどの現在の主流のHadoopディストリビューションは、ApacheStormとApacheSparkを統合しているため、展開が容易になります。
ApacheSparkとApacheStormには非常に多くの利点があるのに、なぜKafkaStreamが必要なのですか。
主な理由は以下のとおりです。
まず、SparkとStormはどちらもストリーム処理フレームワークであり、KafkaStreamsはKafkaベースのストリーム処理ライブラリを提供します。フレームワークでは、開発者がフレームワークが呼び出す特定の方法で論理パーツを開発する必要があります。開発者がフレームワークの特定の操作モードを理解することは困難であるため、デバッグのコストが高くなり、使用が制限されます。Kafka Streamsは、ストリーム処理ライブラリとして、開発者が呼び出す特定のクラスを直接提供します。アプリケーション全体の実行モードは、主に開発者によって制御されるため、使用とデバッグに便利です。
次に、ClouderaとHortonworksはStormとSparkの展開を容易にしますが、これらのフレームワークの展開は依然として比較的複雑です。クラスライブラリとして、Kafka Streamsはアプリケーションに簡単に組み込むことができ、基本的にアプリケーションのパッケージ化と展開の要件はありません。
第三に、ストリーミングシステムに関する限り、Kafkaは基本的にデータソースとしてサポートされています。たとえば、Stormには特別なkafka-spoutがあり、Sparkには特別なspark-streaming-kafkaモジュールもあります。実際、Kafkaは基本的に主流のストリーミングシステムの標準データソースです。言い換えれば、Kafkaはほとんどのストリーミングシステムに導入されており、現時点ではKafkaStreamsの使用コストは非常に低くなっています。
第4に、StormまたはSpark Streamingを使用する場合、StormのスーパーバイザーやYARNのノードマネージャー上のSparkなど、フレームワーク自体のプロセス用にリソースを予約する必要があります。アプリケーションインスタンスの場合でも、フレームワーク自体が一部のリソースを消費します。たとえば、Spark Streamingは、シャッフルとストレージ用にメモリを予約する必要があります。しかし、クラスライブラリとしてのKafkaはシステムリソースを占有しません。
第5に、Kafka自体がデータの永続性を提供するため、Kafka Streamsはローリング展開、ローリングアップグレード、および再計算機能を提供します。
第6に、Kafka Consumer Rebalanceメカニズムにより、KafkaStreamは並列処理をオンラインで動的に調整できます。
2、KafkaStreamsデータクリーニングケース
0)需要
">>>"で始まる単語のリアルタイム処理。たとえば、「aaa >>> bbb」と入力すると、最終的に「bbb」に処理されます。
1)需要分析
2)ケースプラクティス
- プロジェクトを作成し、jarパッケージを追加します
- メインクラスを作成する
package com.atguigu.kafka.stream;
import java.util.Properties;
import org.apache.kafka.streams.KafkaStreams;
import org.apache.kafka.streams.StreamsConfig;
import org.apache.kafka.streams.processor.Processor;
import org.apache.kafka.streams.processor.ProcessorSupplier;
import org.apache.kafka.streams.processor.TopologyBuilder;
public class Application {
public static void main(String[] args) {
// 定义输入的
topic String from = "first";
// 定义输出的
topic String to = "second";
// 设置参数
Properties settings = new Properties();
settings.put(StreamsConfig.APPLICATION_ID_CONFIG, "logFilter");
settings.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "hadoop102:9092");
StreamsConfig config = new StreamsConfig(settings);
// 构建拓扑
TopologyBuilder builder = new TopologyBuilder();
builder.addSource("SOURCE", from)
.addProcessor("PROCESS", new ProcessorSupplier<byte[], byte[]>() {
@Override
public Processor<byte[], byte[]> get() {
// 具体分析处理
return new LogProcessor();
}
}, "SOURCE")
.addSink("SINK", to, "PROCESS");
// 创建 kafka streams
KafkaStreams streams = new KafkaStreams(builder, config);
streams.start();
}
}
- 特定のビジネス処理
package com.atguigu.kafka.stream;
import org.apache.kafka.streams.processor.Processor;
import org.apache.kafka.streams.processor.ProcessorContext;
public class LogProcessor implements Processor<byte[], byte[]> {
private ProcessorContext context;
@Override
public void init(ProcessorContext context) {
this.context = context;
}
@Override
public void process(byte[] key, byte[] value) {
String input = new String(value);
// 如果包含“>>>”则只保留该标记后面的内容
if (input.contains(">>>")) {
input = input.split(">>>")[1].trim();
// 输出到下一个topic
context.forward("logProcessor".getBytes(), input.getBytes());
}else{
context.forward("logProcessor".getBytes(), input.getBytes());
}
}
@Override
public void punctuate(long timestamp) {
}
@Override
public void close() {
}
}
(4)プログラムを実行する
(5)hadoop104でプロデューサーを起動します
[root@hadoop104 kafka]$ bin/kafka-console-producer.sh \
--broker-list hadoop102:9092 --topic first
>hello>>>world
>>aaa>>>bbb
>>hahaha
(6)hadoop103で消費者を開始します
[root@hadoop103 kafka]$ bin/kafka-console-consumer.sh \
--zookeeper hadoop102:2181 --from-beginning --topic second
world
bbb
hahaha
3、まとめ
- Kafka Streamsの並列モデルは、Kafkaのパーティショニングメカニズムとリバランスメカニズムに完全に基づいており、並列処理のオンライン動的調整を実現します。
- 同じタスクにサブトポロジのすべてのプロセッサが含まれているため、すべての処理ロジックが同じスレッドで完了し、不要なネットワーク通信のオーバーヘッドが回避され、効率が向上します。
- throughメソッドは、Sparkと同様のシャッフルメカニズムを提供します。これにより、さまざまなパーティショニング戦略を使用してデータを結合することができます。
- Log Compactは、Kafkaベースのステートストアの読み込み効率を向上させます。
- 状態ストアは、状態計算の可能性を提供します。
- オフセットベースの計算進行状況管理と状態ストアベースの中間状態管理は、コンシューマーのリバランスまたはフェイルオーバーが発生したときにブレークポイントから処理を続行する可能性を提供し、システムの障害耐性を保証します。
- KTableの導入により、集約コンピューティングで異常な問題を処理できるようになります。