通常通过Amazon S3读取和写入数据的速度也要慢于使用HDFS,即使Amazon S3存储桶与基于Amazon EC2基础架构上运行的Hadoop集群,原因如下:
1、在Amazon S3上,重命名是非常昂贵的复制操作。 在提交阶段,重命名表面的性能下降,其中包括:
Hive操作S3权限的优化
参数 | 推荐值 | 参数说明 |
hive.warehouse.subdir.inherit.perms | false | 由于S3没有文件权限的概念,请设置hive.warehouse.subdir.inherit.perms = false以减少文件权限检查的次数 |
hive.metastore.pre.event.listeners | (空) | 由于S3没有目录权限的概念,请设置hive.metastore.pre.event.listeners =(设置为空值)以减少S3中目录权限检查的次数 |
Hive提高读取ORC格式Job的优化
参数 | 推荐值 | 参数说明 |
hive.orc.compute.splits.num.threads | 默认值为10 | 如果使用ORC格式并且希望改进拆分计算时间,则可以增加hive.orc.compute.splits.num.threads(默认值为10)。此参数控制计算拆分中涉及的并行线程的数量。请注意,对于Parquet,它仍然是单线程的,所以拆分计算可能需要更长的Parquet和S3 |
hive.orc.splits.include.file.footer | true | 如果将ORC格式与ETL文件拆分策略一起使用,则可以设置hive.orc.splits.include.file.footer = true以搭载拆分有效内容中的文件页脚信息 |
参数 | 推荐值 | 参数说明 |
hive.stats.fetch.partition.stats | false | hive.stats.fetch.partition.stats如果没有可用的统计信息或hive.stats.fetch.partition.stats = false,则查询启动可能会稍慢。在这种情况下,Hive最终会为每个要访问的文件查看文件大小,调整hive.metastore.fshandler.threads有助于减少Metastore操作所需的总时间 |
fs.trash.interval | 0 | 由于操作涉及将文件移动到垃圾箱(副本+删除),因此在S3中,drop table可能会很慢,因此可以将fs.trash.interval = 0设置为完全跳过垃圾桶 |
参数 |
推 荐值 | 参数说明 |
hive.mv.files.thread | 默认值为15 | 插入数据时,Hive将数据从临时文件夹移动到最终位置。这个移动操作实际上是一个复制+删除操作,这在Amazon S3中很贵;向S3写入的数据越多,操作的成本就越高。为了加速该过程,您可以调整hive.mv.files.thread(默认值为15),具体取决于数据集的大小。 |
参数 | 推荐值 | 参数说明 |
yarn.scheduler.capacity.node-locality-delay | 0 | 由于AWS不具备机架位置的概念,设置yarn.scheduler.capacity.node-locality-delay = 0可以启用更快的容器,更多信息,请参阅Capacity Scheduler相关文档 |
实验性的fadvice策略介绍
S3A文件系统客户端支持输入策略的概念,类似于POSIX fadvise()API调用的概念。 这会调整S3A客户端的行为以优化各种用例的HTTP GET请求。 要优化HTTP GET请求,可以使用S3A实验输入策略fs.s3a.experimental.input.fadvise:
策略 | 描述 |
sequential (default) | 整个文档在一个HTTP请求中被请求,被顺序读取,通过跳过中间数据支持在预读范围内的前向搜索,这会让读取操作吞吐量达到最大,但会带来非常昂贵的后向搜索。 |
normal | 当前的行为同sequential是一样的 |
random | 针对随机IO进行了优化,特别是针对Hadoop的`PositionedReadable`操作 - 使用seek(offset);read(byte_buffer)`操作同样也有提升。 与顺序读取的不同,HTTP请求读取不是整个文件,而是通过`read`操作设置所需要读取的数据长度的范围 - 如果有必要,可能通过对通过setReadahead()的值的范围进行四舍五入的操作。 通过降低关闭现有HTTP请求的成本,这对于文件IO通过一系列`PositionedReadable.read()`和`PositionedReadable.readFully()`调用来访问二进制文件是非常有效的。顺序读取文件是很昂贵的,因为现在许多HTTP请求必须通过文件读取。 |
对于高性能随机访问IO(例如,访问ORC文件)的特定情况,您可以考虑在以下情况下使用随机策略:
实验性的fadvice策略配置
创建文件系统实例时,必须在配置选项fs.s3a.experimental.input.fadvise中设置所需的fadvise策略,它只能在每个文件系统的基础上设置,而不能基于每个文件读取进行设置, 你可以在core-site.xml中设置它:
fs.s3a.experimental.input.fadvise
random
Policy for reading files.
Values: 'random', 'sequential' or 'normal'
也可以在spark-defaults.xml配置文件中进行如下设置:
spark.hadoop.fs.s3a.experimental.input.fadvise random
请注意,这种随机访问性能是以连续IO为代价的 - 这包括读取使用gzip压缩的文件。
用S3A快速上传写入数据(注:这些优化参数,当前还初于实验性阶段,将来其行为可能会改变)
S3对象存储的本质,写入到S3A OutputStream的数据不会是逐步写入的 - 相反,在默认情况下,它会先缓存到磁盘,直到流的close()方法关闭完成才开始写入S3中。这可能会使输出变慢,因为:
解决写入慢的问题的方案一直在研发之中,目前可以通过“S3A快速上传”来解决这个问题,要使用这个功能,需要增加一些配置。
“S3A快速上传”的特点
“S3A快速上传”特点包括:
通过块的增量写入,“S3A快速上传”的上传时间至少与“传统”机制一样快,特别是对长时输出流以及生成大量数据时具有显着优势, 内存缓冲机制也可以对S3端点附近运行时提供加速,因为此时中间数据存储是通过内存而不是磁盘。
启用“S3A快速上传”
要启用快速上载机制,请将fs.s3a.fast.upload属性设置为true:
fs.s3a.fast.upload
true
Use the incremental block upload mechanism with
the buffering mechanism set in fs.s3a.fast.upload.buffer.
The number of threads performing uploads in the filesystem is defined
by fs.s3a.threads.max; the queue of waiting uploads limited by
fs.s3a.max.total.tasks.
The size of each buffer is set by fs.s3a.multipart.size.
核心配置选项
fs.s3a.fast.upload.buffer
disk
The buffering mechanism to use when using S3A fast upload
(fs.s3a.fast.upload=true). Values: disk, array, bytebuffer.
This configuration option has no effect if fs.s3a.fast.upload is false.
"disk" will use the directories listed in fs.s3a.buffer.dir as
the location(s) to save data prior to being uploaded.
"array" uses arrays in the JVM heap
"bytebuffer" uses off-heap memory within the JVM.
Both "array" and "bytebuffer" will consume memory in a single stream up to the number
of blocks set by: fs.s3a.multipart.size * fs.s3a.fast.upload.active.blocks.
If using either of these mechanisms, keep this value low
The total number of threads performing work across all threads is set by
fs.s3a.threads.max, with fs.s3a.max.total.tasks values setting the number of queued
work items.
fs.s3a.multipart.size
100M
How big (in bytes) to split upload or copy operations up into.
A suffix from the set {K,M,G,T,P} may be used to scale the numeric value.
fs.s3a.fast.upload.active.blocks
8
Maximum Number of blocks a single output stream can have
active (uploading, or queued to the central FileSystem
instance's pool of queued operations.
This stops a single stream overloading the shared thread pool.
注意:
fs.s3a.fast.upload
true
fs.s3a.fast.upload.buffer
disk
fs.s3a.buffer.dir
Comma separated list of temporary directories use for
storing blocks of data prior to their being uploaded to S3.
When unset, the Hadoop temporary directory hadoop.tmp.dir is used
这是默认的缓冲机制, 可以缓冲的数据量受可用磁盘空间量的限制。
使用ByteBuffers快速上传
当fs.s3a.fast.upload.buffer设置为bytebuffer时,所有数据在上传前都会缓存在“直接”ByteBuffers中。 这可能比缓冲到磁盘更快,并且如果磁盘空间很小(例如,微小的EC2 VM),可能没有多少磁盘空间可供缓冲。
ByteBuffers在JVM的内存中创建,但不在Java堆本身中创建。 可以缓冲的数据量由Java运行时,操作系统以及YARN应用程序限制每个容器请求的内存量。
上传到S3的带宽越慢,内存耗尽的风险就越大 - 因此在调整上传线程设置时需要更加小心,以减少可以缓存的等待上载的最大数据量(请参阅下文)。
fs.s3a.fast.upload
true
fs.s3a.fast.upload.buffer
bytebuffer
使用Arrays快速上传
可以缓冲的数据量受JVM堆堆的可用大小的限制, 写入S3带宽越慢,堆溢出的风险就越大, 这种风险可以通过调整上传线程设置来缓解(见下文)。
fs.s3a.fast.upload
true
fs.s3a.fast.upload.buffer
array
S3A快速上传线程调整
我们建议先把fs.s3a.fast.upload.active.blocks的值设置的低一点 - 至少足以启动后台上传,但不会使用系统的其他部分超载,然后通过试验,不断的调整该值,看看是否能够提供更高的吞吐量 - 尤其是要针EC2上运行的虚拟机多做些测试。
fs.s3a.fast.upload.active.blocks
4
Maximum Number of blocks a single output stream can have
active (uploading, or queued to the central FileSystem
instance's pool of queued operations.
This stops a single stream overloading the shared thread pool.
fs.s3a.threads.max
10
The total number of threads available in the filesystem for data
uploads *or any other queued filesystem operation*.
fs.s3a.max.total.tasks
5
The number of operations which can be queued for execution
fs.s3a.threads.keepalivetime
60
Number of seconds a thread can be idle before being
terminated.
改善负载均衡行为
参考:
https://hortonworks.github.io/hdp-aws/s3-performance/index.html
https://hadoop.apache.org/docs/r2.8.0/hadoop-aws/tools/hadoop-aws/index.html
https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.6.4/bk_cloud-data-access/content/s3a-fast-upload.html