Apache SeaTunnel基础介绍

news/2024/10/11 20:47:06/文章来源:https://blog.csdn.net/weixin_43114209/article/details/140258593

一、什么是Apache SeaTunnel?

Apache SeaTunnel(最初名为Waterdrop)是一个开源的分布式数据集成平台,专为大规模数据处理设计。SeaTunnel可以从多种数据源读取数据,进行实时流式处理或批处理,然后将处理后的数据存储到目标系统中。SeaTunnel的设计宗旨是简化复杂的数据集成过程,并提供一种灵活且高效的方式来处理大数据。

SeaTunnel的开发始于应对实际生产环境中大规模数据处理的挑战。如今,它已成为一个稳定且功能丰富的工具,被广泛应用于数据采集、数据清洗、数据转换和数据存储等领域。

为什么需要数据集成工具?

随着企业数字化转型的推进,数据的来源越来越多样化,从传统的关系型数据库到现代的NoSQL数据库、分布式文件系统、消息队列和数据流服务等。这些数据源的数据格式和处理要求各不相同,企业需要一种工具来统一这些数据的处理流程,以实现高效的数据分析、BI报表生成、机器学习训练等任务。

传统的ETL(Extract, Transform, Load)工具虽然能解决部分问题,但面对现代大数据的规模和复杂性,往往力不从心。而SeaTunnel正是为了解决这些问题而生,它提供了一种灵活的配置方式和高度可扩展的插件架构,能够适应各种复杂的数据处理需求。

SeaTunnel的主要特点:

  • 支持实时流式和批处理:SeaTunnel同时支持实时流数据处理(例如来自Kafka的消息)和批处理(例如HDFS中的大数据集)。这使得它能够同时满足需要低延迟的实时数据处理任务和需要处理大量历史数据的批处理任务。

  • 高扩展性和灵活性:通过插件机制,SeaTunnel可以轻松扩展支持新的数据源、转换操作和数据接收器。无论是简单的数据过滤,还是复杂的数据聚合和转换,SeaTunnel都能提供相应的插件或接口来实现。

  • 丰富的数据源和接收器支持:SeaTunnel原生支持各种常见的数据源和接收器,包括关系型数据库(如MySQL、PostgreSQL)、分布式文件系统(如HDFS)、NoSQL数据库(如Elasticsearch、MongoDB)、消息队列(如Kafka、RabbitMQ)等。用户只需简单配置,即可将这些数据源与接收器无缝连接。

  • 简洁的配置与管理:SeaTunnel使用YAML格式的配置文件,使得配置过程直观且易于管理。用户无需编写大量代码,即可定义复杂的数据处理逻辑,并通过配置文件进行灵活调整。

二、核心概念

Data Source(数据源)

数据源是SeaTunnel作业的起点,它定义了数据从哪里来以及如何获取。SeaTunnel支持广泛的数据源类型,每种类型的数据源都有其特定的配置选项。例如,Kafka数据源需要指定Kafka集群的bootstrap_servers地址和要订阅的topics。SeaTunnel支持的数据源包括但不限于:

  • Kafka:从Kafka主题中读取流数据,常用于实时日志处理、消息队列消费等场景。
  • HDFS:从Hadoop分布式文件系统中读取批数据,适用于大规模数据存储与处理。
  • JDBC:通过JDBC连接从关系型数据库中读取数据,支持MySQL、PostgreSQL、Oracle等主流数据库。
  • File:从本地或分布式文件系统中读取文本、CSV、JSON等格式的文件数据。
  • ElasticSearch:从ElasticSearch中读取数据,适用于需要在搜索引擎中处理数据的场景。

例如,一个Kafka数据源的配置可能如下:

source:- plugin_name: kafkabootstrap_servers: "localhost:9092"topics: "log_topic"group_id: "log_processing_group"format: jsonschema:- name: "log_level"type: "string"- name: "message"type: "string"- name: "timestamp"type: "long"

在这个配置中,SeaTunnel将从log_topic中读取JSON格式的日志数据,并将其解析为具有log_levelmessagetimestamp三个字段的结构化数据。

Transform(转换)

在数据集成过程中,通常需要对原始数据进行多种形式的处理和转换。例如,我们可能需要对数据进行清洗(去除不符合要求的数据)、格式转换(将日期字符串转换为时间戳)、聚合(计算某个字段的总和)等。在SeaTunnel中,这些操作通过“转换”插件实现。

