数据处理与存储格式优化指南
1. YARN 资源调优参数
在数据处理中,YARN(Yet Another Resource Negotiator)的参数调优至关重要。以下是一些可调整的 YARN 属性:
-
yarn.scheduler.minimum-allocation-mb
:YARN 允许运行作业的容器最小大小,默认值为 1GB。
-
yarn.scheduler.maximum-allocation-mb
:YARN 允许运行作业的容器最大大小,默认值为 8192MB。
-
yarn.nodemanager.resource.memory-mb
:工作节点上容器的总内存量,该值应为(总内存) - (操作系统、Hadoop 守护进程和其他服务的内存分配)。
-
yarn.nodemanager.vmem-pmem-ratio
:定义虚拟内存与可用物理内存的比率,默认值 2.1 表示虚拟内存将是物理内存的两倍。
-
yarn.app.mapreduce.am.resource.mb
:分配给 ApplicationMaster 的内存。
-
yarn.app.mapreduce.am.command-opts
:分配给 ApplicationMaster 的堆大小,默认值为 1GB。
-
yarn.nodemanager.resource.cpu-vcores
:节点管理器可分配给容器的核心数,该值应为(节点上的核心总数) - (分配给 Hadoop 守护进程和其他守护进程的核心数)。
2. 选择最优文件格式
文件格式的选择直接影响数据查询性能。在选择合适的文件格式时,需要考虑以下参数:
-
查询类型
:这是最重要的因素。
-
压缩需求
:不同的文件格式支持不同的压缩算法。
-
NoSQL 解决方案支持
:确保所选的 NoSQL 解决方案支持该存储格式。
文件格式影响查询性能的原因在于它决定了系统响应特定查询时读取数据集的速度。数据检索的主要耗时任务是在磁盘和内存之间移动数据(除非使用内存数据库)。例如,对于 1TB 的数据集,使用 7200 RPM 且硬件接口为 SATA 6GB/s 的驱动器,磁盘读取速率接近 160MB/s,处理 1TB 数据大约需要两小时,对于更大的数据集,这样的性能是不可接受的。
3. 提升读取性能的方法
提升读取性能有以下三种方法:
-
并行操作
:利用分布式存储和计算技术并行化读写操作。HDFS 提供分布式存储(具有容错能力),MapReduce、YARN 或 Spark 等处理框架可将处理任务分配到数据所在位置或在每个工作节点上本地处理数据。
-
高效压缩
:使用能有效压缩数据的文件格式,减少查询引擎处理的数据总量。不同文件格式支持不同的压缩算法,压缩算法在速度和压缩比之间存在权衡。例如,对于约 1GB 的文本(CSV)文件,Snappy 或 GZIP 压缩后,若存储为 SequenceFile 约为 500MB,若使用 ORCFile 或 Parquet 格式约为 300MB。以下是不同文件格式支持的压缩方案:
| 压缩方案 | 文本文件 | 序列文件 | ORC 文件 | RC 文件 | Parquet 文件 |
| ---- | ---- | ---- | ---- | ---- | ---- |
| Snappy | X | X | X | X | X |
| GZIP | | X | X | X | X |
| ZLIB | | X | | X | |
| BZIP2 | | X | | X | |
| 无 | X | | | | |
- 使用存储统计信息 :Parquet 和 ORC 等格式支持使用存储的聚合统计信息,可将预计算的数据作为聚合统计信息获取。这些格式以牺牲写入性能为代价优化读取性能,符合 Hadoop “一次写入,多次读取” 的理念。
4. 组织方案对查询性能的影响
不同的组织方案对不同类型的查询性能有影响:
-
行式格式
:适用于返回大量列(对于行子集)的查询。经验表明,返回超过 60% 列的查询使用行式格式更有利。常见的行式存储格式包括文本文件、序列文件和 Avro。
-
文本文件
:是最简单和最常用的文件格式,大多数数据库系统或应用程序支持将数据导出为 CSV 或制表符分隔的文本文件。优点是可读且易于处理,有大量工具可用于操作,大多数应用程序和数据库系统可以导入和输出。缺点是将所有字段值(包括数字或布尔值)存储为字符串,会增加存储空间,且每次查询时需要进行数据类型转换,影响查询性能并消耗额外系统资源。
-
序列文件
:是 Hadoop 生态系统中常用的文件格式,使用二进制格式将数据存储为键值对记录。Hive 和 Impala 使用简化版本的序列文件,忽略记录的键部分,将每行编码为字符串,使用特殊字符
'\01'
作为行分隔符。例如,要使用 Snappy 压缩方案压缩使用序列文件的 Hive 表数据,可在 Hive 命令提示符下设置:
> set hive.exec.compress.output=true;
> set mapred.output.compression.type=BLOCK;
> set mapred.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
序列文件的主要优点是 Hadoop 生态系统的所有组件都支持读写,但 Hive 和 Impala 的使用方式降低了该格式的许多优点,文件大小与文本文件相似,存在与文本文件相同的问题。
- **Avro**:是目前最先进的行式格式,与文本或序列文件格式不同之处在于:
- 包含或嵌入数据的模式,无需在应用程序之间共享 Avro 文件时重新定义模式。
- 根据字段的数据类型进行编码,减少未压缩文件大小,更有效地压缩文件,减少网络传输时间和文件处理时间(用于数据类型转换),提高查询性能。
- 便于进行模式更改和模式演变,添加列时无需重写底层数据。
Avro 文件的结构为:`<File metadata><sync marker><data block(object count,object size,data)><sync marker>`。以下是创建使用 Avro 文件格式的 Hive 表的代码:
> CREATE TABLE Employee_avro
(lastname STRING COMMENT 'Employee last name',
firstname STRING COMMENT 'Employee first name',
dept_code SMALLINT COMMENT 'Department code',
dob TIMESTAMP COMMENT 'Date of Birth',
zip STRING COMMENT 'ZIP CODE',
employee_since TIMESTAMP COMMENT 'Date of first visit')
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
TBLPROPERTIES ('avro.schema.literal'='{
"name": "employee_summary",
"type": "record",
"fields": [
{"name":"lastname", "type":"string"},
{"name":"firstname", "type":"string"},
{"name":"dept_code", "type":"int"},
{"name":"dob", "type":"string"},
{"name": "zip", "type": "string"},
{"name": "employee_since", "type": "string"}
]}');
Avro 也有一些缺点,如使用比文本格式更复杂,开发时间可能更长;很少有应用程序(Hadoop 生态系统之外)支持该格式;需要提前定义模式,在某些情况下可能无法实现。总之,Avro 适用于使用所有或大多数列的查询,对于具有数百列的宽事实表的数据仓库非常有用。
5. 列式格式
列式存储格式更适合分析用例,因为需要对一小部分列进行聚合或汇总。在 Hadoop 生态系统中,最流行的列式格式包括 RCFile、Parquet 和 ORCFile。
- RCFile :2011 年引入,是 Hadoop 生态系统中常用的列式格式。它通过水平和垂直分区数据,将数据划分为多个行组,每个行组内按列组织数据,并确保一行的所有列位于单个节点上,以减少行重建的成本。数据在每个行组内按列压缩。几乎所有 Hadoop 生态系统内的工具都支持 RCFile,许多外部工具也支持。但与 Parquet 和 ORCFile 相比,它缺乏一些高级功能。
-
ORCFile
:作为 RCFile 的继任者,ORCFile 增加了许多功能。它使用复杂的数据编码方案进一步减小数据大小,存储元数据以便跳过不符合常见查询条件的行,并存储列的基本统计信息,从而显著提高查询速度并实现高度压缩。数据结构为:
<Index Data><Row group1(...)><Stripe footer>,<Index Data><Row group2(...)><Stripe footer>………<File footer><Postscript>。ORCFile 是一种先进的列式文件格式,但目前 Impala 不支持该格式,使用该格式可能会限制可使用的工具集。 - Parquet :由 Cloudera 和 Twitter 的工程师设计,基于 Dremel 论文中描述的记录分解和组装算法。它提供高效的压缩和编码方案,使用三种类型的元数据:文件元数据、列(块)元数据和页面头元数据。Parquet 实现了复杂的数据物化引擎,结合了先进的编码技术,在压缩和速度之间取得平衡,并为每个数据列选择合适的编码格式。在 Hive 中,可以通过以下设置选择 Parquet 文件的压缩方案:
> set parquet.compress=SNAPPY
与 ORCFile 相比,Parquet 得到更广泛的支持,是推荐的列式格式。
选择列式格式的条件如下:
- 经常需要在查询中执行聚合操作(如
count
、
avg
、
min
、
max
)。
- 大多数查询只选择一小部分列,并使用少量列作为过滤器(在
where
子句中)。
在选择列式格式之前,要确保上述条件适用于你的环境,否则需要进行行重建,这会对性能产生严重影响。
综上所述,在数据处理和存储中,合理调优 YARN 参数和选择合适的文件格式对于提高查询性能至关重要。不同的文件格式适用于不同的查询场景,需要根据实际需求进行选择。
数据处理与存储格式优化指南(续)
6. 不同文件格式的使用场景总结
为了更清晰地了解不同文件格式的适用场景,我们可以通过以下表格进行总结:
| 文件格式 | 适用查询场景 | 优点 | 缺点 |
| ---- | ---- | ---- | ---- |
| 文本文件 | 简单数据存储,对性能要求不高,数据交互广泛的场景 | 可读、易处理,工具支持多,应用和数据库系统支持导入导出 | 存储数据空间大,查询需数据类型转换,影响性能和消耗资源 |
| 序列文件 | Hadoop 生态系统内数据存储 | Hadoop 生态组件支持读写 | Hive 和 Impala 使用方式降低优势,文件大小和问题类似文本文件 |
| Avro | 数据仓库,查询使用所有或大多数列,宽事实表场景 | 含数据模式,按数据类型编码,便于模式更改 | 使用复杂,开发时间长,外部应用支持少,需提前定义模式 |
| RCFile | Hadoop 生态系统内分析场景,有外部工具使用需求 | 空间高效,Hadoop 内外工具支持多 | 缺乏一些高级功能 |
| ORCFile | 对查询速度和压缩要求高的分析场景 | 复杂编码减小数据大小,存储元数据和统计信息提高查询速度 | 部分工具(如 Impala)不支持 |
| Parquet | 广泛的分析场景 | 高效压缩和编码,在压缩和速度间平衡,支持广泛 | |
7. 选择文件格式的流程
为了帮助大家更系统地选择合适的文件格式,下面给出一个选择流程的 mermaid 流程图:
graph LR
A[开始] --> B{查询类型}
B -->|返回大量列| C{列占比是否超 60%}
C -->|是| D[行式格式]
C -->|否| E{是否需聚合操作}
E -->|否| D
B -->|聚合或少量列查询| E
E -->|是| F{是否需广泛工具支持}
F -->|是| G[Parquet]
F -->|否| H{对查询速度和压缩要求高?}
H -->|是| I[ORCFile]
H -->|否| J[RCFile]
D --> K{数据交互广泛?}
K -->|是| L[文本文件]
K -->|否| M{数据仓库场景?}
M -->|是| N[Avro]
M -->|否| O[序列文件]
8. 实际操作中的注意事项
在实际使用这些文件格式和调优 YARN 参数时,还需要注意以下几点:
-
YARN 参数调优
:
-
yarn.scheduler.minimum-allocation-mb
和
yarn.scheduler.maximum-allocation-mb
的设置要根据集群的实际资源和作业需求进行调整。如果设置不合理,可能会导致资源浪费或作业无法正常运行。
-
yarn.nodemanager.resource.memory-mb
和
yarn.nodemanager.resource.cpu-vcores
的计算要准确,要充分考虑操作系统、Hadoop 守护进程和其他服务的资源占用。
-
文件格式选择
:
- 在选择文件格式时,要对业务的查询模式有清晰的了解。可以通过分析历史查询记录,统计不同类型查询的占比,从而更准确地选择合适的文件格式。
- 如果需要在不同文件格式之间转换数据,要注意数据的完整性和准确性。虽然大多数 NoSQL 解决方案支持数据格式转换,但在转换过程中可能会出现一些问题,需要进行测试和验证。
-
压缩方案选择
:
- 压缩方案的选择要在压缩比和压缩速度之间进行权衡。如果对查询响应时间要求较高,可以选择压缩速度快的算法,如 Snappy;如果对存储空间要求较高,可以选择压缩比高的算法,如 GZIP。
- 在设置压缩方案时,要确保所选的压缩算法在目标环境中得到支持。
9. 总结与展望
在数据处理和存储领域,YARN 参数调优和文件格式的选择是提高查询性能的关键因素。不同的文件格式具有不同的特点和适用场景,我们需要根据实际的业务需求和查询模式进行合理选择。通过并行操作、高效压缩和使用存储统计信息等方法,可以进一步提升数据读取性能。
随着数据量的不断增长和业务需求的不断变化,未来可能会出现更多新的文件格式和数据处理技术。我们需要持续关注这些发展趋势,不断优化我们的数据处理和存储方案,以适应不断变化的业务环境。同时,对于不同文件格式的研究和实践也将不断深入,我们可以期待在性能、功能和易用性等方面取得更大的突破。
总之,合理利用现有的技术和工具,结合实际业务需求,选择合适的文件格式和调优参数,将有助于我们更高效地处理和存储数据,为业务决策提供有力支持。
超级会员免费看

被折叠的 条评论
为什么被折叠?



