大数据性能设计原则
在过去的20年中,大数据技术的发展展现了随着数据量不断增长而进行的战斗的历史。大数据的挑战尚未解决,并且随着未来几年数据量的持续增长,这一工作必将继续。原始的关系数据库系统(RDBMS)和关联的OLTP(在线事务处理)使使用SQL在所有方面使用数据变得如此容易,只要数据大小足够小即可管理。但是,当数据量很大时,要进行成功的读取,写入和处理将需要很长时间甚至有时甚至是不可能的,因此使用起来非常困难。
总体而言,对于数据工程师和数据科学家而言,处理大量数据是一个普遍的问题。该问题已在过去十年中蓬勃发展的许多新技术(Hadoop,NoSQL数据库,Spark等)中得到体现,并且这种趋势还将继续。本文专门讨论设计和实施大数据量的数据密集型过程时要记住的主要原则,这可能是为
机器学习应用程序准备数据,或者从多个来源提取数据并生成报告或仪表板为您的客户。
实际上,处理大数据的基本问题是资源问题。因为数据量越大,就内存,处理器和磁盘而言,所需的资源就越多。性能优化的目标是减少资源使用或使其更有效地充分利用可用资源,从而减少读取,写入或处理数据的时间。任何优化的最终目标应包括:
最大限度地利用可用内存
减少磁盘I / O
通过网络最小化数据传输
并行处理以充分利用多处理器
因此,在进行大数据性能工作时,好的架构师不仅是程序员,而且还具有服务器架构和数据库系统的丰富知识。牢记这些目标,无论使用哪种工具,编程语言或框架,让我们看一下设计或优化数据流程或应用程序的4个关键原则。
原理1.根据您的数据量进行设计
在开始构建任何数据过程之前,您需要了解要使用的数据量:将要开始的数据量是多少,以及数据量将增长为多少。如果数据大小总是很小,则设计和实现可以更加直接和快捷。如果数据从大开始或从小开始但将快速增长,则设计需要考虑性能优化。对于大数据而言表现良好的应用程序和流程通常会给小数据带来过多的开销,并对流程造成不利影响。另一方面,为小数据设计的应用程序将花费很长时间才能完成大数据。换句话说,应针对小数据与大数据设计不同的应用程序或过程。下面详细列出了原因:
由于从头到尾处理大型数据集非常耗时,因此中间需要更多细分和检查点。目标是两方面的:首先,允许在整个过程结束之前检查立即结果或在过程的早期提出异常;其次,在作业失败的情况下,允许从上一个成功的检查点重新启动,避免从头开始重新启动,这会增加成本。相反,对于小数据,由于运行时间短,通常一次执行所有步骤效率更高。
当处理小数据时,流程中任何低效率的影响也往往很小,但是对于大数据集,相同的低效率可能会成为主要的资源问题。
并行处理和数据分区(请参阅下文)不仅需要额外的设计和开发时间来实施,而且在运行期间会占用更多资源,因此对于小数据应跳过这些资源。
当处理大数据时,性能测试应包括在单元测试中;对于小数据,这通常不是问题。
使用可用的硬件可以快速完成对小数据的处理,而由于内存或磁盘空间不足,处理大量数据时,相同的处理可能会失败。
最重要的是,同一过程设计不能同时用于小数据和大数据处理。大数据处理需要不同的心态,使用大数据量的先前经验以及在初始设计,实施和测试中的额外工作。另一方面,不要为大数据设计的流程假定“一刀切”。这可能会损害小数据的性能。
原则2:在此过程的早期减少数据量。
当使用大型数据集时,在过程中尽早减小数据大小始终是获得良好性能的最有效方法。无论您投入了多少资源和硬件,都没有解决大数据问题的灵丹妙药。因此,在开始实际工作之前,请始终尝试减小数据大小。有多种方法可以实现此目标,具体取决于不同的用例。下面列出了一些常用技术,其中包括:
当字段具有NULL值时,请勿占用存储空间(例如,空格或定长字段)。
经济地选择数据类型。例如,如果数字从不为负,则使用整数类型,但不要使用无符号整数;否则,请使用整数。如果没有小数,请不要使用浮点数。
使用唯一标识符以整数形式编码文本数据,因为文本字段会占用更多空间,因此在处理时应避免使用。
当不需要较低粒度的数据时,数据聚合始终是减少数据量的有效方法。
尽可能压缩数据。
减少字段数:仅读取并保留真正需要的字段。
利用复杂的数据结构来减少数据重复。一个示例是,当字段共享许多其他公共键字段时,使用数组结构将字段存储在同一记录中,而不是将每个字段存储在单独的记录中。
我希望上面的列表为您提供一些有关如何减少数据量的想法。实际上,许多数据库软件和IoT边缘计算中都使用了相同的技术。您对数据和业务逻辑了解得越多,尝试在处理数据之前减小数据量就可以发挥更大的创造力。最终结果将与可用的内存,磁盘和处理器一起更有效地工作。
原则3:根据处理逻辑正确划分数据
启用数据并行性是快速数据处理的最有效方法。随着数据量的增长,并行进程的数量也随之增长,因此,添加更多硬件将扩展整个数据进程,而无需更改代码。对于数据工程师来说,一种常见的方法是数据分区。有关数据分区技术的许多细节不在本文讨论范围之内。一般来说,有效的分区应导致以下结果:
允许下游数据处理步骤(例如连接和聚合)在同一分区中进行。例如,如果数据处理逻辑在一个月内是独立的,则按时间段进行分区通常是一个好主意。
每个分区的大小应均等,以确保处理每个分区所花费的时间相同。
随着数据量的增长,分区的数量应增加,而处理程序和逻辑保持不变。
同样,应考虑在处理的不同阶段更改分区策略以提高性能,具体取决于需要对数据执行的操作。例如,在处理用户数据时,用户ID的哈希分区是有效的分区方法。然后,在处理用户的交易时,按时间段(例如一个月或一周)进行分区可以使聚合过程更快,更具伸缩性。
Hadoop和Spark作为默认操作将数据存储到数据块中,这使本地并行处理成为可能,而无需程序员自行管理。但是,由于它们的框架 非常通用,因为它以相同的方式处理所有数据块,因此它阻止了经验丰富的数据工程师可以在自己的程序中执行的更好的控制。因此,了解本文所述的原理将帮助您根据可用的以及使用的工具或软件来优化过程性能。
原则4:尽可能避免不必要的资源昂贵的处理步骤
如原则1所述,为大数据设计流程与为小数据设计流程大不相同。设计的一个重要方面是尽可能避免不必要的资源消耗大的操作。这要求高技能的数据工程师不仅要对软件如何与操作系统以及可用的硬件资源一起很好地理解,而且还要对数据和业务用例有全面的了解。在本文中,我仅关注应避免使数据处理更高效的前两个过程:数据排序和磁盘I / O。
但是,当1)与另一个数据集连接时,通常需要将数据记录按特定顺序放置。2)聚集;3)扫描;4)重复数据删除等。但是,排序是最昂贵的操作之一,需要输入内存,处理器以及输入数据集远大于可用内存的磁盘。为了获得良好的性能,请务必节俭地遵循以下原则:
如果数据已在上游或源系统中排序,则不要再次排序。
通常,两个数据集的联接需要对两个数据集进行排序然后合并。将大型数据集与小型数据集连接时,将小型数据集更改为哈希查找。这样可以避免对大型数据集进行排序。
仅在减小数据大小(原理2)之后并在分区内(原理3)进行排序。
设计过程时,需要相同排序的步骤要放在一个地方,以避免重新排序。
使用最佳排序算法(例如,合并排序或快速排序)。
另一个通常考虑的因素是减少磁盘I / O。该领域有很多技术,这不在本文讨论范围之内。下面列出了这方面需要考虑的3个常见原因:
资料压缩
数据索引
在写入磁盘之前在内存中执行多个处理步骤
在处理大数据时,数据压缩是必须的,因为它可以实现更快的读写和更快的网络传输。数据文件索引是快速访问数据所必需的,但要以增加写入磁盘的时间为代价。仅在必要时对表或文件建立索引,同时要记住它对写入性能的影响。最后,在将输出写入磁盘之前,请尽可能在内存中执行多个处理步骤。该技术不仅在Spark中使用,而且在许多数据库技术中使用。
总之,设计具有良好性能的大数据流程和系统是一项艰巨的任务。 本文阐述的4条基本原则将为您提供指导方针,以便在使用大数据和其他数据库或系统时主动和创造性地进行思考。经常发生的情况是,最初的设计并不能带来最佳的性能,这主要是因为开发和测试环境中的硬件和数据量有限。因此,在生产过程运行之后,需要多次优化性能。此外,通常针对某些业务用例量身定制优化的数据流程。当使用新功能增强流程以满足新用例时,某些优化可能会失效,因此需要重新考虑。总而言之,提高大数据的性能是一项永无止境的任务,

关注 CDA人工智能学院 ,回复“录播”获取更多人工智能精选直播视频!