SeaTunnel提供了丰富的转换插件,包括但不限于:

  • SQL转换器:允许用户使用SQL语句来对数据进行过滤、选择、聚合等操作。
  • 字段映射:可以重命名字段或转换字段类型。
  • 聚合转换器:支持对数据进行聚合操作,如SUM、COUNT、AVG等。
  • 过滤器:根据特定条件过滤掉不符合要求的数据。
  • 脚本转换器:允许用户编写自定义的脚本逻辑来对数据进行复杂处理。

以下是一个SQL转换器的示例配置,它过滤出log_levelERROR的日志记录:

transform:- plugin_name: sqlquery: "SELECT * FROM input WHERE log_level = 'ERROR'"

该SQL转换器将处理数据流中的每一条记录,并仅保留日志级别为ERROR的记录。

Sink(接收器)

接收器是数据处理流程的终点,它定义了处理后的数据将存储到哪里。SeaTunnel支持多种接收器,能够将数据存储到各种存储系统中,包括但不限于:

  • Elasticsearch:将处理后的数据存储到Elasticsearch中,适用于搜索和分析应用场景。
  • JDBC:通过JDBC接口将数据写入关系型数据库,如MySQL、PostgreSQL等。
  • HDFS:将数据写入HDFS,适用于需要存储大规模批量数据的场景。
  • File:将数据写入本地或分布式文件系统,可以支持多种文件格式,如CSV、JSON、Parquet等。
  • Kafka:将处理后的数据发送回Kafka,适用于需要进一步处理或传输的场景。

例如,一个Elasticsearch接收器的配置可能如下:

sink:- plugin_name: elasticsearchhosts: ["localhost:9200"]index: "error_logs"document_type: "_doc"bulk_size: 5000flush_interval: 10

在这个配置中,SeaTunnel将处理后的数据以批量方式写入到Elasticsearch中的error_logs索引中,每批最多包含5000条记录,或每10秒刷写一次。

Connector(连接器)

SeaTunnel的连接器插件提供了将数据源、转换器和接收器连接起来的机制。连接器确保数据流能够从源头流向终点,过程中经过所需的各种处理和转换。连接器插件通过定义标准化接口,确保不同的数据源和接收器之间的兼容性,并支持数据流的高效处理。

SeaTunnel支持的连接器类型包括流处理连接器(如Kafka连接器)和批处理连接器(如HDFS连接器)。通过这些连接器,用户可以灵活组合数据处理流水线,从而构建出符合特定业务需求的数据处理解决方案。

三、SeaTunnel的架构

分布式架构

SeaTunnel采用分布式架构设计,能够支持大规模数据处理。其核心是一个分布式数据流处理引擎,能够在多个节点上并行执行数据处理任务,确保在处理大规模数据时依然能够保持高效和稳定。SeaTunnel的架构主要包括以下几个关键组件:

  • 调度层:负责SeaTunnel作业的调度与管理,确保作业在集群中高效地执行。调度层通过协调各个节点,分配数据处理任务,监控作业运行状态,并在发生故障时进行容错处理。

  • 执行层:负责实际的数据处理工作。每个节点都可以执行数据源读取、数据转换和数据存储操作。执行层通过并行化数据处理任务,提高了数据处理的吞吐量和效率。

  • 插件层:通过插件机制,SeaTunnel支持扩展和定制化。用户可以开发自定义插件,实现新的数据源、转换逻辑和接收器。

运行模式

SeaTunnel支持两种主要的运行模式:流处理模式和批处理模式。用户可以根据具体需求选择合适的模式:

  • 流处理模式:流处理

模式适用于实时数据处理场景。例如,SeaTunnel可以从Kafka中持续消费消息,并在消费过程中对消息进行实时处理。该模式通常用于低延迟数据处理场景,如实时监控、在线分析等。

  • 批处理模式:批处理模式适用于处理静态数据集的场景,如对存储在HDFS中的大规模数据集进行批量处理。该模式适合数据清洗、数据聚合和历史数据分析等场景,通常用于离线数据处理任务。

插件系统

