gitweixin
  • 首页
  • 小程序代码
    • 资讯读书
    • 工具类
    • O2O
    • 地图定位
    • 社交
    • 行业软件
    • 电商类
    • 互联网类
    • 企业类
    • UI控件
  • 大数据开发
    • Hadoop
    • Spark
    • Hbase
    • Elasticsearch
    • Kafka
    • Flink
    • 数据仓库
    • 数据挖掘
    • flume
    • Kafka
    • Hive
    • shardingsphere
    • solr
  • 开发博客
    • Android
    • php
    • python
    • 运维
    • 技术架构
    • 数据库
  • 程序员网赚
  • bug清单
  • 量化投资
  • 在线查询工具
    • 去行号
    • 在线时间戳转换工具
    • 免费图片批量修改尺寸在线工具
    • SVG转JPG在线工具

分类归档Spark

精品微信小程序开发门户,代码全部亲测可用

  • 首页   /  大数据开发
  • 分类归档: "Spark"
  • ( 页面3 )
Spark 6月 16,2023

spark sql多个指标合并为1条sql

在 Spark SQL 指标开发中,使用一条 SQL 语句来计算多个指标是常见的做法。以下是几种常用的方法:

  1. 使用子查询:将多个指标的计算逻辑放在子查询中,再在外层 SELECT 语句中进行聚合。这种方式可以避免代码冗余,但可能会降低 SQL 语句的可读性。
  2. 使用 Window 函数:使用 Window 函数可以在一条 SQL 语句中计算多个指标,并且可以避免对同一个数据集进行多次扫描。具体操作是使用 over() 函数配合 sum、avg、max、min等聚合函数。这种方式相比子查询可以提升 SQL 的效率,但需要熟练掌握 Window 函数的使用方法。
  3. 使用 UDAF:如果需要计算的指标比较复杂,可以考虑开发自定义聚合函数(UDAF),这样可以将计算逻辑封装到统一的函数中,提高代码的可复用性和可维护性。

例子:

  1. 使用子查询进行多指标计算

假设我们有一个订单表 orders,包含以下字段:order_id, customer_id, order_date, amount。我们需要计算每个客户在 2022 年的订单数量和总订单金额。可以使用如下 SQL 语句实现:

SELECT 
  customer_id, 
  (SELECT COUNT(*) 
   FROM orders 
   WHERE customer_id = o.customer_id AND YEAR(order_date) = 2022) AS order_count, 
  (SELECT SUM(amount) 
   FROM orders 
   WHERE customer_id = o.customer_id AND YEAR(order_date) = 2022) AS total_amount 
FROM orders o 
GROUP BY customer_id;

这个 SQL 语句使用了两个子查询来计算每个客户在 2022 年的订单数量和总订单金额。子查询返回的结果会作为 select 语句中的一个列,因此可以使用 group by 对客户进行分组。

  1. 使用 Window 函数进行多指标计算

使用 Window 函数可以更方便地对查询结果进行分析。假设我们有一个销售表 sales,包含以下字段:sale_id, customer_id, product_id, sale_date, sale_amount。我们需要计算以下指标:每个客户的总销售额、每个客户的最大销售额、每个客户的销售额排名。可以使用如下 SQL 语句实现:

SELECT 
  customer_id, 
  SUM(sale_amount) OVER (PARTITION BY customer_id) AS total_sale, 
  MAX(sale_amount) OVER (PARTITION BY customer_id) AS max_sale, 
  RANK() OVER (PARTITION BY customer_id ORDER BY sale_amount DESC) AS sale_rank 
FROM sales;

这个 SQL 语句使用了三个 Window 函数,分别计算每个客户的总销售额、最大销售额和销售额排名。这里我们将结果按客户分组,然后使用了 Partition By 子句指定了客户维度。

  1. 使用自定义聚合函数进行多指标计算

自定义聚合函数(UDAF)可以针对特定的需求编写自己的聚合逻辑。以计算最小值、最大值和平均值为例,我们可以实现一个自定义平均值 UDAF:

import org.apache.spark.sql.expressions.MutableAggregationBuffer
import org.apache.spark.sql.expressions.UserDefinedAggregateFunction
import org.apache.spark.sql.Row
import org.apache.spark.sql.types._
 
class CustomAvg extends UserDefinedAggregateFunction {
 
  // 输入参数的数据类型
  def inputSchema: StructType = new StructType().add("inputColumn", DoubleType)
 
  // 中间结果的数据类型
  def bufferSchema: StructType = new StructType().add("sum", DoubleType).add("count", LongType)
 
  // 输出结果的数据类型
  def dataType: DataType = DoubleType
 
  // 是否固定输入参数类型
  def deterministic: Boolean = true
 
  // 初始化中间结果缓存
  def initialize(buffer: MutableAggregationBuffer): Unit = {
    buffer(0) = 0.0 // sum
    buffer(1) = 0L // count
  }
 
  // 更新中间结果缓存
  def update(buffer: MutableAggregationBuffer, input: Row): Unit = {
    if (!input.isNullAt(0)) {
      buffer(0) = buffer.getDouble(0) + input.getDouble(0)
      buffer(1) = buffer.getLong(1) + 1
    }
  }
 
  // 合并中间结果缓存
  def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit = {
    buffer1(0) = buffer1.getDouble(0) + buffer2.getDouble(0)
    buffer1(1) = buffer1.getLong(1) + buffer2.getLong(1)
  }
 
  // 计算最终结果
  def evaluate(buffer: Row): Any = {
    buffer.getDouble(0) / buffer.getLong(1)
  }
}

这里我们实现了一个 CustomAvg UDAF,可以通过输入若干个 Double 类型的值,计算它们的平均值并返回。我们可以在 SparkSQL 中使用这个 UDAF 计算多个指标的平均值:

SELECT 
  CustomAvg(column1) AS avg1, 
  CustomAvg(column2) AS avg2, 
  CustomAvg(column3) AS avg3 
FROM table;

这个 SQL 语句使用了 CustomAvg UDAF 计算了三个列的平均值,可以根据实际需求进行扩展。

关注公众号“大模型全栈程序员”回复“大数据面试”获取800页左右大数据面试宝典 ,回复“大数据”获取多本大数据电子书

作者 east
Spark 5月 17,2023

通过可观察性优化 Spark 中的性能

Apache Spark 为大数据行业的企业提供了许多好处。然而,与任何技术解决方案一样,它也伴随着挑战和障碍。通过优先考虑强调可观察性的工具,您可以优化 Spark 作业的性能,并开始深入了解性能问题的原因,而不仅仅是问题的本质。

Apache Spark 架构为大数据行业提供非常有用的工具有几个原因:

无论 Spark 多么强大,它仍然面临着一系列挑战。因此:根据我们的 2020 年大数据性能报告,观察到 Spark 作业的失败频率是其他作业的四到七倍。

此外,该报告进一步揭示了在没有 Spark 性能调整和优化的情况下:

这就是为什么公司需要优化 Spark 的性能。如果不应用 Spark 优化技术,集群将继续过度配置和利用资源。据一位分析师称,在全球范围内,仅闲置资源一项就产生了约 88 亿美元的年增长率。

在优化 Spark 工作负载和作业时,关键是可观察性。

以内存利用率为例。也许用户需要分配更多内存以避免垃圾回收。或者,在多租户环境中,用户可能分配了过多的内存,导致租户之间出现排队等问题。如果没有正确的优化解决方案,Spark 用户对如何为他们的集群正确分配内存一无所知。

