Jet是什么
Jet 是一个开源的、内存中的、分布式的批处理和流处理引擎。
您可以使用它来处理大量实时事件或庞大的静态数据集。
为了给您一个规模的感觉,已经证明 Jet 的单个节点可以在 10 毫秒以下的延迟下 聚合每秒 1000 万个事件。
它提供了一个 Java API 通过 数据流编程模型 来构建流和批处理应用程序。在将应用程序部署到 Jet 集群后,Jet 将自动使用集群上的所有计算资源运行您的应用程序。
如果在运行应用程序时向集群添加更多节点,Jet 将自动扩展您的应用程序以在新节点上运行。
如果从集群中删除节点,它会在不丢失当前计算状态的情况下无缝缩小,提供 Exactly-Once 处理保证。
例如,您可以使用以下 API 表示经典的单词计数问题,读取一些本地文件并将每个单词的频率输出到控制台:
JetInstance jet = Jet.bootstrappedInstance();
Pipeline p = Pipeline.create();
p.readFrom(Sources.files("/path/to/text-files"))
.flatMap(line -> traverseArray(line.toLowerCase().split("\\W+")))
.filter(word -> !word.isEmpty())
.groupingKey(word -> word)
.aggregate(counting())
.writeTo(Sinks.logger());
jet.newJob(p).join();
然后将应用程序部署到集群:
bin/jet submit word-count.jar
另一个应用程序从 Kafka 聚合每秒数百万个传感器读数,分辨率为 10 毫秒,如下所示:
Pipeline p = Pipeline.create();
p.readFrom(KafkaSources.<String, Reading>kafka(kafkaProperties, "sensors"))
.withTimestamps(event -> event.getValue().timestamp(), 10) // 使用事件时间戳,允许的滞后时间为毫秒
.groupingKey(reading -> reading.sensorId())
.window(sliding(1_000, 10)) // 滑动窗口 1s 每 10ms
.aggregate(averagingDouble(reading -> reading.temperature()))
.writeTo(Sinks.logger());
jet.newJob(p).join();
Jet 提供了对许多种类的 数据源和接收器 的开箱即用支持,包括:
- Apache Kafka
- 本地文件 (Text, Avro, JSON)
- Apache Hadoop (Azure Data Lake, S3, GCS)
- Apache Pulsar
- Debezium
- Elasticsearch
- JDBC
- JMS
- InfluxDB
- Hazelcast
- Redis
- MongoDB
何时使用Jet
在需要以分布式方式处理大量数据时,Jet 是一个很好的选择。
您可以使用它构建各种数据处理应用程序,例如:
- 低延迟的有状态流处理。例如,从 100,000 设备的 100 Hz 传感器数据中检测趋势并在 10 毫秒内发送纠正反馈。
- 高吞吐量、大状态流处理。例如,跟踪数百万用户的 GPS 位置,推断其速度矢量。
- 大数据量的批处理,例如分析一天的股票交易数据以更新给定投资组合的风险敞口。
主要特点
在负载下的可预测延迟
Jet 使用独特的 协作式多线程 执行模型,可以在处理数百万个项的同时达到 极低的延迟,仅在单个节点上:
该引擎能够在固定数量的线程上同时运行数十到数千个作业。
无基础设施的容错性
Jet 将计算状态存储在分布式、复制的 内存存储 中,不需要分布式文件系统或类似 Zookeeper 的基础设施来提供高可用性和容错性。
Jet 实现了 Chandy-Lamport 算法的一种版本,以在面对故障时提供 Exactly-Once 处理。与外部事务性系统(如数据库)进行交互时,可以使用 two-phase commit 提供端到端的处理保证。
高级事件处理
事件数据通常可能是 无序的,Jet 对处理此无序性有着一流的支持。Jet 实现了一种称为 分布式水印 的技术,将无序事件视为按顺序到达的事件。
如何入门
请遵循 入门指南 开始使用 Jet。
下载
您可以从 https://jet-start.sh 下载 Jet。
或者,您可以使用最新的 Docker 镜像:
docker run -p 5701:5701 hazelcast/hazelcast-jet
使用以下 Maven 坐标将 Jet 添加到您的应用程序中:
<groupId>com.hazelcast.jet</groupId>
<artifactId>hazelcast-jet</artifactId>
<version>4.2</version>
个人感觉
这个更加类似于 seatunnel
参考资料
https://github.com/hazelcast/hazelcast-jet