SeaTunnel的插件系统是其灵活性和扩展性的关键。通过插件,用户可以为SeaTunnel添加新的数据源、转换器和接收器,从而扩展其功能以适应各种数据处理需求。插件的配置非常简单,用户只需在配置文件中指定插件名称和相关参数即可。

  • 官方插件:SeaTunnel提供了多种官方插件,涵盖了大部分常见的数据源、转换器和接收器。用户可以直接使用这些插件来满足常规的数据处理需求。
  • 自定义插件:用户可以根据实际需求开发自定义插件。SeaTunnel为插件开发提供了标准化的接口和开发工具包(SDK),使得开发者可以轻松扩展SeaTunnel的功能。

插件的高可扩展性使得SeaTunnel能够适应快速变化的业务需求,同时也方便了社区和企业用户贡献插件,进一步丰富SeaTunnel的生态系统。

四、安装与配置

环境准备

在安装SeaTunnel之前,确保你的系统环境符合以下要求:

  • Java:SeaTunnel基于Java运行时环境,因此需要安装JDK 8或更高版本。Java是SeaTunnel的核心依赖,确保JVM配置合理,以满足大规模数据处理的需求。
  • Maven:用于构建和管理SeaTunnel项目。Maven可以帮助你下载并管理SeaTunnel所需的依赖包,以及构建自定义插件或扩展模块。
  • 操作系统:SeaTunnel支持在各种操作系统上运行,包括Linux、MacOS和Windows。对于大规模生产环境,推荐在Linux系统上部署。

下载与安装

  1. 下载SeaTunnel:从Apache官方网站或GitHub仓库下载SeaTunnel的最新版本。你可以选择下载已经编译好的二进制包,或下载源码自行编译。

    • 官方下载链接:Apache SeaTunnel下载
    • GitHub仓库:GitHub - Apache SeaTunnel
  2. 解压安装包:将下载的压缩包解压到你选择的目录。推荐将SeaTunnel安装在集群中所有节点的一致路径下,以便于统一管理和调度。

  3. 配置环境变量:为了方便使用,将SeaTunnel的路径添加到$SEATUNNEL_HOME环境变量中,并将$SEATUNNEL_HOME/bin添加到$PATH中,这样你可以在命令行中直接使用seatunnel.sh命令启动SeaTunnel作业。

  4. 测试安装:在命令行中运行bin/seatunnel.sh --version,检查SeaTunnel是否正确安装。如果一切正常,你将看到SeaTunnel的版本信息和帮助信息。

配置文件

SeaTunnel的配置文件采用YAML格式,用户通过编写配置文件定义数据源、数据转换和数据接收的具体逻辑。配置文件分为三大部分:envsourcetransformsink,分别对应环境配置、数据源配置、转换配置和接收器配置。

以下是一个典型的SeaTunnel配置文件示例,它从Kafka读取数据,进行简单过滤后写入到Elasticsearch:

env:execution.parallelism: 4job.name: "Kafka to Elasticsearch Example"checkpoint.interval: 60fault_tolerance: "exactly_once"source:- plugin_name: kafkabootstrap_servers: "localhost:9092"topics: "log_topic"group_id: "log_processing_group"format: jsonschema:- name: "log_level"type: "string"- name: "message"type: "string"- name: "timestamp"type: "long"transform:- plugin_name: sqlquery: "SELECT * FROM input WHERE log_level = 'ERROR'"sink:- plugin_name: elasticsearchhosts: ["localhost:9200"]index: "error_logs"document_type: "_doc"bulk_size: 5000flush_interval: 10

配置解析:

  • env:定义了作业的全局配置,如并行度(execution.parallelism)、作业名称(job.name)和容错策略(fault_tolerance)。这些参数控制了SeaTunnel作业的整体运行行为。

  • source:定义了数据源,此处为Kafka数据源。它指定了Kafka集群地址、订阅的主题、消费者组ID和数据格式等参数。

  • transform:定义了数据的转换逻辑,此处为SQL转换器。它将过滤出log_levelERROR的日志记录。

  • sink:定义了数据的接收器,此处为Elasticsearch接收器。它指定了Elasticsearch集群的地址、目标索引名称、文档类型以及数据写入的批量大小和刷新间隔。

五、 SeaTunnel示例

示例1:从Kafka到Elasticsearch的数据处理

场景描述:假设你正在构建一个实时日志处理系统,从Kafka中消费日志数据,过滤出错误日志,并将这些错误日志存储到Elasticsearch中,以便后续查询和分析。