Spark 性能调优的另一个机会是减少(如果不能避免的话)数据倾斜。 Spark 对数据倾斜很敏感,对于高度分布式和瘫痪的应用程序来说,它可能是非常具有破坏性的。数据倾斜导致某些应用程序元素的工作时间超过它们应有的时间,而其他计算资源则闲置,未得到充分利用。有助于优化 Spark 性能的工具应该跟踪数据倾斜并提出有效的建议来纠正它。

那么如何优化 Spark 的性能并衡量成功呢?再次,通过可观察性。

Spark 用户最终需要说,“嘿,我的应用程序现在运行无故障,而且我始终如一地满足我的 SLA。”为此,他们需要合适的可观察性工具来帮助他们确定内存利用率、数据倾斜以及大多数公司工作的多租户环境中可能出现的其他问题。

作者 east
Spark 5月 17,2023

银行业大数据分析:如何减少超支

在银行业有效利用大数据分析现在是一项竞争要求。大数据在银行业中的作用是多方面的。最常见的用例是访问各种类型的第一方数据,以更好地了解客户并根据他们的需求定制产品和解决方案。其他大数据银行业务示例和用例包括利用命令式数据协助银行处理 Customer 360,以及通过高级财务数据分析进行风险管理。总体而言,银行业通过大数据分析实现的自动化也最大限度地减少了人类情感和偏见对金融交易的影响。

然而,许多银行每年花费超过 1 亿美元来继续获得银行业大数据分析的好处。其中一些是不必要的超支。公司需要采用新的技术工具来帮助他们优化性能并减少超支。

多租户数据湖的挑战

所有主要银行都在随时存储和访问大量数据。这些数据位于每年都在扩展的数据湖中。通常,它们的大小会增加一倍以上。

曾几何时,大数据银行示例和用例是分开的。将有一个商业银行数据湖,一个零售数据湖,一个投资数据湖,一个家庭保险数据湖,等等。但今天,越来越多的数据涌入,形成了一个巨大的数据湖。银行的各个部分充当租户,访问同一个数据湖。这种多租户数据湖安排给系统和服务器带来了巨大压力。通常,在银行业有效使用大数据分析的能力会逐渐停止。

多租户数据湖还带来了另一个问题:数据隐私。关于银行和金融机构如何处理大量不同的、非结构化的私人数据,存在很多紧张的讨论。并且有充分的理由;当谈到银行业的数据分析时,个人信息是从消费者行为分析中收集的,他们的决策是使用大量杂乱无章的信息做出的。当然,安全协议已经到位,可以保护如此庞大的数据集合。但是,当每个人都浸入同一个湖中时,数据泄露的风险就会增加。

银行如何最终超支以跟上

金融服务公司通常如何应对多租户数据湖的挑战?通过增加基础设施。根据 ResearchandMarkets 的一份报告,在大数据和人工智能上投资至少 5000 万美元的公司去年增长了 7%。在全球范围内,每年约有 1800 亿美元用于大数据分析投资。

简而言之,在银行业有效利用大数据分析的压力促使银行迅速投资额外的本地和云基础设施,以跟上不断增长的数据量。这会导致 Dell 或 IBM 的巨额硬件账单,和/或 AWS 的巨额云账单。

此外,运营基础设施本身也需要花钱。指挥基础设施和不断扩大的数据湖的管理和维护需要具有专业知识的专业人员的服务。成本迅速增加,许多银行每年花费超过 1 亿美元来继续获得银行业大数据分析的好处。

作者 east
Spark 5月 17,2023

为什么 Spark 这么慢?今天优化 Spark 的 5 种方法

在竞争日益激烈的世界中寻找优势?通过 Kubernetes 2023 状态揭示 Kubernetes 可以为您的业务做些什么。现在阅读以探索如何利用 Kubernetes 的优势、解锁潜在解决方案并克服挑战。

当 Apache Spark 运行良好时,它确实运行良好。但有时,用户会发现自己在问这个令人沮丧的问题。

Spark之所以如此受欢迎,是因为它比传统的数据处理解决方案能够执行更多的计算和更多的流处理。与 MapReduce 等流行的传统系统相比,Spark 的速度要快 10-100 倍。但是,虽然 Spark 能够处理范围广泛的工作负载和大数据集,但有时也会遇到困难。这就是原因,这就是您可以采取的措施。

所以:您已经尝试了一些 Apache Spark 性能调优技术,但您的应用程序仍然很慢。此时,是时候深入了解您的 Spark 架构,并确定导致您的实例运行缓慢的原因。

驱动故障

在 Spark 架构中,驱动程序充当编排器。因此,它配备的内存少于执行程序。当驱动程序遇到 OutOfMemory (OOM) 错误时,可能是以下原因造成的:

简而言之,当驱动程序执行需要更多内存的服务或尝试使用比分配的内存更多的内存时,就会发生 OOM 错误。解决这种情况的两个有效的 Spark 调优技巧是:

高并发

有时,Spark 运行缓慢是因为运行的并发任务太多。

高并发能力是一个有益的特性,因为它提供了 Spark 原生的细粒度共享。这会导致最大的资源利用率,同时减少查询延迟。 Spark 将作业和查询划分为多个阶段,并将每个阶段分解为多个任务。 Spark 会根据多种因素并发执行这些任务。

但是,并行执行的任务数基于 spark.executor.cores 属性。虽然高并发意味着要执行多个任务,但如果该值设置得太高而没有适当考虑内存,执行程序将失败。

低效查询

为什么 Spark 这么慢?也许你有一个写得不好的查询潜伏在某处。

按照设计,Spark 的 Catalyst 引擎会自动尝试最大程度地优化查询。但是,如果查询本身写得不好,任何优化工作都注定会失败。例如,一个查询被编程为选择 Parquet/ORC 表的所有列。每列都需要某种程度的内存中列批处理状态。如果查询选择所有列,则会导致更高的开销。

一个好的查询读取尽可能少的列。一个好的 Spark 性能调优实践是尽可能使用过滤器。这有助于限制获取到执行程序的数据。

另一个好技巧是使用分区修剪。将查询转换为使用分区列是优化查询的一种方法,因为它可以极大地限制数据移动。

配置不正确

获得正确的内存配置对于 Spark 应用程序的整体性能至关重要。

每个 Spark 应用程序都有一组不同的内存和缓存要求。如果配置不正确,Spark 应用程序会变慢或崩溃。深入查看 spark.executor.memory 或 spark.driver.memory 值将有助于确定工作负载是否需要更多或更少的内存。

YARN 容器内存开销也会导致 Spark 应用程序变慢,因为 YARN 需要更长的时间来分配更大的内存池。实际情况是 YARN 在容器中运行每个 Spark 组件,例如驱动程序和执行程序。它产生的开销内存实际上是用于JVM(驱动程序)开销、interned字符串和JVM的其他元数据的堆外内存。

当由于 YARN 内存开销导致 Spark 性能下降时,您需要将 spark.yarn.executor.memoryOverhead 设置为正确的值。通常,为开销分配的理想内存量是执行程序内存的 10%。

您需要采取某些步骤来确保 Spark 运行不慢。以下是使您的 Spark 架构、节点和应用程序以最佳水平运行的一些有效方法。

数据序列化

这种特殊的 Spark 优化技术将内存中的数据结构转换为可以存储在文件中或通过网络传输的不同格式。使用这种策略,您可以显着提高分布式应用程序的性能。两种流行的数据序列化方法是:

Java 序列化——您使用 ObjectOutputStream 框架序列化数据,并利用 java.io.Externalizable 来完全控制序列化的性能。 Java 序列化提供轻量级持久性。

