在AWS EMR上用Hive、Spark、Airflow构建一个高效的ETL程序

在AWS EMR(Elastic MapReduce)上构建一个高效的ETL程序,使用Hive作为数据仓库,Spark作为计算引擎,Airflow作为调度工具时,有几个关键的设计与实施方面需要注意。
在AWS EMR上构建高效的ETL程序,首先需要设计合理的集群架构、数据存储结构和计算框架,并优化每个环节的性能。通过合理配置Hive与Spark的参数,充分利用Airflow的调度功能,可以大大提升ETL流程的效率和可维护性。与此同时,需要时刻关注集群资源管理、数据质量控制和成本优化,确保ETL程序在长期运行中的稳定性和高效性。以下是从架构、性能优化、可维护性、可扩展性等角度的考虑:

1. 架构设计与选择

  • 数据存储:
    使用Amazon S3作为数据存储层,因为它具有高可扩展性、低成本以及与EMR和Hive的兼容性。可以使用不同的S3存储路径来管理原始数据、临时数据和处理后的数据。

  • Hive配置:

    • Hive Metastore: Hive的元数据存储可以使用内置的Derby数据库,但为了高可用性和可扩展性,建议使用Amazon RDS(如MySQL或PostgreSQL)作为Hive的外部Metastore。
    • Partitioning & Bucketing: 为了提高查询性能,使用Hive的分区(Partitioning)和桶化(Bucketing)机制来优化大数据集的读取。
  • Spark配置:

    • Spark通常作为ETL的计算引擎,提供了强大的内存计算能力。
    • 配置适当的executordriver资源:根据数据的规模和集群资源,合理分配executor的内存和核心数,以避免OOM(OutOfMemory)问题。
    • 开启Spark的dynamic allocation,使其能够根据工作负载动态调整资源。
  • Airflow:

    • Airflow作为调度工具,可以自动化ETL任务的执行。你需要通过Airflow配置Spark任务的依赖关系,并确保每个任务的错误处理和重试机制合理。
    • 使用EmrCreateJobFlowOperatorEmrTerminateJobFlowOperator来管理EMR集群的生命周期。