步骤1:配置Kafka数据源

source:- plugin_name: kafkabootstrap_servers: "localhost:9092"topics: "log_topic"group_id: "log_processing_group"format: jsonschema:- name: "log_level"type: "string"- name: "message"type: "string"- name: "timestamp"type: "long"

解释:这个配置定义了从Kafka主题log_topic中读取数据,数据格式为JSON,包含log_levelmessagetimestamp三个字段。

步骤2:配置SQL转换器

transform:- plugin_name: sqlquery: "SELECT * FROM input WHERE log_level = 'ERROR'"

解释:SQL转换器会过滤出日志级别为ERROR的记录,仅保留这些错误日志。

步骤3:配置Elasticsearch接收器

sink:- plugin_name: elasticsearchhosts: ["localhost:9200"]index: "error_logs"document_type: "_doc"bulk_size: 5000flush_interval: 10

解释:处理后的数据将批量写入Elasticsearch中的error_logs索引,每批最多5000条记录,或每10秒刷新一次。

示例2:批处理HDFS数据

场景描述:你需要处理存储在HDFS中的历史销售数据,将其按类别进行聚合统计,并将结果存储到MySQL数据库中。

步骤1:配置HDFS数据源

source:- plugin_name: hdfspath: "hdfs://namenode:8020/user/hadoop/sales_data"format: parquetschema:- name: "category"type: "string"- name: "sales_amount"type: "double"- name: "date"type: "string"

解释:这个配置定义了从HDFS读取Parquet格式的销售数据,包含categorysales_amountdate三个字段。

步骤2:配置聚合转换器

transform:- plugin_name: aggregategroup_by: ["category"]aggregate_func: "SUM"aggregate_field: "sales_amount"

解释:聚合转换器会按category字段分组,统计每个类别的sales_amount总和。

步骤3:配置MySQL接收器

sink:- plugin_name: jdbcurl: "jdbc:mysql://localhost:3306/analytics"table: "category_sales_summary"username: "root"password: "password"batch_size: 2000

解释:将聚合结果写入MySQL数据库中的category_sales_summary表,每次批量插入2000条记录。

六、常见问题与调优建议

常见问题

  1. 配置错误:配置文件中的参数错误或遗漏是常见问题。请确保所有必需的配置项都已正确设置,特别是在配置复杂的数据源和接收器时,详细阅读官方文档以避免错误。

  2. 依赖问题:SeaTunnel依赖于多个开源组件,如Java、Maven以及相关插件库。确保这些依赖已

正确安装并与SeaTunnel版本兼容,尤其是在使用自定义插件时,务必确认依赖库的版本匹配。

  1. 性能问题:处理大规模数据时,性能瓶颈可能会出现。SeaTunnel提供了多种调优手段,如通过调整并行度(parallelism)、优化SQL查询、合理配置批处理参数等方式提高处理效率。

性能调优

  1. 优化并行度:SeaTunnel作业的并行度(parallelism)直接影响数据处理的速度。根据实际数据规模和集群资源,适当调整并行度可以显著提高处理效率。通过增加并行度,可以利用更多的计算资源来加速数据处理。

  2. 合理选择插件:根据数据量和处理复杂度选择合适的插件。例如,对于简单的字段映射操作,选择轻量级的转换器可以减少不必要的资源消耗。如果需要处理复杂的转换逻辑,建议使用SQL转换器或自定义脚本转换器,以最大化灵活性。

  3. 监控与分析:使用监控工具(如Prometheus、Grafana)实时监控SeaTunnel作业的运行状态,分析和定位性能瓶颈。SeaTunnel支持与监控系统集成,通过监控指标(如作业的处理延迟、吞吐量、资源利用率等)来优化性能。

  4. 调整数据流配置:在流处理模式下,数据的流速和批处理大小(bulk_size)会影响整体性能。适当调整这些参数,可以避免数据处理中的拥塞和资源浪费。

  5. 资源分配与隔离:在多租户环境中,合理配置SeaTunnel作业的资源(如CPU、内存)并进行资源隔离,可以避免资源争用导致的性能下降。同时,可以通过容器化技术(如Docker)来实现资源隔离和动态扩展。

  6. 使用缓存与中间存储:在处理需要多次重复计算或跨批次依赖的数据时,可以考虑使用缓存或中间存储(如Redis、Memcached),以减少重复计算和数据传输的开销。