Kyro 序列化——Spark 利用 Kryo 序列化库 (v4) 比 Java 序列化更快地序列化对象。这是一种更紧凑的方法。要通过使用 Kyro 序列化真正提高 Spark 应用程序的性能,必须通过 registerKryoClasses 方法注册这些类。

缓存

缓存是一种高效的优化技术,在处理重复需要和查询的数据时使用。 Cache() 和 persist() 非常适合存储数据集、RDD 和 DataFrame 的计算。

需要记住的是,cache() 将数据放入内存中,而 persist() 将数据存储在用户指定或定义的存储级别中。缓存有助于降低成本并在处理重复计算时节省时间,因为从内存读取数据比从磁盘读取数据快得多。

数据结构调整

数据结构调整减少了 Spark 内存消耗。数据结构调优通常包括:

垃圾收集优化

垃圾回收是一种内存管理工具。每个应用程序都将数据存储在内存中,内存中的数据有一个生命周期。垃圾收集标记哪些数据不再需要,标记为删除,然后删除。删除发生在应用程序暂停期间。这些暂停是要避免的。当垃圾收集成为瓶颈时,使用带有 -XX:+UseG1GC 的 G1GC 垃圾收集器已被证明效率更高。

Spark 并不总是完美运行。这是一个很棒的数据处理平台,但不能让它完全自动运行。一致的 Spark 性能调优将帮助您的 Spark 基础设施以最佳水平运行

下次您发现自己问“为什么 Spark 这么慢?”时,请深入了解 Spark 架构并仔细研究。前面提到的 Spark 性能缓慢的原因可能只是罪魁祸首之一,而提到的提高性能的技巧可能是您需要改进的地方。

作者 east
Spark 5月 14,2023

来自 Spark 老手的 3 个 Spark 性能调优最佳实践

大数据世界中的许多人已经熟悉 Spark。但是新手可能会疑惑:什么是Spark?即使您是用户,互联网上也有很多 Spark 性能调优技巧。你如何从谷壳中挑选出小麦?

Spark 是一种开源分布式处理框架,旨在以比 Hadoop 更快的速度运行大数据工作负载,而且资源更少。 Spark 利用内存缓存和优化的查询执行对任何大小的数据执行快速查询。

在当今的大数据世界中,Spark 技术是一个核心工具。但是,它非常复杂,如果没有适当优化,可能会出现一系列问题。如果没有正确的 Spark 性能调优方法,您将面临许多 Spark 性能问题的风险,包括超支和次优性能。

Spark 性能调优是快速及时地更改 Spark 配置以确保优化所有流程和资源并顺利运行的过程。此 Spark 优化过程使用户能够实现 SLA 级别的 Spark 性能,同时缓解资源瓶颈并防止性能问题。

什么是 Spark Schema 调优?

以下是 Spark 性能调优的常用方法:

数据序列化。这个过程是指将对象转换为字节流,而相反的过程称为反序列化。序列化导致对象在网络节点上的最佳传输或在文件/内存缓冲区中的轻松存储。它通过以序列化格式存储 Spark RDD(弹性分布式数据集)来帮助减少内存使用。数据序列化有助于确保高效的资源利用和作业在精确的执行引擎上运行。数据序列化确保运行时间长的作业被终止。

内存调整。默认情况下,Java 对象的访问速度非常快。然而,他们可以轻松地使用比字段中“原始”数据多 2-5 倍的空间。通过内存调整,用户可以确定和优化对象的内存使用情况,从而提高性能。

数据结构调整。通过避免使用可能导致开销的 Java 功能,帮助减少内存消耗。

垃圾收集调整。就程序存储的 RDD 而言,垃圾收集在具有大量“搅动”的数据结构中代价高昂。通过使用具有较少对象的数据结构,垃圾收集成本大大降低。

内存管理。 Spark 利用内存进行数据存储和执行。有效的内存管理确保 Storage Memory 和 Execution Memory 和谐共存并共享彼此的可用空间。

Spark 监控工具还可以提高任何 Spark 性能调整工作的有效性。这些解决方案为用户提供了对其 Spark 应用程序的可见性、查看有价值的 Spark 指标,并通过强大的可视化跟踪应用程序执行情况。

持续和自动化的 Spark 监控使用户能够始终掌握其资源利用率。这确保他们有足够的资源以最佳方式运行他们的 Spark 实例。用户可以及时了解 Spark 核心和应用程序,使他们能够更好地理解配置并对其进行必要的更改。

我们联系了我们自己的 Spark 优化专家,现场工程师 Alex Pierce,以深入研究 Spark 技术并了解如何充分发挥 Spark 框架的作用。 Alex 最近举办了一场关于如何优化 Spark 作业并成功执行 Spark 性能调优的网络研讨会。

Alex 列出了他认为每个 Spark 用户都必须了解和实施的最佳实践的三种 Spark 优化技术。这些都是:

继续阅读我们直接从我们自己的 Spark 老手那里探索每个 Spark 性能调优技巧。

琪亚娜:大家好。我是 Pepperdata 的主持人 Kiana,我将采访 Pepperdata 现场工程师 Alex Pierce,他领导了我们最近的网络研讨会“Spark 性能管理最佳实践”。如果您还没有机会观看有关 Spark 性能调优和优化的网络研讨会,它会在本次采访所在的页面上提供链接。所以,请随时去看看。现在,让我们直接进入问题。

Kiana:在网络研讨会期间,我们对如何通过加盐优化 Spark 作业这一主题产生了浓厚的兴趣。您提到了分区大小和数据倾斜等加盐修复。您能否详细说明加盐的工作原理以及人们如何使用它来更好地管理他们的 Spark 性能?

亚历克斯:当然。当您查看要尝试执行的操作时,让我们专门查看本例中的连接,因为这是 Spark SQL 中非常常见的用例。但这是您处理具有特定维度的数据集的任何时候。假设您正在处理一年中的几个月、一周中的几天或类似的维度。这是一个非常小的键空间。一周只有7天,一年只有12个月。假设您是一家企业,或者绝大多数记录发生在星期六的公司。

因此,当我们处理数据时,假设我们正在处理一个月的数据并且我们正在对这些数据进行连接,那么在数据集和星期六的维度表将比其他任务运行更长的时间。这在 Spark 性能问题中很常见。那么加盐是做什么的——它有点像重新分区而实际上不需要重新分区你的数据。所以基本上,我们所做的就是把我们要加入的键,比方说,我们的左表,我们要让它分布得更均匀。

我们这样做的方法是附加,我应该说的最简单的方法是附加一个介于 0 和 N 之间的随机数。您可以根据环境的大小、数据集的大小、您的规模来确定需要看看,Ns应该有多大。然后我们需要在连接的另一端做同样的事情。所以现在我们需要获取维度表,我的意思是,抱歉,我们需要获取数据集表以及那些 ID 之前确实存在的地方,我们需要在该 ID 上运行相同的东西。设置为将相同的 0-N 值随机附加到这些键。

现在,这并不意味着 N 不需要匹配。如果一方的数字与另一方不匹配,那肯定有问题。但在这一点上,我们现在可以使用这些加盐键进行连接,假设在我们的工作日案例中,我们现在有 47 个键,而不是七个键。所以我们现在已经将其分布在一个更大的空间中。

这意味着,是时候真正进行连接了,而不是让一个特定的执行器来完成 80%-90% 的工作,因为数据集倾斜会得到更好的分布。现在你需要用你的数据集测试什么大小的盐最适合你,你需要记住如果你碰巧使用广播表,你的盐会增加它的大小维度表。

