深入理解SeaTunnel:易用、高性能、支持实时流式和离线批处理的海量数据集成平台
SeaTunnel Engine 是 SeaTunnel 的默认引擎。SeaTunnel的安装包中已经包含了SeaTunnel Engine的所有内容。
在/etc/profile.d/seatunnel.sh中配置环境变量
export SEATUNNEL_HOME=${seatunnel install path}
export PATH=$PATH:$SEATUNNEL_HOME/bin
SeaTunnel Engine 支持两种设置 jvm 选项的方式。
$SEATUNNEL_HOME/bin/seatunnel-cluster.sh
第一行JAVA_OPTS="-Xms2G -Xmx2G"
SeaTunnel Engine提供了很多功能,需要在seatunnel.yaml中进行配置。
SeaTunnel Engine 基于Hazelcast IMDG实现集群管理。集群的状态数据(作业运行状态,资源状态)存储在Hazelcast IMap中。Hazelcast IMap 中保存的数据将分布存储在集群的所有节点中。Hazelcast 会对存储在 Imap 中的数据进行分区。每个分区可以指定备份的数量。因此,SeaTunnel Engine可以在不使用其他服务(例如zookeeper)的情况下实现集群HA。
用于backup count定义同步备份的数量。例如,如果设置为 1,分区的备份将放在另外一个成员上。如果是2,就会放在另外两个成员身上。
我们建议 的backup-count值为min(1, max(5, N/2))。N是集群节点的编号。
seatunnel:
engine:
backup-count: 1
# other config
Slots的数量决定了集群节点可以并行运行的TaskGroups的数量。SeaTunnel Engine是一个数据同步引擎,大部分作业都是IO密集型的。
建议使用动态插槽。
seatunnel:
engine:
slot-service:
dynamic-slot: true
# other config
与 Flink 一样,SeaTunnel Engine 支持 Chandy–Lamport 算法。因此,SeaTunnel Engine可以实现数据同步,不丢失数据,不重复数据。
间隔:
暂停:
最大并发:
可容忍的失败
seatunnel:
engine:
backup-count: 1
print-execution-info-interval: 10
slot-service:
dynamic-slot: true
checkpoint:
interval: 300000
timeout: 10000
max-concurrent: 1
tolerable-failure: 2
文件中的所有 SeaTunnel 引擎服务器配置hazelcast.yaml。
SeaTunnel Engine 节点使用集群名称来判断对方是否与自己是一个集群。如果两个节点之间的集群名称不同,SeaTunnel Engine 将拒绝服务请求。
基于Hazelcast,SeaTunnel Engine 集群是运行 SeaTunnel Engine Server 的集群成员网络。集群成员自动连接在一起形成一个集群。这种自动加入是通过集群成员用来相互查找的各种发现机制进行的。
请注意,集群形成后,无论使用何种发现机制,集群成员之间的通信始终通过 TCP/IP。
SeaTunnel Engine 使用以下发现机制。可以将 SeaTunnel Engine 配置为完整的 TCP/IP 集群。
hazelcast:
cluster-name: seatunnel
network:
join:
tcp-ip:
enabled: true
member-list:
- hostname1
port:
auto-increment: false
port: 5801
properties:
hazelcast.logging.type: log4j2
TCP 是我们在独立 SeaTunnel Engine 集群中的建议方式。
类型
imap 持久化的类型,目前只支持hdfs.
命名空间
用于区分不同业务的数据存储位置,如OSS bucket名称。
集群名称
这个参数主要是用来做集群隔离的,我们可以用这个来区分不同的集群,比如cluster1,cluster2,这个也用来区分不同的业务
fs.defaultFS
我们使用hdfs api读写文件,所以使用这个存储需要提供hdfs配置
如果你使用 HDFS,你可以这样配置:
map:
engine*:
map-store:
enabled: true
initial-mode: EAGER
factory-class-name: org.apache.seatunnel.engine.server.persistence.FileMapStoreFactory
properties:
type: hdfs
namespace: /tmp/seatunnel/imap
clusterName: seatunnel-cluster
fs.defaultFS: hdfs://localhost:9000
如果没有 HDFS 并且您的集群只有一个节点,您可以像这样配置使用本地文件:
map:
engine*:
map-store:
enabled: true
initial-mode: EAGER
factory-class-name: org.apache.seatunnel.engine.server.persistence.FileMapStoreFactory
properties:
type: hdfs
namespace: /tmp/seatunnel/imap
clusterName: seatunnel-cluster
fs.defaultFS: file:///
cluster-name客户端必须与 SeaTunnel Engine相同。否则,SeaTunnel Engine 将拒绝客户端请求。
集群成员
所有SeaTunnel Engine Server Node地址都需要添加到这里。
hazelcast-client:
cluster-name: seatunnel
properties:
hazelcast.logging.type: log4j2
network:
cluster-members:
- hostname1:5801
启动SeaTunnel Engine Server
mkdir -p $SEATUNNEL_HOME/logs
nohup bin/seatunnel-cluster.sh 2>&1 &
日志将写入$SEATUNNEL_HOME/logs/seatunnel-engine-server.log
只需要将$SEATUNNEL_HOMESeaTunnel Engine节点上的目录复制到Client节点,并配置SEATUNNEL_HOME类似的SeaTunnel Engine Server节点即可。
这是在生产环境中最推荐使用 SeaTunnel Engine 的方式。该模式支持SeaTunnel Engine的全部功能,集群模式的性能和稳定性会更好。
集群模式下,需要先部署SeaTunnel Engine集群,客户端将作业提交给SeaTunnel Engine集群运行。
提交命令
$SEATUNNEL_HOME/bin/seatunnel.sh --config $SEATUNNEL_HOME/config/v2.batch.config.template
Checkpoint是一种容错恢复机制。这种机制保证了程序运行时,即使突然遇到异常,也能自行恢复。
检查点
Checkpoint Storage是一种存储检查点数据的存储机制。
SeaTunnel Engine 支持以下检查点存储类型:
我们使用微内核设计模式将检查点存储模块与引擎分离。这允许用户实现自己的检查点存储模块。
checkpoint-storage-api是checkpoint存储模块API,定义了checkpoint存储模块的接口。
如果要实现自己的checkpoint存储模块,需要实现CheckpointStorage并提供相应的CheckpointStorageFactory实现。
检查点存储
模块的配置seatunnel-server在seatunnel.yaml文件中。
seatunnel:
engine:
checkpoint:
storage:
type: hdfs #plugin name of checkpoint storage, we support hdfs(S3, local, hdfs), localfile (native local file) is the default, but this plugin is de
# plugin configuration
plugin-config:
namespace: #checkpoint storage parent path, the default value is /seatunnel/checkpoint/
K1: V1 # plugin other configuration
K2: V2 # plugin other configuration
注意:命名空间必须以“/”结尾。
如果你使用 HDFS,你可以这样配置:
seatunnel:
engine:
checkpoint:
storage:
type: hdfs
max-retained: 3
plugin-config:
storage.type: hdfs
fs.defaultFS: hdfs://localhost:9000
// if you used kerberos, you can config like this:
kerberosPrincipal: your-kerberos-principal
kerberosKeytab: your-kerberos-keytab
seatunnel:
engine:
checkpoint:
interval: 6000
timeout: 7000
max-concurrent: 5
tolerable-failure: 2
storage:
type: hdfs
max-retained: 3
plugin-config:
storage.type: hdfs
fs.defaultFS: file:/// # Ensure that the directory has written permission
TCP网络
如果多播不是您环境的首选发现方式,那么您可以将 SeaTunnel Engine 配置为完整的 TCP/IP 集群。当您将 SeaTunnel Engine 配置为通过 TCP/IP 发现成员时,您必须将所有或部分成员的主机名和/或 IP 地址列为集群成员。您不必列出所有这些集群成员,但当新成员加入时,至少有一个列出的成员必须在集群中处于活动状态。
要将 Hazelcast 配置为完整的 TCP/IP 集群,请设置以下配置元素。有关 TCP/IP 发现配置元素的完整描述,请参阅 tcp-ip 元素部分。
以下是示例声明性配置。
hazelcast:
network:
join:
tcp-ip:
enabled: true
member-list:
- machine1
- machine2
- machine3:5799
- 192.168.1.0-7
- 192.168.1.21
如上所示,您可以为成员元素提供 IP 地址或主机名。您还可以提供 IP 地址范围,例如192.168.1.0-7.
除了如上所示逐行提供成员,您还可以选择使用成员元素并编写以逗号分隔的 IP 地址,如下所示。
192.168.1.0-7,192.168.1.21
如果您不为成员提供端口,Hazelcast 会自动尝试端口5701,5702依此类推。