七、总结

Apache SeaTunnel是一款功能强大且灵活的数据集成工具,特别适用于需要处理多种数据源并进行复杂数据转换的场景。SeaTunnel支持流处理和批处理两种模式,能够满足实时和离线数据处理的多样化需求。通过其插件系统,SeaTunnel能够适应快速变化的业务需求,并轻松扩展以支持新的数据源和处理逻辑。

SeaTunnel在大数据处理生态系统中占据了重要的位置,其简洁的配置与强大的扩展性使得它在数据集成领域具有广泛的应用前景。无论是初创公司还是大型企业,都可以通过SeaTunnel构建高效、可靠的数据处理管道,从而支持业务分析、机器学习和其他数据驱动的应用。

通过本文的详细介绍,你应该已经对SeaTunnel的基本概念、架构及其应用场景有了深入了解。希望这篇文章能帮助你在实际项目中有效地应用SeaTunnel,并解决复杂的数据处理问题。如果你有任何疑问或遇到问题,建议参考SeaTunnel的官方文档和社区资源。

八、参考资料

  • Apache SeaTunnel 官方文档
  • GitHub 仓库
  • SeaTunnel 用户手册
  • SeaTunnel 社区讨论
  • Elasticsearch 官方文档
  • Kafka 官方文档
  • HDFS 官方文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ldbm.cn/p/441402.html

如若内容造成侵权/违法违规/事实不符,请联系编程新知网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PDB数据库数据查看和下载

RCSB(Research Collaboratory for Structural Bioinformatics)的PDB(Protein Data Bank)数据库是一个具有全球性影响力的科学数据库,主要用于存储和分享生物大分子(主要是蛋白质、核酸以及部分多糖&#xf…

干耳朵里面有坨屎出不来怎么办?口碑好的可视耳勺

干耳朵不比油耳朵,耳道中的耳屎过多会自己流到外耳道出来方便我们清理。干耳朵里面有坨屎出不来建议使用专业的工具来掏,在挖取过程中会更加精准和安全。但随着可视挖耳勺近几年越来越火爆,各种款式层出不穷,这其中也隐藏了不少劣…

[数据集][目标检测]汽车头部尾部检测数据集VOC+YOLO格式5319张3类别

数据集制作单位:未来自主研究中心(FIRC) 版权单位:未来自主研究中心(FIRC) 版权声明:数据集仅仅供个人使用,不得在未授权情况下挂淘宝、咸鱼等交易网站公开售卖,由此引发的法律责任需自行承担 数据集格式:Pascal VOC格…

构建数字化时代的企业:数据驱动的信息架构战略

信息架构的黄金标准:全球企业转型的权威指南 The Open Group:信息架构领域的权威 全球范围的标准制定者 The Open Group是一家专注于企业架构和技术标准的全球性组织,拥有700多家成员机构,包括世界领先的科技公司、咨询公司和学…

中国书法—孙溟㠭篆刻《消失的心》

中国书法孙溟㠭篆刻作品《消失的心》 从小跟我多年的那颗单纯的心找不到了,那颗遇事激动砰砰跳的心没有了,身上多了一颗不属于我的世俗蒙尘铁打不跳动心,我已修成“正果”。甲辰秋月于寒舍小窗下溟㠭刊。 孙溟㠭篆刻《消失的心》 孙溟㠭…

Machine Learning: A Probabilistic Perspective 机器学习:概率视角 PDF免费分享

下载链接在博客最底部!! 之前需要参考这本书,但是大多数博客都是收费才能下载本书。 在网上找了好久才找到免费的资源,浪费了不少时间,在此分享以节约大家的时间。 链接: https://pan.baidu.com/s/1erFsMcVR0A_xT4fx…

C/C++ 网络编程之关于多核利用问题

在 C/C 网络编程之中,多核利用分为以下几类: 1、一个链接一个线程,即传统且淘汰的 MTA 架构 形式:每次捕获链接,create_new_thread 一个子线程出来处理。 优点:开发简单,维护简单。 缺点&#x…

如何通过食堂采购小程序端降低成本,提升效率?

随着数字化管理工具的普及,越来越多的食堂正在引入小程序来优化采购流程,减少成本和提升效率。食堂采购小程序端通过技术手段实现了自动化、智能化的管理方式,为管理者提供了极大的便利。本文将探讨如何利用技术手段开发一个高效的食堂采购小…

C#基础(11)函数重载

前言 前面我们已经完成了ref和out补充知识点的学习,以及函数参数相关的学习,今天便再次为函数补充一个知识点:函数重载。 函数重载是指在同一个作用域中,可以有多个同名函数,但参数列表不同。它的发展可以追溯到早期…

vue + Element UI table动态合并单元格

一、功能需求 1、根据名称相同的合并工作阶段和主要任务合并这两列,但主要任务内容一样,但要考虑主要任务一样,但工作阶段不一样的情况。(枞向合并) 2、落实情况里的定量内容和定性内容值一样则合并。(横向…

请解释JSP中的九大内置对象及其作用。什么是Java Web中的请求转发和重定向?它们有什么区别?

请解释JSP中的九大内置对象及其作用。 JSP(JavaServer Pages)中的九大内置对象(也称为隐式对象或自动对象)是JSP容器为每个页面提供的Java对象,这些对象在JSP页面被转换成Servlet时自动可用,无需显式声明。…

数学建模:控制预测类——时间序列ARIMA模型

目录 1.时间序列ARIMA模型 2.ARIMA模型大纲 3.模型详解 1)自回归模型AR(p) 2)移动平均模型MA(q) 3)自回归移动平均模型ARMA(p,q) 4)差分自回归移动平均模型ARIMA(p,d,q) 4.ARIMA模型建模步骤 5.建模步骤名词解释 1&…