因此,如果您使用的是广播表,则需要密切注意自己的记忆,以确保不会炸毁执行者,而您只需要进行调整即可。这可能需要一些实验;你最了解你的数据集,所以你知道你的偏差有多大,并且你通常可以在 Pepperdata 等工具中将其可视化,以准确了解要添加多大的盐空间。但通常情况下,您会看到性能显着提高,尤其是在并行化方面。

因此,如果您处于分布式环境中,而之前您的环境中可能有 1000 台主机,但由于执行程序的密钥空间有限,您只使用了 7 台主机,现在您可以在 47 或 50 台主机上运行它。突然之间,有了通过这种 Spark 调优技术,您可以更好地使用环境的资源,您不会成为瓶颈,可能会在其他节点之一上长时间出现 CPU 瓶颈。这只是处理基于有限键空间的数据的好方法。

现在,至于它的实际代码。那里有大量的例子,甚至只是看看 DataZone 或 Stack Overflow 之类的东西。您应该能够非常简单地找到有关如何在 Spark 中的表上加盐的示例。

Kiana:是的,谢谢你的回答。那很棒。因此,您还提到,在多租户环境中,最好的 Spark 优化技术之一就是成为一名优秀的租户。这到底是什么意思?你有什么建议人们可能还没有想到吗?

亚历克斯:当然。所以这个很有趣。其中一部分是了解您所处环境的规模,一部分是了解您启动地点的提示限制,但想法是:Spark 是贪婪的。假设你正在做一些事情,即使是非常简单的事情,比如 Spark 自带的 SparkPi 示例,你要求十万个切片。现在,Spark 要征集十万个执行者。如果它得到 40,它会运行得很好,但它会一直询问,直到它得到它能得到的一切。

因此,要成为一名好租户,您可以做的一件事就是为您的要求设置一个最大值。比方说,我想运行十万个切片。我想使用 Spark 动态分配,但不要要求超过 100 个执行程序——我们知道这将为我们提供所需的性能,但会为其他用户留出可用资源,同时允许我们满足任何类型的 SLA。这是一个非常简单的例子,说明租赁如何成为一种有效的 Spark 性能调优实践。

亚历克斯:另一个需要考虑的 Spark 调优技巧是你如何调整大小。因此,如果您的数据集可以进一步细分,这再次取决于您对自己数据集的了解,那么这可能对环境更有利,而不是要求少数 90 或 100 位执行者——那听起来确实很荒谬,但我们确实看到了这一点——要求 10 到 20 个零工执行者,并进一步分解你的数据集。

这可能对你有好处,因为你更有可能在系统上获得这些执行者,而且它肯定会对尝试使用同一系统的其他人有好处。因为如果你设法在一个节点上启动一百个演出执行器,那通常是一个节点空间的 50% 以上,有时甚至可能是一个节点空间的 70%。所以第一,你将不得不等待那个空间释放出来,第二,一旦你在那里,没有其他人在那里承受工作量。因此,如果您可以分解数据集以尝试确定适合环境的大小并允许其他人同时工作,那总是更好。

这是另一个可能有点困难,但仍然不太难做的事情。我的意思是,如果您正在处理二进制 blob 数据集,并且它们只以特定大小出现,那么您无能为力。几乎所有其他方面都可以改进。有时甚至像我们的最后一个问题一样,加盐,因为也许你有一个执行者正在耗尽所有这些内存,因为那是所有数据所在的地方。

您没有解决 SKU 问题,而是一直在增加内存直到它运行。所以这是解决这个问题的一个好方法。核心方面也是一样。 CPU 的处理能力有限,如果您的代码是多线程的,有时您会使用比您要求的内核更多的内核。因此,请牢记可用的资源以及其他人正在使用的资源,并确保您做出明智的决定,这些决定既能帮助您适应那些资源受限的环境,又能让其他人在您使用时继续使用它们.

Kiana:好吧,Alex,谢谢你抽出时间来。很高兴能更深入地研究您常用的 Spark 性能调优技巧以及您在网络研讨会中谈到的一些主题。

再一次,对于我们的读者,如果您想观看完整的网络研讨会,Spark 绩效管理的最佳实践,它在本次采访所在的页面上有链接。此外,请查看有关 Spark 优化的视频,以获得更直观、更深入的演示。

如果不在对话中包括 Kubernetes,就很难讨论 Spark。许多用户在 Kubernetes 上运行 Spark,后者提供自动化和无缝的应用程序部署、管理和扩展。由于 Kubernetes 是一个开源框架,用户喜欢在 Kubernetes 上部署 Spark 并从其自动化和易于管理中受益,而无需增加成本。

也就是说,未优化的 Spark-Kubernetes 配置可能导致资源分配和利用不佳。当用户在 Kubernetes 上部署 Spark 而没有完成任何 Spark 性能调整时,这可能会导致性能不佳和成本失控。

对于开发人员来说,优化 Spark 和 Kubernetes 以最大限度地发挥这两种工具的优势、提高性能并实现所需的输出,同时保持成本可控,这一点至关重要。

作者 east
Spark 5月 12,2023

全球软件公司提高 Spark 性能并减少浪费

我们的一位客户是专门从事设计和制造软件解决方案的软件开发商。这家软件公司为工程、建筑、制造、娱乐等主要行业的一些最大组织提供服务。我们客户推出的每个新软件和更新都必须满足严格的 SLA 要求。

为确保其产品按照 SLA 的规定运行,该软件公司利用 Apache Spark 来处理和分析大量大数据并收集可操作的见解。这些见解反过来又为软件开发人员提供了有价值的信息,使他们能够快速识别和解决性能问题并推出更好的产品。

但是,该公司缺乏 Spark 方面的专业知识。最重要的是,他们没有一个全面的可观察性工具来衡量 Spark 的性能,也没有帮助他们识别和解决 Spark 带来的复杂问题。结果,软件供应商没有从其 Spark 投资中获得最大价值。直到 Pepperdata 出现并改变了公司与 Spark 的合作方式。

虽然 Spark 使这家软件公司能够分析大量大数据并获得有关绩效、客户旅程、销售等方面的可行见解,但他们未优化的 Spark 性能让他们付出了很多代价。

使情况变得更加复杂的是软件公司没有内部 Spark 专业知识。由于没有足够的 Spark 框架知识和经验,软件公司被迫做出他们认为最合乎逻辑的选择:投入更多计算资源。

虽然这样的方法让他们可以运行更多的 Spark 作业,但 Spark 性能本身并没有得到优化。他们也没有可观察性工具来查看他们的 Spark 应用程序和工作流。这导致了更多的资源和计算能力浪费。随着公司的扩张,这个问题变得更加严重。更多的客户意味着更多的 Spark 工作。随后计算消耗的增加很快耗尽了他们的大部分大数据预算。

该组织与 Spark 的斗争并不是新闻。严重依赖 Spark 处理大数据工作负载的企业也会遇到同样的困难,尤其是资源利用率低和大数据预算超支。

成本是运行像 Spark 这样的大数据架构的主要问题之一。在我们最近的 2021 年大数据云调查中,64% 的公司表示,他们在使用大数据技术和应用程序时一直在与“成本管理和控制”作斗争。

虽然大多数云提供商提供自动缩放功能以帮助企业在流量激增期间满足计算资源需求,但默认的自动缩放配置是基于峰值级别的要求。这意味着许多大数据进程和工作负载都在未经优化的情况下运行。难怪许多企业的支出比最初的大数据云预算高出 40%。

