Répertoire d'articles
I. Aperçu
1.1 Flux Kafka
Kafka Streams. Une partie intégrante du projet open source Apache Kafka. Est une bibliothèque puissante et facile à utiliser. Utilisé pour créer des applications hautement distribuées, évolutives et tolérantes aux pannes sur Kafka.
1.2 Caractéristiques des flux Kafka
1. Puissant
- Haute évolutivité, flexibilité, tolérance aux pannes
2. Léger
- Pas besoin de clusters dédiés
- Une bibliothèque, pas un framework
3. Entièrement intégré
- 100% compatible avec la version Kafka 0.10.0
- Facile à intégrer dans les applications existantes
4. En temps réel
- Délai de la milliseconde
- Pas de micro-lots
- La fenêtre autorise les données dans le désordre
- Autoriser les données tardives
1.3 Pourquoi devrait-il y avoir des flux Kafka
Il existe déjà de nombreux systèmes de streaming, les systèmes de streaming open source les plus connus et les plus utilisés sont Spark Streaming et Apache Storm. Apache Storm est développé depuis de nombreuses années et dispose d'une large gamme d'applications. Il fournit des capacités de traitement au niveau des enregistrements et prend actuellement en charge SQL on Stream. Spark Streaming est basé sur Apache Spark, qui peut être facilement intégré à l'informatique graphique et au traitement SQL. Il a des fonctions puissantes et a un seuil bas pour les utilisateurs qui sont familiarisés avec le développement d'autres applications Spark. En outre, les distributions Hadoop courantes actuelles, telles que Cloudera et Hortonworks, intègrent Apache Storm et Apache Spark, ce qui facilite le déploiement.
Étant donné qu'Apache Spark et Apache Storm présentent de nombreux avantages, pourquoi avons-nous besoin de Kafka Stream?
Les principales raisons sont les suivantes.
Premièrement, Spark et Storm sont tous deux des frameworks de traitement de flux, et Kafka Streams fournit une bibliothèque de traitement de flux basée sur Kafka. Le framework oblige les développeurs à développer des parties logiques d'une manière spécifique pour que le framework puisse les appeler. Il est difficile pour les développeurs de comprendre le mode de fonctionnement spécifique du framework, ce qui rend le débogage coûteux et une utilisation limitée. Kafka Streams, en tant que bibliothèque de traitement de flux, fournit directement des classes spécifiques que les développeurs peuvent appeler. Le mode d'exécution de l'ensemble de l'application est principalement contrôlé par le développeur, ce qui est pratique pour l'utilisation et le débogage.
Deuxièmement, bien que Cloudera et Hortonworks facilitent le déploiement de Storm et Spark, le déploiement de ces frameworks est encore relativement complexe. En tant que bibliothèque de classes, Kafka Streams peut être facilement incorporé dans les applications. Il n'a fondamentalement aucune exigence pour le packaging et le déploiement d'applications.
Troisièmement, en ce qui concerne les systèmes de streaming, Kafka est essentiellement pris en charge en tant que source de données. Par exemple, Storm a un kafka-spout spécial, et Spark fournit également un module spécial spark-streaming-kafka. En fait, Kafka est fondamentalement la source de données standard pour les systèmes de streaming grand public. En d'autres termes, Kafka a été déployé dans la plupart des systèmes de streaming, et le coût d'utilisation de Kafka Streams est très faible pour le moment.
Quatrièmement, lorsque vous utilisez Storm ou Spark Streaming, vous devez réserver des ressources pour le processus du framework lui-même, comme le superviseur de Storm et le gestionnaire de nœuds Spark on YARN. Même pour les instances d'application, le framework lui-même prendra certaines ressources. Par exemple, Spark Streaming doit réserver de la mémoire pour la lecture aléatoire et le stockage. Mais Kafka en tant que bibliothèque de classes n'occupe pas les ressources système.
Cinquièmement, étant donné que Kafka lui-même assure la persistance des données, Kafka Streams offre des capacités de déploiement progressif, de mise à niveau progressive et de recalcul.
Sixièmement, grâce au mécanisme de rééquilibrage des consommateurs Kafka, Kafka Stream peut ajuster dynamiquement le parallélisme en ligne.
Deux, cas de nettoyage de données Kafka Streams
0) Demande
Traitement en temps réel des mots préfixés par ">>>". Par exemple, saisissez "aaa >>> bbb", et finalement transformé en "bbb"
1) Analyse de la demande
2) Pratique de cas
- Créez un projet et ajoutez le package jar
- Créer la classe principale
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();
}
}
- Traitement métier spécifique
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) Exécutez le programme
(5) Démarrer le producteur sur hadoop104
[root@hadoop104 kafka]$ bin/kafka-console-producer.sh \
--broker-list hadoop102:9092 --topic first
>hello>>>world
>>aaa>>>bbb
>>hahaha
(6) Démarrer les consommateurs sur hadoop103
[root@hadoop103 kafka]$ bin/kafka-console-consumer.sh \
--zookeeper hadoop102:2181 --from-beginning --topic second
world
bbb
hahaha
Trois, résumé
- Le modèle parallèle de Kafka Streams est entièrement basé sur le mécanisme de partitionnement et le mécanisme de rééquilibrage de Kafka, qui réalise l'ajustement dynamique en ligne du parallélisme;
- La même tâche contient tous les processeurs d'une sous-topologie, de sorte que toute la logique de traitement est terminée dans le même thread, évitant ainsi une surcharge de communication réseau inutile, améliorant ainsi l'efficacité;
- La méthode through fournit un mécanisme Shuffle similaire à Spark, qui offre la possibilité de Join pour les données en utilisant différentes stratégies de partitionnement;
- Log compact améliore l'efficacité de chargement du magasin d'état basé sur Kafka;
- La mémoire d'état offre la possibilité de calculer l'état;
- La gestion de la progression du calcul basée sur les décalages et la gestion des états intermédiaires basée sur la mémoire d'état offrent la possibilité de poursuivre le traitement à partir des points d'arrêt lorsque le rééquilibrage du consommateur ou le basculement se produit, et fournissent une garantie de tolérance aux pannes du système;
- L'introduction de KTable permet au calcul agrégé d'avoir la capacité de traiter des problèmes de désordre;