解决:Vue 中 debugger 不生效

目录 1,问题2,解决2.1,修改 webpack 配置2.2,修改浏览器设置 1,问题 在 Vue 项目中,可以使用 debugger 在浏览器中开启调试。但有时却不生效。 2,解决 2.1,修改 webpack 配置 通…

onpm报错: Install failed

api 9 安装ohos/pulltorefresh2.0.1报错误 ohpm install ohos/pulltorefresh2.0.1 ohpm INFO: fetching meta info of package ohos/pulltorefresh ohpm WARN: fetch meta info of package ohos/pulltorefresh failed - GET https://registry.npmjs.org/ohos/pulltorefresh 404…

怎么仿同款小程序的开发制作方法介绍

很多老板想要仿小程序系统,就是想要做个和别人界面功能类似的同款小程序系统,咨询瀚林问该怎么开发制作?本次瀚林就为大家介绍一下仿制同款小程序系统的方法。 1、确认功能需求 想要模仿同款小程序系统,那么首先需要找到自己想要…

Qt 学习第十天:标准对话框 页面布局

系统标准对话框 错误对话框 //错误对话框connect(createPro, &QAction::triggered, this, []{//参数1 父亲 参数2 标题 参数3 对话框内显示文本内容 。。。QMessageBox::critical(this, "报错!", "没加头文件!");}); 【运行结果】 信息对话框 co…

JDBC API详解二

PreparedStatement 作用: 预编译SQL的执行,,预防SQL注入问题 SQL注入 通过操作输入来修改预先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法; SQL注入延时 需求,完成用户登录 select * fr…

nodejs基础教程之-异步编程promise/async/generator

1. 异步 所谓"异步",简单说就是一个任务分成两段,先执行第一段,然后转而执行其他任务,等做好了准备,再回过头执行第二段,比如,有一个任务是读取文件进行处理,异步的执行过程就是下面…

产业互联网新星闪耀,“太行云商”引领传统产业数字化革命

产业互联网新星升起 晋城,作为我国能源及相关产业的重要基地,一直面临着信息协同不畅、存货供需失衡、资金融通困难等诸多挑战。 2023年,为了应对这些难题,晋城市政府携手AMT企源,成立了太行云商科技有限公司&#x…

JAVA实现压缩包解压兼容Windows系统和MacOs

目标:JAVA实现压缩包解压获取图片素材 问题:Windows系统和MacOs压缩出来的zip内容有区别 MacOs会多出来 以及本身一个文件夹 而windows则不会。为了解决这个问题。兼容mac的压缩包增加一层过滤 要知道 ZipInputStream 可以读取 ZIP 文件中的条目&…