许多企业最终过度配置了计算资源。虽然这种方法可确保他们在高峰时段拥有足够的资源,但当流量低于预期时,未使用的资源就会被浪费。在大数据和云计算的世界里,未利用的资源意味着损失金钱。

这家软件公司的大数据专家承认使用最理想的配置来调整 Spark 是多么困难。但他们知道他们需要一个强大的优化解决方案来扭转局面,使 Spark 成为高效、经济的大数据引擎。

到 2020 年,他们的数据处理需求比上一年增加了 10 倍。他们需要找到一种优化和可观察性工具来控制支出并最大限度地利用计算资源。

否则,使用添加更多资源的相同方法会导致成本过高,同时还会遭受性能滞后和停机的困扰。

软件组织知道他们需要对 Spark 和整体大数据基础架构进行观察,以发现问题、提高 Spark 性能并降低 Spark 成本。

在部署他们的 Spark 可观察性工具后不久,软件开发人员就能够从他们的 Spark 框架中获得强大且可操作的见解。

作者 east
Spark 5月 12,2023

Spark Tuning 帮助您优化资源(上)

正如我们 2022 年的调查显示,Apache Spark 有望继续成为大数据最主要的大规模大数据处理平台。因此,如果 Spark 用户想充分利用他们的 Spark 环境,他们就必须学习和掌握 Spark 调优。

但是在 Spark 中调优是什么?它是如何完成的?继续阅读以了解有关 Spark 调优的更多信息。

Spark 性能调优是调整 Spark 环境配置的过程,以确保所有进程和资源都得到优化并顺利运行。为确保最佳性能并避免代价高昂的资源瓶颈,Spark 调优涉及对内存分配、核心利用率和实例配置的仔细校准。此过程可最大限度地提高系统的效率和有效性,以确保每次都能获得最佳结果。

我们已经看到许多大数据工作负载在 Spark 上运行,可以肯定的是,在可预见的未来,更多的应用程序和进程将迁移到 Spark 框架。

大多数企业都在运行 Spark,主要是在 Kubernetes 框架上。使用 Kubernetes 运行 Spark 为 Spark 应用程序提供了一个优势——支持按需自动部署,而不是利用持续运行设置的资源密集型模型。这也使您的应用程序能够轻松跨服务提供商并简化管理流程。使用 Spark-Kubernetes 配置可以提高 Spark 资源的利用率,同时降低云成本。

即使将 Spark 与 Kubernetes 一起运行具有广为人知的优势,包括更好的性能和更低的成本,但如果一切都未优化,尤其是 Spark,它可能会很快失败。我们想花一些时间更深入地探讨一个主题:通过 Spark 调优进行 Spark 优化的 Spark 优化。

Spark 开发人员在处理大量数据时需要担心很多事情:如何有效地获取数据源、执行 ETL(提取、转换、加载)操作以及大规模验证数据集。但是,当他们确保程序没有错误并在所有必要的环境中得到维护时,他们往往会忽略一些任务,例如调整 Spark 应用程序参数以获得最佳性能。

如果操作得当,调整 Spark 应用程序可以降低资源成本,同时维护关键流程的 SLA,这是本地和云环境都关心的问题。对于本地 Hadoop 环境,集群通常由多个应用程序(及其开发人员)共享。如果一个人的应用程序是资源大户,它会减慢每个人的应用程序,并冒着更高的任务失败率的风险。

随着 Spark 使用的增加,管理应用程序性能可能成为一项重大挑战。如果没有正确的方向,任何对 Spark 监控的尝试都可能很快被证明是徒劳的,而且在时间和资源上都会花费高昂的代价。这就是为什么那些缺乏关于转向哪些 Spark 指标进行优化指导的人一直在寻求专家帮助以了解这个复杂过程的原因。

大多数受访者非常关心其计算资源的资源优化,因为超过 33%(三分之一)的公司的支出超出其初始云预算的 20% 至 40%。简而言之,组织未能优化其 Spark 资源,导致超支。

在这篇博文中,我们将讨论两种 Apache Spark 优化技术:

在进入细节之前,让我们回顾一些 Spark 术语和定义:

Spark 应用程序分为多个阶段。阶段是物理执行计划中的一个步骤。它在需要随机播放(ShuffleMapStage)或阶段写入其结果并按预期终止(ResultStage)时结束。

每个阶段都分为并行执行的任务——每个分区一个任务。任务由执行者执行。

执行者是执行任务的工作者。资源(内存和 CPU 内核)在运行前由开发人员分配给执行程序。

分区是数据的逻辑块——具体来说,是弹性分布式数据集 (RDD) 的块——可以由开发人员在运行前配置。 RDD 中的分区数决定了一个阶段将执行的任务数。对于每个分区,一个任务(应用程序代码块)被提供给执行者执行。

图 1:Spark 中的数据分区

因为 Spark 应用程序可以包含许多不同类型的阶段,所以对一个阶段最佳的配置可能不适合另一个阶段。因此,Spark应用程序的Spark内存优化技术必须分阶段进行。

除了配置阶段之外,开发人员还可以控制应用程序中的任务数量(并行性)以及应用程序的执行程序大小。

使用 Spark 最大化并行性需要仔细考虑集群的核心数和分区数之间的差异。太少会导致性能低下,而太多会带来不当的间接成本。为确保并行性和效率之间的平衡,Spark 建议分区数大约是集群中核心数的三倍。

不直接的是如何选择分区的数量和执行器的大小。接下来我们将介绍它。

执行器和分区大小是开发人员通过 Spark 调优控制的两个最重要的因素。要了解它们之间的关系,我们首先需要了解 Spark 执行器如何使用内存。图 2 显示了 Spark 执行程序内存的不同区域。

图 2:Spark 执行器内存

我们可以看到有一个参数控制为执行和存储保留的执行程序内存部分:spark.memory.fraction。因此,如果我们想将 RDD 存储在内存中,我们需要我们的执行器足够大以处理存储和执行。否则,我们将面临出错的风险(在数据/计算中以及由于资源不足导致的任务失败)或应用程序运行时间过长。

另一方面,执行器的大小越大,我们可以在集群中同时运行的执行器就越少。也就是说,由于缺乏任务并行性,较大的执行程序大小经常会导致执行速度不佳。

还有为每个执行器选择 CPU 内核数量的问题,但选择是有限的。通常,1-4 个核心/执行程序的值将在实现完全写入吞吐量和不过度负担 HDFS 客户端管理并发线程的能力之间提供良好的平衡。

在处理分区和执行器时,最好的 Spark 内存优化技术之一是首先选择分区的数量,然后选择一个执行器大小来满足内存需求。

分区控制将在特定阶段的数据集上执行多少任务。在几乎没有摩擦(网络延迟、主机问题以及与任务调度和分配相关的开销)的最佳条件下,将分区数分配为集群中的可用核心数将是理想的。在这种情况下,所有任务将同时开始,同时全部完成,一步到位。

然而,真实环境并不是最佳的。在调优Spark时,我们必须考虑:

使用 Apache Spark 优化技术时,请记住这条经验法则:对于大型数据集——大于集群中单个主机上的可用内存——始终将分区数设置为集群中可用核心数的 2 或 3 倍.

但是,如果集群中的核心数量很少,而您有一个庞大的数据集,那么选择分区大小等于 Hadoop 块大小(默认情况下为 128 MB)的分区数量在以下方面具有一些优势输入/输出速度。

选择执行器大小