2. 性能优化

  • 数据处理:

    • Spark配置:
      在Spark中,数据的分区数量对性能有很大影响。使用适当的repartitioncoalesce方法来优化数据分区。例如,如果要将数据写入S3并避免小文件问题,可以选择使用coalesce方法合并分区数。

    • 数据缓存:
      对于需要多次使用的数据集,可以使用Spark的cachepersist操作来提高性能,减少计算开销。

    • 分布式计算优化:
      如果数据量非常大,建议使用broadcast joins来优化Spark的Join操作,特别是在一个表非常小的时候。

    • 数据分区与并行度优化

    • 合理设置分区数:Spark 的计算任务是通过将数据分区并行处理来加速的。确保分区数与数据量及集群的计算能力匹配。一般来说,分区数应该是节点数的倍数。可以通过 spark.default.parallelismspark.sql.shuffle.partitions 来调整并行度。

    • 避免过多或过少的分区:分区太少可能导致资源浪费,分区太多则可能导致管理和调度开销增加。通常每个分区的大小应该在 100MB 左右。

    • 重新分区:对于某些操作,比如 groupByjoin,使用 repartitioncoalesce 来调整分区数,避免不必要的 shuffle 操作。

    • 数据倾斜处理

    • 数据倾斜是指某些任务的数据量过大,导致计算不均衡,从而影响集群性能。为了解决数据倾斜问题,可以考虑以下方法:

      • 广播 Join:当一张表数据很小,可以将其广播到所有节点,从而避免 shuffle 操作。使用 broadcast() 可以显式地实现这一点。
      • Salting:对于倾斜的键值,可以将键值加上随机值(盐salt,这样可以使数据更加均匀地分布。
      • 合适的 join 策略:使用 sort-merge join 或者 shuffle hash join 来避免过多的 shuffle。
    • 内存管理与资源配置

    • 内存配置:合理配置 Spark 任务的内存分配,避免因内存不足导致的垃圾回收频繁或 OOM 错误。调整以下参数:

      • spark.executor.memory:每个 Executor 的内存大小。
      • spark.driver.memory:Driver 的内存大小。
      • spark.memory.fraction:用于存储缓存数据的内存比例。
    • 数据缓存:对于重复使用的数据集,可以使用 cache()persist() 将数据存储在内存中,减少磁盘 I/O 操作。

    • 垃圾回收调优:Spark 的 JVM 堆内存管理可能影响性能,调节 JVM 的垃圾回收参数可以提高性能。比如,增加 spark.executor.extraJavaOptions 来优化 GC(垃圾回收)设置。

    • 避免不必要的 Shuffle 操作

    • Shuffle 操作会导致网络 I/O,增加计算延迟。为了减少 shuffle 操作,应该尽量避免以下场景:

      • 不必要的 groupBy:只有在需要进行聚合或分组时,才进行 groupBy 操作。
      • 避免多次 shuffle:可以通过调整作业中的计算顺序或使用 coalesce() 将多个分区合并成一个,减少 shuffle 操作。
      • 缓存中间结果:对于需要多次 shuffle 的中间结果,可以考虑缓存它们,以避免多次计算。
    • 合适的 Spark SQL 优化

    • 使用 Spark SQL:Spark SQL 在查询优化方面有很好的表现,特别是通过 Catalyst 优化器和 Tungsten 执行引擎。通过将计算任务转换为 SQL 查询,Spark 能自动进行一些优化(如谓词下推、常量折叠等)。

    • 使用 DataFrame 和 Dataset API:尽量避免使用 RDD,使用 DataFrame 和 Dataset API 提供的更高层次的抽象。它们能够自动利用 Spark SQL 优化器进行优化。

    • 调整 Shuffle 操作和文件格式

    • 选择合适的文件格式:选择合适的文件格式(如 Parquet 或 ORC)可以显著提高 Spark 任务的性能。相对于传统的 CSV 或 JSON 格式,这些列式存储格式更适合分布式计算,提供了压缩、分区和查询优化的优势。

    • 避免过多的小文件:Spark 对大量小文件的处理效率较低,因此要尽量避免生成小文件。在写入输出时,使用 coalesce()repartition() 来合并小文件。

    • 集群资源管理

    • 合理的资源分配:合理配置 Spark 集群的资源分配(如 CPU 核心数、内存大小等),确保资源得到充分利用。通过调整以下参数来控制资源的分配:

      • spark.executor.cores:每个 Executor 使用的 CPU 核心数。
      • spark.executor.memory:每个 Executor 的内存大小。
      • spark.driver.cores:Driver 端使用的 CPU 核心数。
    • 资源过载预防:避免将过多任务分配给少量 Executor,防止资源过载,可以通过动态资源分配(如启用 spark.dynamicAllocation.enabled)来确保资源的合理分配。

    • 并行任务和调度优化

    • 任务调度优化:使用 spark.sql.shuffle.partitions 调整 SQL 操作中的 shuffle 分区数,防止 Spark 在 Shuffle 操作中进行过多的并行任务。

    • 避免跨节点通信:尽量将计算局限于单个节点内,以减少网络通信开销。

    • 监控与调试

    • 使用 Spark UI:Spark 提供了一个强大的 Web UI,可以查看各个阶段的任务执行情况、存储情况和执行时间,帮助找出瓶颈。

    • 日志与指标监控:监控作业的执行日志,尤其是在使用 YARN 或 Kubernetes 时,查看资源分配和作业状态,优化集群资源使用。

    • 调试工具:使用 Spark 的调试工具和 Profiler 来进一步识别和优化性能瓶颈。

    • 优化 I/O 操作

    • 压缩与序列化:在数据存储时,使用压缩格式(如 Parquet、ORC)和高效的序列化格式(如 Kryo)来减少磁盘 I/O 和网络传输开销。

    • 持久化优化:对于经常使用的中间结果,可以在内存或磁盘中持久化数据,但应根据数据量大小和集群资源来选择存储方式。

  • Hive优化:

    • Parquet格式: 使用Parquet等列式存储格式,以提高读取性能,并减少存储空间。

    • 分区管理: 分区表可以大大提高查询效率,尤其是在大规模数据查询时。建议根据业务需求选择合理的分区字段(例如日期、地区等)。

    • 表结构优化: 使用合适的数据类型,并避免复杂的嵌套结构,以提高查询性能。

    • 表和分区设计优化

    • 使用分区 (Partitioning)

      • 对大数据表进行分区(例如,按日期、地区等字段分区)可以显著提高查询性能,避免扫描整个表,减少 I/O 操作。
      • 选择合适的分区字段非常重要,避免分区过多或过少。
    • 使用桶 (Bucketing)

      • 在表上应用桶化可以进一步优化查询性能,特别是对于涉及大规模 JOIN 操作的查询。桶化会将数据根据特定的字段值分割成多个小文件,提高查询的并行度。
      • 在执行 JOIN 操作时,Hive 会自动使用桶化表的映射关系来减少数据的扫描量和 shuffle 过程。
    • 合理选择主键

      • 虽然 Hive 本身不直接支持主键和外键约束,但可以设计合适的字段用于去重操作,从而减少存储空间和查询时间。
    • 查询优化

    • 避免全表扫描 (Full Table Scan)

      • 使用 WHERE 子句过滤条件来减少扫描的行数,尽量避免全表扫描。
      • 尽量避免在 WHERE 子句中使用非索引字段或复杂的计算。
    • 使用列裁剪 (Column Pruning)

      • 仅选择必要的列进行查询,避免在查询中选择不需要的列,减少数据的传输和 I/O 开销。
    • 查询推理优化

      • Hive 允许在查询中推断一些优化。例如,Hive 会在查询执行时根据查询条件自动对某些操作进行合并(如合并 JOINGROUP BY 操作),尽量减少中间数据的生成和网络传输。
    • 执行引擎优化

    • 开启 Tez 或 Spark 作为执行引擎

      • Hive 传统上使用 MapReduce 作为查询执行引擎,但这通常会有较大的启动开销和较慢的执行速度。可以将执行引擎切换为 Tez 或 Spark,以提高查询性能。
    • 调整执行引擎参数

      • 根据不同的执行引擎,调整相关的参数(如 Tez 的 tez.am.resource.memory.mb 或 Spark 的 spark.sql.shuffle.partitions)以优化作业的资源使用。
    • 数据存储格式优化

    • 使用合适的文件格式

      • Hive 支持多种数据存储格式,选择合适的文件格式可以显著提升查询性能。常见的优化格式包括:
        • ORC (Optimized Row Columnar):适合大数据量查询,支持列式存储和高效压缩,读取速度较快。
        • Parquet:也支持列式存储,尤其适用于结构化数据,能够提供压缩和分区查询优化。
        • Avro:适合用于 ETL 处理,支持复杂数据类型,但在读取性能上逊色于 ORC 和 Parquet。
      • 对于查询密集型的应用,推荐使用 ORCParquet 格式,因其高效的列式存储和压缩能力。
    • 优化执行计划

    • 开启查询执行计划(Explain)

      • 使用 EXPLAIN 语句查看查询的执行计划,了解数据如何被处理、Join 类型以及是否涉及全表扫描等。通过分析执行计划来找出性能瓶颈。
    • 使用索引(Indexing)

      • 创建适当的索引(如基于 WHERE 子句中的常用字段)可以提高查询性能,尤其是在大表和复杂查询的情况下。Hive 允许为非分区表创建索引,但要根据实际情况选择性使用。
    • 内存和资源配置优化

    • 调整 JVM 内存设置

      • 通过调整 Hive、Tez、Spark 等执行引擎的 JVM 参数,如堆内存(-Xmx)、GC 策略(-XX:ParallelGCThreads)等,可以优化性能。
    • 资源分配(Resource Allocation)

      • 合理配置集群资源,如 Map/Reduce 的内存和 CPU 核心数目,确保 Hive 作业不会因为资源不足而导致慢查询。
    • 增加并行度(Parallelism)

      • 调整参数以增加查询的并行度,例如 mapreduce.map.memory.mbmapreduce.reduce.memory.mb 等,可以提高作业的执行效率。
    • 缓存和物化视图

    • 使用结果缓存

      • 对于频繁执行的查询,可以考虑使用结果缓存(如 Apache Hive 中的 Hive-on-TezHive-on-Spark)来缓存中间结果,避免重复计算。
    • 物化视图 (Materialized Views)

      • 对于一些计算复杂、查询频繁的 SQL 语句,可以使用物化视图存储预计算结果,避免每次查询都进行复杂的计算。
    • 分布式计算优化

    • 调整 Hive 的 mapreduce 参数

      • mapreduce.input.fileinputformat.split.maxsizemapreduce.input.fileinputformat.split.minsize,根据文件的大小和集群负载情况调整,确保数据的拆分合理,以避免过多的小文件。
    • 减少 MapReduce 任务数

      • 可以通过调整 mapreduce.map.output.collector.classhive.exec.reducers.bytes.per.reducer 等参数,控制最终的 MapReduce 任务数量,避免产生过多的小任务,影响集群性能。
    • 小文件优化

    • 避免小文件

      • 在 Hive 中生成大量小文件会导致 I/O 性能瓶颈,建议将数据进行合并(使用 MERGE 语句或 hive.merge.smallfiles.avgsize 配置),以减少小文件带来的问题。
    • 动态分区合并

      • 对动态分区进行合并,避免每个查询生成一个独立的输出文件。
    • 定期清理和维护

    • 统计信息收集

      • 使用 ANALYZE TABLE 命令定期收集表和分区的统计信息,帮助 Hive 更好地优化查询计划。
    • 清理不必要的临时数据

      • 定期清理 Hive 中的临时文件和不再需要的数据,以释放存储资源并提高查询效率。
    • Hadoop集群设置优化

      • HDFS块大小:

        • 增大HDFS块大小(例如设置为128MB或256MB)。大块大小减少了NameNode的负载,并提高了数据读取效率,特别是在进行大数据集的扫描时。
      • 副本数(Replication Factor):

        • 根据数据的可靠性需求调整副本数。较高的副本数增加存储空间需求,但能提高数据的冗余性和可用性。
      • DataNode数量:

        • 增加DataNode节点数量可以提升数据存储能力和并行处理能力,降低单一节点的负载。
      • NameNode性能:

        • 配置足够的内存和计算资源给NameNode,以避免性能瓶颈。
        • 使用Hadoop Federation(命名空间分片)来减轻单一NameNode的负担。
      • YARN调度器配置:

        • 使用适当的调度器(例如CapacityScheduler或FairScheduler),并合理配置资源池,确保集群资源得到有效利用。
        • 调整YARN的内存分配(如map和reduce任务的内存设置),避免内存不足或过度分配。
    • MapReduce作业优化

      • 合适的Map/Reduce任务数:

        • 根据数据量调整Map和Reduce的任务数。过多的任务会增加启动开销,过少的任务会导致计算资源浪费。
        • 通过mapreduce.job.mapsmapreduce.job.reduces配置来调整任务数。
      • 合适的Splits配置:

        • 在Map任务中,合理地配置Splits大小。Splits过小会增加任务的启动和调度开销,过大会导致单个任务的负载过高。
        • 使用mapreduce.input.fileinputformat.split.maxsize来控制每个split的最大大小。
      • Map和Reduce的内存调整:

        • 调整Map和Reduce任务的内存设置,避免发生内存溢出(OutOfMemoryError)或频繁的垃圾回收。通过mapreduce.map.memory.mbmapreduce.reduce.memory.mb进行配置。
      • 数据压缩:

        • 使用合适的数据压缩格式(例如Snappy、LZO、Gzip等)来减少磁盘I/O和网络带宽消耗。Hadoop支持多种压缩格式,可以在MapReduce任务中直接使用。
      • 优化Reduce阶段:

        • 适当增加Reduce任务的数量,避免单一的Reduce任务成为瓶颈。
        • 在Reduce阶段使用适当的排序和合并方法,减少不必要的计算。
      • 避免数据倾斜:

        • 在Reduce任务中,如果某些键的值过于集中,会导致数据倾斜。可以通过使用自定义的Partitioner,或者在Map阶段对数据进行预处理来减少数据倾斜。
    • Hadoop配置文件优化

      • MapReduce任务参数:

        • mapreduce.input.fileinputformat.split.minsize: 调整每个Map任务最小的输入数据量。
        • mapreduce.task.io.sort.mb: 设置Map任务排序阶段的内存。
        • mapreduce.reduce.shuffle.parallelcopies: 增加Reduce任务阶段的并行复制数量,减少shuffle的瓶颈。
      • YARN配置:

        • yarn.nodemanager.resource.memory-mb: 配置每个NodeManager可用的最大内存。
        • yarn.scheduler.maximum-allocation-mb: 控制YARN集群中每个容器可分配的最大内存。
        • yarn.nodemanager.resource.cpu-vcores: 配置每个NodeManager可用的CPU核心数。
      • HDFS配置:

        • dfs.replication: 设置HDFS数据块的副本数量。根据数据的可靠性需求进行调整。
        • dfs.blocksize: 设置HDFS数据块的大小,适当增大块大小可以提高吞吐量。
    • 数据本地性和任务调度优化

      • 数据本地性:
        • 使用YARN的本地性优化策略,如数据本地(DataLocality)来确保任务尽可能在存储数据的节点上执行,从而减少网络传输延迟。
        • 将作业的输入数据预先分配到节点上,以便任务能够在本地处理。
  • MapReduce任务调度:

    • 使用不同的调度器(如FairScheduler、CapacityScheduler)来根据任务优先级、资源需求和公平性策略来分配资源。

    • 设置适当的优先级和资源限制,避免过多低优先级作业占用过多资源。

    • 使用Spark等替代框架

      • 集成其他大数据框架:

        • 在一些特定场景下,Hadoop MapReduce的性能可能不如Spark等计算框架。如果任务对延迟要求较高或需要复杂的计算,可以考虑将Spark集成到Hadoop生态中,利用Spark更强大的内存计算能力。
      • 使用Hive、HBase等工具:

        • 对于结构化数据,可以使用Hive进行SQL查询优化。Hive支持与Hadoop的集成,并通过分区、索引等功能提高查询性能。
        • 使用HBase进行低延迟的随机读取和写入操作。
    • 监控与故障排除

      • 性能监控:

        • 定期监控Hadoop集群的性能指标,使用Hadoop自带的Web UI、Ganglia或其他监控工具(如Prometheus、Grafana)来检查任务执行情况、节点资源利用率等。
      • 日志分析:

        • 通过分析MapReduce、YARN、HDFS等日志,找出性能瓶颈和失败原因。

3. 集群与资源管理

  • EMR集群配置:

    • 在EMR集群上运行Spark和Hive时,合理配置EC2实例类型和数量。根据数据量和任务的复杂性,选择合适的实例类型(如r5.xlargem5.2xlarge等)来平衡计算与存储需求。
    • Auto-scaling: 利用EMR的自动扩展功能,根据负载自动增加或减少节点数,确保资源的高效利用。
    • Spot Instances: 使用Spot实例可以显著降低成本,但需要处理中断问题,可以结合On-Demand实例进行混合部署。
  • 资源监控:

    • 使用AWS CloudWatch监控EMR集群和Spark任务的运行状况,并配置报警以便及时发现集群资源瓶颈或故障。
    • 结合AWS EMR的日志管理(如CloudWatch Logs)进行Spark任务的日志分析,以便后期调优。

4. ETL流程管理与调度

  • Airflow DAG设计:

    • 将ETL任务划分为多个子任务(task),并合理设置任务的依赖关系。每个子任务对应一个Spark作业或Hive查询。
    • 在Airflow中,使用EmrStepOperator来提交Spark作业,使用EmrCreateJobFlowOperator来创建EMR集群,EmrTerminateJobFlowOperator来销毁EMR集群。
    • 确保Airflow DAG的任务依赖关系清晰,任务失败时能够自动重试。
  • Airflow与EMR集群的集成:

    • 动态集群管理: 对于短期任务,建议在每次ETL执行时动态创建EMR集群,任务完成后自动销毁,节省成本。
    • 集群重用: 对于持续运行的ETL任务,可以考虑重用已有的EMR集群,而不是每次都创建新的集群。
    • DAG调度: 根据业务需求设定ETL任务的调度频率(如每日、每小时等)。Airflow支持多种调度方式,可以通过CRON表达式灵活配置。

5. 数据质量与错误处理

  • 数据校验: 在ETL过程中,添加数据校验任务,确保输入数据和输出数据的质量。例如,校验数据完整性、数据格式等。
  • 错误处理机制: 在Spark和Hive作业中添加合适的异常处理逻辑,如数据处理失败时,Airflow能够自动重试任务或发出报警通知。

6. 安全性

  • IAM角色与权限: 为EMR、Airflow以及其他AWS服务(如S3、RDS、CloudWatch等)配置适当的IAM角色和权限,以确保数据的安全性和合规性。
  • 数据加密: 在S3中存储数据时,启用数据加密(SSE-S3或SSE-KMS)。同时,考虑加密传输过程中使用的Spark和Hive数据。

7. 成本管理

  • 成本监控: 利用AWS的成本管理工具,监控集群运行成本,确保合理配置实例类型与数量。
  • 数据存储: 优化存储成本,定期清理不需要的数据,使用低频存储等。

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

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

相关文章

CNCF云原生生态版图

CNCF云原生生态版图 概述什么是云原生生态版图如何使用生态版图 项目和产品(Projects and products)会员(Members)认证合作伙伴与提供商(Certified partners and providers)无服务(Serverless&a…

【java】finalize方法

目录 1. 说明2. 调用过程3. 注意事项 1. 说明 1.finalize方法是Java中Object类的一个方法。2.finalize方法用于在对象被垃圾回收之前执行一些清理工作。3.当JVM(Java虚拟机)确定一个对象不再被引用、即将被回收时,会调用该对象的finalize方法…

小程序开发实战项目:构建简易待办事项列表

随着移动互联网的飞速发展,小程序以其便捷性、即用即走的特点,成为了连接用户与服务的重要桥梁。无论是电商平台的购物助手,还是餐饮行业的点餐系统,小程序都在各个领域发挥着巨大的作用。 小程序开发基础 1. 小程序简介 小程序是…

wsl2子系统ubuntu发行版位置迁移步骤

默认的wsl2发行版是安装在windos的c盘,占用空间较大,有迁移需求,也可以迁移到其他电脑; 查看现有发行版信息 运行以下命令查看现有的 WSL 发行版及其状态: wsl --list --verbose# 输出示例NAME STATE …

SpringBoot基于Redis+WebSocket 实现账号单设备登录.

引言 在现代应用中,一个账号在多个设备上的同时登录可能带来安全隐患。为了解决这个问题,许多应用实现了单设备登录,确保同一个用户只能在一个设备上登录。当用户在新的设备上登录时,旧设备会被强制下线。 本文将介绍如何使用 Spr…

加速合并,音频与字幕的探讨

因上一节。合并时速度太慢了。显卡没用上。所以想快一点。1分钟的视频用了5分钟。 在合并视频时,进度条中的 now=None 通常表示当前处理的时间点没有被正确记录或显示。这可能是由于 moviepy 的内部实现细节或配置问题。为了加快视频合并速度并利用 GPU 加速,可以采取以下措…

MVC配置文件及位置

配置文件位置 默认位置 WEB-INF目录下&#xff0c;文件名&#xff1a;<servlet-name>-servlet.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.…

代码随想录算法训练营打卡第35天:背包问题

前言 zaccheo打卡代码随想录第35天 由于这段时间工作太忙了&#xff08;加上我的懒病犯了&#xff09;导致迟打卡了好几天555555.。。。 今天的主要是动态规划中的背包问题&#xff0c;这个真的是蛮难理解的&#xff0c;我把我自己强行按在椅子上半个小时一点一点的看卡哥文章…

【若依项目-RuoYi】掌握若依前端的基本流程

搞毕设项目&#xff0c;使用前后端分离技术&#xff0c;后端springBoot&#xff0c;前端vue3element plus。自己已经写好前端与后端代码&#xff0c;但想换一个前端界面所以使用到了若依&#xff0c;前前后后遇到许多坑&#xff0c;记录一下&#xff0c;方便之后能够快速回忆。…

Python 单例模式工厂模式和classmethod装饰器

前言&#xff1a; Python作为面向对象的语言&#xff0c;显然支持基本的设计模式。也具备面向对象的语言的基本封装方法&#xff1a;属性、方法、继承、多态等。但是&#xff0c;做为强大的和逐渐发展的语言&#xff0c;python也有很多高级的变种方法&#xff0c;以适应更多的…

图像边缘检测示例(综合利用阈值分割、数学形态学和边缘检测算子)

一、问题 读入一副灰度图像&#xff08;如果是彩色图像&#xff0c;可以先将其转化为灰度图像&#xff09;&#xff0c;然后提取比较理想的灰度图像边缘。这里以moon.tif为例。 二、算法 大家一开始容易想到直接利用MATLAB的内置函数edge并采用不同边缘提取算子进行边缘提取&a…

[高考] 学习数学的难点

最近想看一些机器学习的书&#xff0c;发现很多概念&#xff0c;很多符号&#xff0c;很多地方是&#xff0c;不知道具体的意思&#xff0c;不懂其中的内涵&#xff0c;所以需要再重新查阅很多的资料&#xff0c;去理解作者每句话是什么意思。 总结一下难点。以詹姆斯-斯图尔特…

R语言的数据结构-向量

【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言编程_夏天又到了的博客-CSDN博客 在R语言中&#xff0c;数据结构是非常关键的部分&#xff0c;它提…

js 抢红包场景

核心是实际业务场景问题和精度控制问题 class RedPackage {constructor(money, num) {this._money moneythis._num num}getRandomMoney () {if(this._num 1) return this._moneyconst mm parseInt(((this._money - ((this._num -1) * 0.01)) * Math.random() 0.01) * Mat…

集成方案 | Docusign + 泛微,实现全流程电子化签署!

本文将详细介绍 Docusign 与泛微的集成步骤及其效果&#xff0c;并通过实际应用场景来展示 Docusign 的强大集成能力&#xff0c;以证明 Docusign 集成功能的高效性和实用性。 在现代企业运营中&#xff0c;效率和合规性是至关重要的。泛微作为企业级办公自动化和流程管理的解决…

Docker Compose应用实战

文章目录 1、使用Docker Compose必要性及定义2、Docker Compose应用参考资料3、Docker Compose应用最佳实践步骤1_概念2_步骤 4、Docker Compose安装5、Docker Compose应用案例1_网站文件准备2_Dockerfile文件准备3_Compose文件准备4_使用docker-compose up启动容器5_访问6_常见…

51c大模型~合集88

我自己的原文哦~ https://blog.51cto.com/whaosoft/12805165 #Number Cookbook 数字比你想得更复杂——一文带你了解大模型数字处理能力的方方面面 目前大语言模型&#xff08;Large Language Models, LLMs&#xff09;的推理能力备受关注。从思维链&#xff08;Chain of…

LVS能否实现两台服务器的负载均衡

LVS能否实现两台服务器的负载均衡 是的&#xff0c;LVS&#xff08;Linux Virtual Server&#xff09;可以实现两台服务器的负载均衡&#xff0c;并且它非常适合这种场景。 LVS&#xff08;Linux Virtual Server&#xff09;简介&#xff1a; LVS 是一种基于 Linux 的负载均…

STP(生成树协议)

STP的基本概念 概述 STP是一个用于局域网中消除环路的协议。运行该协议的设备通过彼此交互信息而发现网络中的环路&#xff0c;并对某些接口进行阻塞以消除环路。STP在网络中运行后会持续监控网络的状态&#xff0c;当网络出现拓扑变更时&#xff0c;STP能够感知并且进行自动…

GLM-4-Plus初体验

引言&#xff1a;为什么高效的内容创作如此重要&#xff1f; 在当前竞争激烈的市场环境中&#xff0c;内容创作已成为品牌成功的重要支柱。无论是撰写营销文案、博客文章、社交媒体帖子&#xff0c;还是制作广告&#xff0c;优质的内容不仅能够帮助品牌吸引目标受众的注意力&a…