正如我们所讨论的,Spark 调优还涉及为您的执行程序提供足够的内存来处理存储和执行。因此,当您选择执行程序大小时,您应该考虑分区大小、整个数据集大小以及是否将数据缓存在内存中。

为了确保任务快速执行,我们需要避免磁盘溢出。当我们没有给执行者足够的内存时,就会发生磁盘溢出。这迫使 Spark 在运行时将一些任务“溢出”到磁盘。

在我们的实验中,我们发现执行程序大小的一个好的选择是不会导致磁盘溢出的最小大小。我们不想选择太大的值,因为我们会使用太少的执行器。找到避免磁盘溢出的正确大小需要进行一些试验。

图 3 显示了我们针对机器学习应用程序进行的一项实验的结果:

图 3:磁盘溢出和任务持续时间

我们多次运行同一个应用程序,只改变了执行程序的内存大小。我们将分区大小保持在 256 MB,执行程序核心数保持在 4。我们看到,在没有磁盘溢出的情况下,任务运行速度明显加快。将内存大小从 4 GB 增加一倍到 8 GB 消除了磁盘溢出,任务运行速度提高了两倍以上。但我们也可以看到,从 8 GB 到 10 GB 并没有影响任务持续时间。它并不总是如此明确,但根据我们的经验,选择不会导致磁盘溢出的最小内存大小通常是一个很好的 Spark 调优实践。

作者 east
Spark 5月 11,2023

在 Kubernetes 上开始使用 Spark 的快速指南

Apache Spark 与 Kubernetes?或两者?在过去的几年里,使用 Spark on Kubernetes (K8s) 的公司数量急剧增加。考虑到 K8s 带来的好处,这并不奇怪。根据我们最近的调查,77% 的企业正在采用 Kubernetes 技术来提高资源利用率并减少云费用。

在向云的广泛迁移的推动下,在 Kubernetes 上部署 Spark 的公司数量正在增长。然而,公司应该知道以这种方式在 Kubernetes 上运行 Spark 有其缺点。使用 Kubernetes 运行 Spark 的企业必须准备好应对此解决方案带来的挑战。最重要的是,他们需要对其基础架构具有可观察性,并轻松优化其性能的多个方面。

Spark 是一种开源分析引擎,旨在处理大量数据。它为用户提供了一个统一的接口,用于使用数据并行性和容错对整个集群进行编程。 Kubernetes 是一个开源容器编排平台,可自动执行计算机应用程序部署、扩展和管理。

将 Kubernetes 上的 Apache Spark 想象成这样:Spark 提供计算框架,而 Kubernetes 管理集群。 Kubernetes 为用户提供了一种用于管理多个集群的操作系统。因此,该技术提供了卓越的集群使用和分配灵活性,从而节省了大量成本。

没有 Spark 与 Kubernetes 的争论。我们建议企业在 Kubernetes 上部署 Spark,因为与在 YARN 上运行 Spark 相比,这是一种更符合逻辑和实用的方法。一方面,Spark K8s 环境没有 YARN 的限制。 YARN 的集群很复杂,消耗的计算资源比作业所需的多。此外,用户需要为 YARN 中的每个作业创建和拆除集群。这种设置不仅会浪费大量资源,转化为更多成本,还会导致任务管理效率低下。

另一方面,Kubernetes在大数据场景中爆发,几乎触及了包括Spark在内的所有企业技术。随着其日益流行和无处不在,以及其用户社区的迅速扩大,Kubernetes 将取代 YARN 成为世界主要的大数据处理引擎。

Spark 与 Kubernetes 的争论是否有道理?最近的趋势表明我们正朝着这个方向前进。

许多 Spark 用户指出了在 Kubernetes 上运行 Spark 作业比 YARN 有优势。首先,将 Spark 应用程序部署到组织现有的 Kubernetes 基础设施中并不困难。这导致跨多个软件交付团队的努力和目标快速无缝地对齐。

其次,最新的 Spark 版本 (3.2) 已经解决了 Kubernetes 之前的性能和可靠性问题。使用 Kubernetes 管理 Spark 作业可带来更好的性能和成本节约,超过 YARN 提供的功能。 Amazon 进行的多次测试表明,使用 Kubernetes 而非 YARN 可节省 5% 的时间。

在 K8s 上运行 Spark 的其他好处现在正在显现。但企业应该采用 Kubernetes 的最大原因是什么?企业和云供应商已经通过 CNCF(云原生计算基金会)表达了对该框架的支持。 Kubernetes 上的 Spark 简直就是大数据分析的未来。

是的。当您在 Kubernetes 上运行 Spark 时,Spark 会生成一个在 Kubernetes pod 内部运行的 Spark 驱动程序。然后驱动程序创建执行器,这些执行器在 Kubernetes pod 中运行,连接到它们,并实现应用程序代码。

一旦应用程序完成,执行器 pod 就会终止。然后这些被清理,但驱动程序 pod 继续记录并在 Kubernetes API 中保持“完成”状态。它一直保持这种状态,直到最终成为收集或手动清理的垃圾。

企业正在采用 Spark Kubernetes 设置来提高云资源的利用率。 Spark Kubernetes 动态分配资源有助于简化云流程并缩短部署时间。根据我们的调查,近 30% 的企业转向 Kubernetes 以实现高效的资源利用。最重要的是,超过 17% 的受访者表示他们采用了 Kubernetes Spark,旨在加快他们的应用程序部署周期。

软件工程师、开发人员和 IT 专家都喜欢 Spark,因为它能够以比 MapReduce 框架快 100 倍的速度实施和执行计算任务。

现在,如果他们使用 Spark Kubernetes 方法,由于容器化,迭代周期最多可加快 10 倍,五分钟的开发工作流程报告可缩短至 30 秒。 Spark Kubernetes 动态分配不仅导致处理量急剧增加,使用 Kubernetes 的容器化也不像硬件级虚拟化那样占用资源。

对于 Kubernetes Spark 项目来说,混合可用于数据处理和 Spark 作业编排的不同元素是很常见的。当用户将这些 Spark 组件作为类似 Kubernetes 集群中的工作负载运行时,这些组件可以包括各种后端和 Spark SQL 数据存储(仅举几例),从而获得更好的性能。这是因为 Kubernetes 确保每个工作负载都有足够的资源和与所有依赖项的连接,无论是在同一个集群中还是在集群外。

在大数据、云计算、按需付费的时代,每个企业都想降低成本。这就是为什么许多企业希望通过 K8s Spark 来实现高效的资源共享和利用。

在我们调查的 IT 领导者中,近 30% 正在考虑使用 Kubernetes 来帮助降低他们的云成本。在 K8s 上运行 Apache Spark 已被证明可以通过完全隔离和强大的资源共享帮助企业大幅降低云成本。
这种成本降低是如何发生的?用户可以将所有应用程序部署在一个 Kubernetes 集群中。当应用程序完成时,Kubernetes 可以快速拆除其容器并将资源快速重新分配给另一个应用程序,并根据 Spark 指标和其他性能基准优化 Spark Kubernetes 配置。整个过程只需要 10 秒钟就可以将资源转移到其他地方。

那么我们说的是节省多少呢?在一个案例中,一家公司在从 YARN 切换到 Kubernetes 模型上的 Spark 后削减了 65% 的云成本。

Kubernetes 对于统一的 IT 基础架构越来越重要,而 Spark 是第一个迁移到云端的大数据应用程序。然而,Spark 应用程序往往效率很低。

这些低效率表现在各种方面。我们向受访者询问了他们在流程中使用 Kubernetes Spark 设置时面临的主要挑战。以下是他们最大的三个绊脚石:

初始部署

一些 Spark 挑战阻碍了成功实施。我们的调查将初始部署列为受访者在 Kubernetes 上运行 Spark 时面临的最大挑战。技术很复杂。对于那些不熟悉 Kubernetes Spark 平台的人来说,框架、语言、工具等可能会让人望而生畏。

在 Kubernetes 基础设施上大规模运行 Spark 应用程序需要大量的技术专业知识。即使那些具有丰富 Kubernetes 知识的人也认识到在部署之前需要构建一些部分,例如集群、节点池、spark-operator、K8s 自动缩放器、docker 注册表等。

移民

迁移到 Kubernetes 可以让您的企业处于优势地位,就像迁移到云端或采用大数据一样。但这只有在您在迁移之前有一个健全而强大的策略时才有可能。迁移到 Kubernetes 可能很困难(或导致彻底失败)的众多原因之一是,领导者决定采用一项技术,但没有明确的理由进行如此大的迁移。

此外,许多企业在其组织内不具备必备技能。在 K8s 架构上切换到 Spark 需要相当多的人才才能使过渡顺利和成功。忽略或未能识别应用程序或基础架构的潜在问题,例如扩展或可靠性,可能会导致迁移挑战。

监控和警报

Kubernetes 是一项复杂的技术,监控可能很困难。当您将 Spark 与 Kubernetes 结合使用时更是如此。选择合适的工具来监控和评估您的 Kubernetes 实施增加了这种复杂性。根据我们的调查,28% 的受访者使用手动方法或自行开发的解决方案,而 27% 的受访者利用应用程序性能监控 (APM) 软件。

性能监控和优化已经超出了人类的能力范围。通用 APM 通常未设计或配置为处理 K8s 工作负载和其他大数据基础设施上的大型 Spark。有效而强大的 Kubernetes 和 Spark 监控现在需要全面而强大的工具,这些工具专为 Kubernetes 上的大数据工作负载而设计。

随着 Spark Kubernetes 设置的优势变得更加明显,整个 Spark 与 Kubernetes 的争论已经退居二线。在 Kubernetes 上运行 Spark 有效地实现了加速产品周期和持续运营。

数据科学和机器学习技术的扩展加速了容器化的采用。这一发展有效地推动了 Spark on Kubernetes 方法成为数据集群和建模生态系统的首选设置。 Spark on Kubernetes 为用户提供了抽象弹性 GPU 和 CPU 的能力,以及它的按需可扩展性。

作者 east
Spark 5月 10,2023

今天如何成功地将大数据与 Spark 结合使用

您可能很难找到从未听说过 Apache Spark 或从未将大数据与 Spark 结合使用的大数据从业者。我们甚至可以说这几乎是不可能的——这是有充分理由的。 Spark 众所周知,因为它快速、可靠且功能强大。让我们深入探讨其中的原因,回答有关 Spark 计算的一些常见问题,如何轻松使用它来取得成功等等。

Apache Spark 是一种用于大规模数据处理的快速开源统一分析引擎。为应对 MapReduce 的限制,它于 2012 年在加州大学伯克利分校的 AMPLab 开发,其代码库现在由 Apache 软件基金会维护。

Spark 以速度快着称,因为与其前身 MapReduce 不同,它能够在内存 (RAM) 而不是磁盘驱动器上运行。由于它是开源软件,任何人都可以免费使用。开发人员可以制作量身定制的 Spark 版本来解决特定问题或用例。

可以使用 Spark 代替 Hadoop,而且随着开发人员开始认识到 Spark 的优势,这种做法越来越频繁。您可以在 Hadoop 上使用 Spark,也可以在没有 Hadoop 的情况下使用它,也可以将两者结合使用。

如果您已经拥有 Hadoop,则没有理由围绕它构建 Spark。如果您是从头开始,并且追求 Spark 提供的速度和实时数据分析,那么没有理由首先构建 Hadoop。

然而,答案实际上取决于您尝试使用 Spark 运行大数据的目的。 Hadoop 旨在高效处理批处理,而 Spark 旨在高效处理实时数据。因此,如果您的目标是分析实时事件,Spark Streaming 可能是最佳选择。当您需要从 Hadoop 的资源管理器获得复杂的资源管理时,使用 Spark on Hadoop 将是最佳选择。

您使用 Spark 来分析和操作大数据,以检测模式并获得实时洞察力。它可以在任何类 UNIX 系统(Mac OS 或 Linux)、Windows 或任何运行当前支持的 Java 版本的系统上运行。 (有关更多详细信息,请查看文档。Spark 有许多使用大数据的用例,从零售商使用它来分析消费者行为,到医疗保健领域为患者提供更好的治疗建议。

优化 Spark 大数据工作负载的 3 个技巧

一旦开始运行 Spark 工作负载,您可能会遇到常见的 Spark 问题,例如滞后或作业失败。以下是我们发誓可以提供帮助的三个提示。

有些公司选择在没有额外工具的情况下运行 Spark,但我们建议使用 APM 工具来确保您满足 SLA、实现业务目标并保持在预算之内。

作者 east
Spark 4月 23,2023

运行spark的任务报下面的错误”org.apache.spark.memory.SparkOutOfMemoryError: Unable to acquire 65536 bytes of memory, got 0″,

这个错误表明Spark没有足够的内存来执行任务。可以试着通过以下方式修复:

  1. 增加可用内存。可以增加集群的内存或者减少任务的内存需求。
  2. 调整Spark的内存配置。可以调整Spark的内存配置,如executor的内存大小和driver的内存大小。
  3. 减少数据量。如果处理的数据量很大,可以考虑分批处理或者采用其他的数据处理方式。
  4. 使用内存优化技术。可以使用缓存、序列化等技术来优化内存使用。
  5. 调整GC策略。可以考虑采用更适合应用场景的GC策略。
作者 east
Spark 1月 23,2023

数仓的生命周期管理策略和ETL命令

 在做数仓开发过程中,遇到一个问题就是随着数据量增大,存储空间增加惊人:hdfs的文件要存3份(可以修改副本份数),ods、dwd、dws、ads等各层都需要存储空间,指标计算过程如果内存不够又会缓冲在硬盘。而更严重的问题是:如果CDH依赖某个目录的存储空间严重不够,就会导致Yarn的任务执行失败。

   所以对数仓的生命周期管理尤为重要。数仓的生命周期管理的核心目的就是用最少的存储成本来满足最大的业务需求,使数据价值最大化。

对数仓的历史数据可以分为P0、P1、P2、P3这4个不同优先级,其具体定义如下。

• P0:非常重要的主题域数据和非常重要的应用数据,具有不可恢复性,如交易、基础信息表、集团KPI数据、IPO关联表。

• P1 :重要的业务数据和重要的应用数据,具有不可恢复性,如重要的业务产品数据。

• P2:重要的业务数据和重要的应用数据,具有可恢复性,如交易线ETL产生的中间过程数据。

• P3:不重要的业务数据和不重要的应用数据,具有可恢复性,如某些商品的报表。

对数据P0、P1、P2、P3这4个级别的数据,生命周期要根据具体情况。例如在有的公司,关系型数据库保存有数仓原始全部数据,又对服务器的成本敏感性,对恢复数据

层级类型P0P1P3P4
ODS层各类型数据永久永久永久永久
DWD事实表(增量表)永久3年365天180天
维表(全量表)保留近30天及每月月底数据保留近30天及每月月底数据保留近30天及每月月底数据保留近30天及每月月底数据
Merge全量表保留近30天及每月月底数据保留近30天及每月月底数据保留近30天及每月月底数据保留近30天及每月月底数据
DWS层各类型数据永久3年3年3年
DWM层各类型数据保留近30天及每月月底数据保留近30天及每月月底数据保留近30天及每月月底数据保留近30天及每月月底数据
APP层各类型数据永久–––

由于数仓通常是带有时间的分区表。要进行数仓表数据进行生命周期管理,首先是清楚目前数仓各张表占的存储空间的情况。

查看存储空间的命令:

hadoop fs -du -s -h ${warehouse.dir}/*

如果hive外部表

使用drop table来删除表或用drop partition等命令删除表的分区,其实数据还是存在。要彻底删除数据,有2种方法:

(1)通过删除文件方式

删除文件命令:

hdfs dfs -rmdir -f ${warehouse.dir}

删除目录命令:

hdfs dfs -rm -r -f ${warehouse.dir}/*

  • 变为内部表再删除

alter table  ${table_name) set tblproperties (‘EXTERNAL’=’False’);

如果是hive内部表

删除分区

alter table ${tablename} drop partition(dt<=’2023-01-21′)

在CDH的默认配置中,删除的文件是放在垃圾站,通常是需要24小时后删除的文件才释放空间。如果需要立即释放空间,可以用下面清空hdfs垃圾站的命令:

hdfs dfs -expunge

作者 east
Hive, Spark 1月 19,2023

Spark SQL或Hive开发调试小技巧

  • 在本地开发机装本地模拟环境,或者能远程调试,可以参考Spark如何在生产环境调试
  • 输出dataframe日志,最好有一个开关来控制,正式上线时,把开关关了来提升速度
if (isDebug) {
dataframeDF.show(10)
}
  • dataframe的输出,有时看得不是很清楚,可以生成临时表来记录中间过程,方便对中间过程进行查看 insertHive(resultDF, “dataframe_temp”)
  • 如果是运行的数据比较大,调试起来要等,可以对dataframe进行限定条数或筛选 dataframe.limit(1000) dataframe.filter(” id = ‘ewgwgs’ “)
  • 对复杂的sql,一步到位写起来爽,出问题了不知是哪一步出问题,可以分解出几个简单sql,每一步都有输出,对照结果方便找出问题。
  • 对复杂计算的,写的代码觉得似是而非,可以先整理一个样例,手动写计算过程,然后用代码对照这些过程来一步步实现。

作者 east

上一 1 2 3 4 … 9 下一个

关注公众号“大模型全栈程序员”回复“小程序”获取1000个小程序打包源码。回复”chatgpt”获取免注册可用chatgpt。回复“大数据”获取多本大数据电子书

标签

AIGC AI创作 bert chatgpt github GPT-3 gpt3 GTP-3 hive mysql O2O tensorflow UI控件 不含后台 交流 共享经济 出行 图像 地图定位 外卖 多媒体 娱乐 小程序 布局 带后台完整项目 开源项目 搜索 支付 效率 教育 日历 机器学习 深度学习 物流 用户系统 电商 画图 画布(canvas) 社交 签到 联网 读书 资讯 阅读 预订

官方QQ群

小程序开发群:74052405

大数据开发群: 952493060

近期文章

  • 详解Python当中的pip常用命令
  • AUTOSAR如何在多个供应商交付的配置中避免ARXML不兼容?
  • C++thread pool(线程池)设计应关注哪些扩展性问题?
  • 各类MCAL(Microcontroller Abstraction Layer)如何与AUTOSAR工具链解耦?
  • 如何设计AUTOSAR中的“域控制器”以支持未来扩展?
  • C++ 中避免悬挂引用的企业策略有哪些?
  • 嵌入式电机:如何在低速和高负载状态下保持FOC(Field-Oriented Control)算法的电流控制稳定?
  • C++如何在插件式架构中使用反射实现模块隔离?
  • C++如何追踪内存泄漏(valgrind/ASan等)并定位到业务代码?
  • C++大型系统中如何组织头文件和依赖树?

文章归档

  • 2025年6月
  • 2025年5月
  • 2025年4月
  • 2025年3月
  • 2025年2月
  • 2025年1月
  • 2024年12月
  • 2024年11月
  • 2024年10月
  • 2024年9月
  • 2024年8月
  • 2024年7月
  • 2024年6月
  • 2024年5月
  • 2024年4月
  • 2024年3月
  • 2023年11月
  • 2023年10月
  • 2023年9月
  • 2023年8月
  • 2023年7月
  • 2023年6月
  • 2023年5月
  • 2023年4月
  • 2023年3月
  • 2023年1月
  • 2022年11月
  • 2022年10月
  • 2022年9月
  • 2022年8月
  • 2022年7月
  • 2022年6月
  • 2022年5月
  • 2022年4月
  • 2022年3月
  • 2022年2月
  • 2022年1月
  • 2021年12月
  • 2021年11月
  • 2021年9月
  • 2021年8月
  • 2021年7月
  • 2021年6月
  • 2021年5月
  • 2021年4月
  • 2021年3月
  • 2021年2月
  • 2021年1月
  • 2020年12月
  • 2020年11月
  • 2020年10月
  • 2020年9月
  • 2020年8月
  • 2020年7月
  • 2020年6月
  • 2020年5月
  • 2020年4月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年3月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年7月
  • 2018年6月

分类目录

  • Android (73)
  • bug清单 (79)
  • C++ (34)
  • Fuchsia (15)
  • php (4)
  • python (43)
  • sklearn (1)
  • 云计算 (20)
  • 人工智能 (61)
    • chatgpt (21)
      • 提示词 (6)
    • Keras (1)
    • Tensorflow (3)
    • 大模型 (1)
    • 智能体 (4)
    • 深度学习 (14)
  • 储能 (44)
  • 前端 (4)
  • 大数据开发 (488)
    • CDH (6)
    • datax (4)
    • doris (30)
    • Elasticsearch (15)
    • Flink (78)
    • flume (7)
    • Hadoop (19)
    • Hbase (23)
    • Hive (40)
    • Impala (2)
    • Java (71)
    • Kafka (10)
    • neo4j (5)
    • shardingsphere (6)
    • solr (5)
    • Spark (99)
    • spring (11)
    • 数据仓库 (9)
    • 数据挖掘 (7)
    • 海豚调度器 (10)
    • 运维 (34)
      • Docker (3)
  • 小游戏代码 (1)
  • 小程序代码 (139)
    • O2O (16)
    • UI控件 (5)
    • 互联网类 (23)
    • 企业类 (6)
    • 地图定位 (9)
    • 多媒体 (6)
    • 工具类 (25)
    • 电商类 (22)
    • 社交 (7)
    • 行业软件 (7)
    • 资讯读书 (11)
  • 嵌入式 (70)
    • autosar (63)
    • RTOS (1)
    • 总线 (1)
  • 开发博客 (16)
    • Harmony (9)
  • 技术架构 (6)
  • 数据库 (32)
    • mongodb (1)
    • mysql (13)
    • pgsql (2)
    • redis (1)
    • tdengine (4)
  • 未分类 (6)
  • 程序员网赚 (20)
    • 广告联盟 (3)
    • 私域流量 (5)
    • 自媒体 (5)
  • 量化投资 (4)
  • 面试 (14)

功能

  • 登录
  • 文章RSS
  • 评论RSS
  • WordPress.org

All Rights Reserved by Gitweixin.本站收集网友上传代码, 如有侵犯版权,请发邮件联系yiyuyos@gmail.com删除.