大数据组件性能调优文档整理(集群、HDFS、Hive)
12.1 配置原则
如何发挥集群最佳性能
影响性能的因素
说明: sda表示当前磁盘的磁盘名。
12.2 Manager
12.2.1 提升Manager配置服务参数的效率
12.2.2 根据集群节点数优化Manager配置
说明: 在安装集群时,可以通过Manager安装配置文件中的“cluster_nodes_scale”参数指定集群节点数。
说明: 配置更新过程中,OMS会自动重启。 相近数量的节点规模对应的Manager相关配置是通用的,例如100节点变为101节点,并没有新的配置项需要刷新。
12.3 HBase
12.3.1 提升BulkLoad效率
参数 |
描述 |
配置的值 |
- Dimporttsv.mapper.class |
用户自定义mapper通过把键值对的构造从mapper移动到reducer以帮助提高性能。mapper只需要把每一行的原始文本发送给reducer, reducer解析每一行的每一条记录并创建键值对。 |
org.apache.hadoop.hbase.mapreduce.TsvImporterByteMapper 和org.apache.hadoop.hbase.mapreduce.TsvImporterTextMapper |
|
说明: |
|
|
当该值配置 |
|
|
为“org.apache.hadoop.hbase.mapreduce.TsvImporterByteMapper”时,只在执行没有HBASE_CELL_VISIBILITY OR HBASE_CELL_TTL选项的批 量加载命令时使用。使 |
|
|
用“org.apache.hadoop.hbase.mapreduce.TsvImporterByteMapper”时可以得到更好的性能。 |
|
12.3.2 提升连续put场景性能
参数 |
描述 |
默认值 |
hbase.regionserver.wal.durable.sync |
每一条wal是否持久化到硬盘。 |
true |
hbase.regionserver.hfile.durable.sync |
hfile写是否立即持久化到硬盘。 |
true |
12.3.3 Put和Scan性能综合调优
参数 |
描述 |
默认值 |
hbase.regionserver.wal.durable.sync |
每一条wal是否持久化到硬盘。参考提 升连续put场景性能。 |
true |
hbase.regionserver.hfile.durable.sync |
hfile写是否立即持久化到硬盘。参考提 升连续put场景性能。 |
true |
hbase.hregion.memstore.flush.size |
建议设置为HDFS块大小的整数倍,在内存足够put负载大情况下可以调整增大。单位:字节。 |
134217728 |
hbase.regionserver.global.memstore.size |
建议设置为“hbase.hregion.memstore.flush.size * 写活跃 region数 / RegionServer GC -Xmx”。默认值为“0.4”,表示使用RegionServer GC -Xmx的40%。 |
0.4 |
hbase.hstore.flusher.count |
memstore的flush线程数,在put高负载场景下可以适当调大。 |
2 |
hbase.regionserver.thread.compaction.small |
HFile compaction线程数,在put高负载情况下可以适当调大。 |
10 |
hbase.hstore.blockingStoreFiles |
当列簇的HFile数达到该阈值,阻塞该region的所有操作,直到compcation完成,在put高负载场景下可以适当调大。 |
15
|
参数 |
描述 |
默认值 |
hbase.client.scanner.timeout.period |
客户端和RegionServer端参数,表示scan租约的时间,建议设置为60000ms的整数倍,在读高负载情况下可以适当调大。单位:毫秒。 |
60000 |
hfile.block.cache.size |
数据缓存所占的RegionServer GC -Xmx百分比,在读高负载情况下可以适当调大以增大缓存命中率以提高性能。默认值为“0.25”,表示使用RegionServer GC -Xmx的25%。 |
0.25
|
参数 |
描述 |
默认值 |
hbase.regionserver.handler.count |
RegionServer上的RPC服务器实例数,建议设置为200 ~ 400 之间。 |
200 |
hbase.regionserver.metahandler.count |
RegionServer中处理优先请求的程序实例的数量,建议设置为200 ~ 400之间。 |
100 |
12.3.4 提升实时写数据效率
配置参数 |
描述 |
默认值 |
配置参数 |
描述 |
默认值 |
hbase.regionserver.wal.durable.sync |
控制HLog文件在写入到HDFS时的同步程度。如果为true,HDFS在把数据写入到硬盘后才返回;如果为false,HDFS在把数据写入OS的缓存后就返回。 把该值设置为false比true在写入性能上会更优。 |
true |
hbase.regionserver.hfile.durable.sync |
控制HFile文件在写入到HDFS时的同步程度。如果为true,HDFS在把数据写入到硬盘后才返回;如果为false,HDFS在把数据写入OS的缓存后就返回。 把该值设置为false比true在写入性能上会更优。 |
true |
GC_OPTS |
HBase利用内存完成读写操作。提高HBase内存可以有效提高HBase 性能。GC_OPTS主要需要调整HeapSize的大小和NewSize的大小。调 整HeapSize大小的时候,建议将Xms和Xmx设置成相同的值,这样可以避免JVM动态调整HeapSize大小的时候影响性能。调整NewSize大小的时候,建议把其设置为HeapSize大小的1/9。 HMaster:当HBase集群规模越大、Region数量越多时,可以适当调大HMaster的GC_OPTS参数。RegionServer:RegionServer需要的内存一般比HMaster要 大。在内存充足的情况下,HeapSize可以相对设置大一些。
说明: 主HMaster的HeapSize为4G的时候,HBase集群可以支持100000Region 数的规模。根据经验值,单个RegionServer的HeapSize不建议超过20GB。 |
HMaster: -Xms2G -Xmx2G - XX:NewSize=256M - XX:MaxNewSize=256M RegionServer: -Xms4G -Xmx4G - XX:NewSize=512M - XX:MaxNewSize=512M |
hbase.regionserver.handler.count |
表示RegionServer在同一时刻能够并发处理多少请求。如果设置过高会导致激烈线程竞争,如果设置过小,请求将会在RegionServer长时间等待,降低处理能力。根据资源情况,适当增加处理线程数。 建议根据CPU的使用情况,可以选择设置为100至300之间的值。 |
200 |
hbase.hregion.max.filesize |
表示HBase中Region的文件总大小的最大值。当Region中的文件大于该参数时,将会导致Region分裂。 该参数设置过小时,可能会导致Split操作过于频繁。当设置过大时,可能导致Compact需要处理的文件大小增加,影响Compact执行效率。 |
10737418240(单位:字节) |
hbase.hregion.memstore.flush.size |
在RegionServer中,当写操作内存中存在超过memstore.flush.size大小的memstore,则MemStoreFlusher就启动flush操作将该memstore 以hfile的形式写入对应的store中。 如果RegionServer的内存充足,而且活跃Region数量也不是很多的时候,可以适当增大该值,可以减少compaction的次数,有助于提升系统性能。 同时,这种flush产生的时候,并不是紧急的flush,flush操作可能会有一定延迟,在延迟期间,写操作还可以进行,Memstore还会继续增大,最大值为“memstore.flush.size” * “hbase.hregion.memstore.block.multiplier”。当超过最大值时,将会阻塞操作。适当增大“hbase.hregion.memstore.block.multiplier”可以减少阻塞,减少性能波动。 |
134217728(单位:字节) |
hbase.regionserver.global.memstore.size |
RegionServer中,负责flush操作的是MemStoreFlusher线程。该线程定期检查写操作内存,当写操作占用内存总量达到阈值, MemStoreFlusher将启动flush操作,按照从大到小的顺序,flush若干相对较大的memstore,直到所占用内存小于阈值。 阈值 = “hbase.regionserver.global.memstore.size” * “hbase.regionserver.global.memstore.size.lower.limit” * “HBase_HEAPSIZE” 说明: 该配置与“hfile.block.cache.size”的和不能超过0.8,也就是写和读操作的内存不能超过HeapSize的80%,这样可以保证除读和写外其它操作的正常运行。 |
0.4 |
hbase.hstore.blockingStoreFiles |
在region flush前首先判断file文件个数,是否大于hbase.hstore.blockingStoreFiles。 如果大于需要先compaction并且让flush延时90s(这个值可以通过hbase.hstore.blockingWaitTime进行配置),在延时过程中,将会继续写从而使得Memstore还会继续增大超过最大值“memstore.flush.size” * “hbase.hregion.memstore.block.multiplier”,导致写操作阻塞。当完成compaction后,可能就会产生大量写入。这样就导致性能激烈震荡。 增加hbase.hstore.blockingStoreFiles,可以减低BLOCK几率。 |
15 |
hbase.regionserver.thread.compaction.throttle |
控制一次Minor Compaction时,进行compaction的文件总大小的阈值。Compaction时的文件总大小会影响这一次compaction的执行时间,如果太大,可能会阻塞其它的compaction或flush操作。 |
1610612736(单位:字节) |
配置参数 |
描述 |
默认值 |
hbase.hstore.compaction.min |
当一个Store中文件超过该值时,会进行compact,适当增大该值,可以减少文件被重复执行compaction。但是如果过大,会导致Store中文件数过多而影响读取的性能。 |
6 |
hbase.hstore.compaction.max |
控制一次compaction操作时的文件数量的最大值。 与“hbase.hstore.compaction.max.size”的作用基本相同,主要是控制一次compaction操作的时间不要太长。 |
10 |
hbase.hstore.compaction.max.size |
如果一个HFile文件的大小大于该值,那么在Minor Compaction操作中不会选择这个文件进行compaction操作,除非进行Major Compaction操作。 |
9223372036854775807(单 位:字节) |
|
这个值可以防止较大的HFile参与compaction操作。在禁止Major Compaction后,一个Store中可能存在几个HFile,而不会合并成为一个HFile,这样不会对数据读取造成太大的性能影响。 |
|
hbase.hregion.majorcompaction |
设置Major Compaction的执行周期。默认值为604800000毫秒。由于执行Major Compaction会占用较多的系统资源,如果正在处于系统繁忙时期,会影响系统的性能。 如果业务没有较多的更新、删除、回收过期数据空间时,可以把该值设置为0,以禁止Major Compaction。 如果必须要执行Major Compaction,以回收更多的空间,可以适当增加该值,同时配置参 数“hbase.offpeak.end.hour”和“hbase.offpeak.start.hour”以控制 Major Compaction发生在业务空闲的时期。 |
604800000(单位:毫秒) |
hbase.regionserver.maxlogs hbase.regionserver.hlog.blocksize
|
表示一个RegionServer上未进行Flush的Hlog的文件数量的阈 值,如果大于该值,RegionServer会强制进行flush操作。 表示每个HLog文件的最大大小。如果HLog文件大小大于该值,就会滚动出一个新的HLog文件,旧的将被禁用并归档。 这两个参数共同决定了RegionServer中可以存在的未进行Flush的hlog 数量。当这个数据量小于MemStore的总大小的时候,会出现由于HLog文件过多而触发的强制flush操作。这个时候可以适当调整这两个参数的大小,以避免出现这种强制flush的情况。 |
32 134217728(单位:字节)
|
配置参数 |
描述 |
默认值 |
COMPRESSION |
配置数据的压缩算法,这里的压缩是HFile中block 级别的压缩。对于可以压缩的数据,配置压缩算法可以有效减少磁盘的IO,从而达到提高性能的目 的。
说明: 并非所有数据都可以进行有效压缩。例如一张图片的 数据,因为图片一般已经是压缩后的数据,所以压缩 效果有限。 常用的压缩算法是SNAPPY,因为它有较好的Encoding/Decoding速度和可以接受的压缩率。 |
NONE |
BLOCKSIZE |
配置HFile中block块的大小,不同的block块大小, 可以影响HBase读写数据的效率。越大的block 块,配合压缩算法,压缩的效率就越好;但是由于HBase的读取数据是以block块为单位的,所以越大的block块,对于随机读的情况,性能可能会比较差。 如果要提升写入的性能,一般扩大到128KB或者256KB,可以提升写数据的效率,也不会影响太大的随机读性能。 |
65536(单位:字节) |
IN_MEMORY |
配置这个表的数据优先缓存在内存中,这样可以有效提升读取的性能。对于一些小表,而且需要频繁进行读取操作的,可以设置此配置项。 |
false |
12.3.5 提升实时读数据效率
配置参数 |
描述 |
默认值 |
GC_OPTS |
HBase利用内存完成读写操作。提高HBase内存可以有效提高HBase性能。 |
HMaster: -Xms2G -Xmx2G - XX:NewSize=256M - XX:MaxNewSize=256M RegionServer: -Xms4G -Xmx4G - XX:NewSize=512M - XX:MaxNewSize=512M |
|
GC_OPTS主要需要调整HeapSize的大小和NewSize的大小。调整HeapSize大小的时候,建议将Xms和Xmx设置成相同的值,这样可以避免JVM动态调整HeapSize大小的时候影响性能。调整NewSize大小的时候,建议把其设置为HeapSize大小的1/9。 |
|
|
HMaster:当HBase集群规模越大、Region数量越多时,可以适当调大HMaster的GC_OPTS参数。 |
|
|
RegionServer:RegionServer需要的内存一般比HMaster要 大。在内存充足的情况下,HeapSize可以相对设置大一些。 |
|
|
说明: |
|
|
主HMaster的HeapSize为4G的时候,HBase集群可以支持100000Region 数的规模。根据经验值,单个RegionServer的HeapSize不建议超过20GB。 |
|
hbase.regionserver.handler.count |
表示RegionServer在同一时刻能够并发处理多少请求。如果设置过高会导致激烈线程竞争,如果设置过小,请求将会在RegionServer长时间等待,降低处理能力。根据资源情况,适当增加处理线程数。 建议根据CPU的使用情况,可以选择设置为100至300之间的值。 |
200 |
hfile.block.cache.size |
HBase缓存区大小,主要影响查询性能。根据查询模式以及查询记录分布情况来决定缓存区的大小。如果采用随机查询使得缓存区的命中率较低,可以适当降低缓存区大小。 |
0.25 |
说明: 如果同时存在读和写的操作,这两种操作的性能会互相影响。如果写入导致的flush和Compaction操作频繁发生,会占用大量的磁盘IO操作,
从而影响 读取的性能。如果写入导致阻塞较多的Compaction操作,就会出现Region中存在多个HFile的情况,从而影响读取的性能。
所以如果读取的性能不理 想的时候,也要考虑写入的配置是否合理。
配置参数 |
描述 |
默认值 |
COMPRESSION |
配置数据的压缩算法,这里的压缩是HFile中block 级别的压缩。对于可以压缩的数据,配置压缩算法可以有效减少磁盘的IO,从而达到提高性能的目 的。
说明: 并非所有数据都可以进行有效压缩。例如一张图片的 数据,因为图片一般已经是压缩后的数据,所以压缩 效果有限。 常用的压缩算法是SNAPPY,因为它有较好的Encoding/Decoding速度和可以接受的压缩率。 |
NONE |
BLOCKSIZE |
配置HFile中block块的大小,不同的block块大小, 可以影响HBase读写数据的效率。越大的block 块,配合压缩算法,压缩的效率就越好;但是由于HBase的读取数据是以block块为单位的,所以越大的block块,对于随机读的情况,性能可能会比较差。 如果要提升写入的性能,一般扩大到128KB或者256KB,可以提升写数据的效率,也不会影响太大的随机读性能。 |
65536(单位:字节) |
DATA_BLOCK_ENCODING |
配置HFile中block块的编码方法。当一行数据中存在多列时,一般可以配置为“FAST_DIFF”,可以有效的节省数据存储的空间,从而提供性能。 |
NONE |
12.3.6 JVM参数优化操作场景
变量名 |
变量影响的角色 |
HBASE_OPTS |
该变量中设置的参数,将影响HBase的所有角色。 |
SERVER_GC_OPTS |
该变量中设置的参数,将影响HBase Server端的所有角色,例如:Master、RegionServer 等。 |
CLIENT_GC_OPTS |
该变量中设置的参数,将影响HBase的Client进程。 |
HBASE_MASTER_OPTS |
该变量中设置的参数,将影响HBase的Master。 |
HBASE_REGIONSERVER_OPTS |
该变量中设置的参数,将影响HBase的RegionServer。 |
HBASE_THRIFT_OPTS |
该变量中设置的参数,将影响HBase的Thrift。 |
12.4 HDFS
12.4.1 提升写性能
参数 |
描述 |
默认值 |
dfs.datanode.drop.cache.behind.reads |
设置为true表示丢弃缓存的数据(需要在DataNode中配置)。 当同一份数据,重复读取的次数较少时,建议设置为true,使得缓存能够被其他操作使用。重复读取的次数较多时,设置为false能够提升重复读取的速度。 |
true |
dfs.client-write-packet-size |
当HDFS Client往DataNode写数据时,将数据生成一个包。然后将这个包在网络上传出。此参数指定传输数据包的大小,可以通过各Job来指定。单位:字节。 在万兆网部署下,可适当增大该参数值,来提升传输的吞吐量。 |
262144 |
12.4.2 JVM参数优化
变量名 |
变量影响的角色 |
HADOOP_OPTS |
该变量中设置的参数,将影响HDFS的所有角色。 |
HADOOP_NAMENODE_OPTS |
该变量中设置的参数,将影响HDFS的NameNode。 |
HADOOP_DATANODE_OPTS |
该变量中设置的参数,将影响HDFS的DataNode。 |
HADOOP_JOURNALNODE_OPTS |
该变量中设置的参数,将影响HDFS的JournalNode。 |
变量名 |
变量影响的角色 |
HADOOP_ZKFC_OPTS |
该变量中设置的参数,将影响HDFS的ZKFC。 |
HADOOP_SECONDARYNAMENODE_OPTS |
该变量中设置的参数,将影响HDFS的SecondaryNameNode。 |
HADOOP_CLIENT_OPTS |
该变量中设置的参数,将影响HDFS的Client进程。 |
HADOOP_BALANCER_OPTS |
该变量中设置的参数,将影响HDFS的Balancer进程。 |
HADOOP_MOVER_OPTS |
该变量中设置的参数,将影响HDFS的Mover进程。 |
12.4.3 使用客户端元数据缓存提高读取性能
说明: 此功能仅用于读取不经常修改的文件。因为在服务器端由某些其他客户端完成的数据修改,对于高速缓存的客户端将是不可见的,
这可能导致从缓存中拿到的元数据是过期的。
参数 |
描述 |
默认值 |
dfs.client.metadata.cache.enabled |
启用/禁用块位置元数据的客户端缓存。将此参数设置为“true”,搭配“dfs.client.metadata.cache.pattern”参数以启用缓存。 |
false |
dfs.client.metadata.cache.pattern |
需要缓存的文件路径的正则表达式模式。只有这些文件的块位置元数据被缓存,直到这些元数据过期。此配置仅在参数“dfs.client.metadata.cache.enabled”设置为“true”时有效。 示例:“/test.*”表示读取其路径是以“/test”开头的所有文件。
说明: 为确保一致性,配置特定模式以仅缓存其他客户端不经常修改的文件。 正则表达式模式将仅验证URI的path部分,而不验证在Fully Qualified路径情况下的schema和authority。 |
<empty> |
dfs.client.metadata.cache.expiry.sec |
缓存元数据的持续时间。缓存条目在该持续时间过期后失效。即使在缓存过程中经常使用的元数 据也会发生失效。 配置值可采用时间后缀s/m/h表示,分别表示秒,分钟和小时。
说明: 若将该参数配置为“0s”,将禁用缓存功能。 |
60s |
dfs.client.metadata.cache.max.entries |
缓存一次最多可保存的非过期数据条目。 |
65536 |
说明: 要在过期前完全清除客户端缓存,可调用DFSClient#clearLocatedBlockCache()。 用法如下所示。 FileSystem fs = FileSystem.get(conf); DistributedFileSystem dfs = (DistributedFileSystem) fs; DFSClient dfsClient = dfs.getClient(); dfsClient.clearLocatedBlockCache();
12.4.4 使用当前活动缓存提升客户端与NameNode的连接性能
参数 |
描述 |
默认值 |
dfs.client.failover.proxy.provider.[nameservice ID] |
配置客户端Failover proxy provider类,该类使用传递的协议创建NameNode proxy。该参数可以被配置 为“org.apache.hadoop.hdfs.server.namenode.ha.BlackListingFailoverProxyProvider”或者“org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider”。 |
org.apache.hadoop.hd |
dfs.client.failover.activeinfo.share.flag |
启用缓存并将当前活动的NameNode的详细信息共享给其他客户端。若要启用缓存,需将其设置为“true”。 |
false |
dfs.client.failover.activeinfo.share.path |
指定将在机器中的所有客户端创建的共享文件的本地目录。如果要为不同用户共享缓存, 该文件夹应具有必需的权限(如在给定目录中创建,读写缓存文件)。 |
/tmp |
dfs.client.failover.activeinfo.share.io.timeout.sec |
控制超时的可选配置。用于在读取或写入缓存文件时获取锁定。如果在该时间内无法获取 缓存文件上的锁定,则放弃尝试读取或更新缓存。单位为秒。 |
5 |
说明: 由HDFS客户端创建的缓存文件必须由其他客户端重新使用。因此,这些文件永远不会从本地系统中删除。若禁用该功能,可能需要进行手动清理。
12.5 Hive
12.5.1 建立表分区
说明: 1. 动态分区可能导致一个DML语句创建大量的分区,对应的创建大量新文件夹,对系统性能可能带来影响。 2. 在文件数量大的情况下,执行一个SQL语句启动时间较长,可以在执行SQL语句之前执行“set mapreduce.input.fifileinputformat.list-status.num threads = 100;”语句来缩短启动时间。“mapreduce.input.fifileinputformat.list-status.num-threads”参数需要先添加到Hive的白名单才可设置。
12.5.2 Join优化
select l_orderkey, sum(l_extendedprice * (1 - l_discount)) as revenue, o_orderdate, o_shippriority from customer, orders, lineitem where c_mktsegment = 'BUILDING' and c_custkey = o_custkey and l_orderkey = o_orderkey and o_orderdate < '1995-03-22' and l_shipdate > '1995-03-22' limit 10; Join顺序优化后如下: select l_orderkey, sum(l_extendedprice * (1 - l_discount)) as revenue, o_orderdate, o_shippriority from orders, lineitem, customer where c_mktsegment = 'BUILDING' and c_custkey = o_custkey and l_orderkey = o_orderkey and o_orderdate < '1995-03-22' and l_shipdate > '1995-03-22' limit 10;
12.5.3 Group By优化
操作场景
12.5.4 数据存储优化
说明: xx为具体使用的Hive表名。
12.5.5 SQL优化
select sum(l_extendedprice* (1 - l_discount)) as revenue from lineitem, part where ( p_partkey = l_partkey and p_brand = 'Brand#32' and p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG') and l_quantity >= 7 and l_quantity <= 7 + 10 and p_size between 1 and 5 and l_shipmode in ('AIR', 'AIR REG') and l_shipinstruct = 'DELIVER IN PERSON' ) or ( p_partkey = l_partkey and p_brand = 'Brand#35' and p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK') and l_quantity >= 15 and l_quantity <= 15 + 10 and p_size between 1 and 10 and l_shipmode in ('AIR', 'AIR REG') and l_shipinstruct = 'DELIVER IN PERSON' ) or ( p_partkey = l_partkeyand p_brand = 'Brand#24' and p_container in ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG') and l_quantity >= 26 and l_quantity <= 26 + 10 and p_size between 1 and 15 and l_shipmode in ('AIR', 'AIR REG') and l_shipinstruct = 'DELIVER IN PERSON' )
select sum(l_extendedprice* (1 - l_discount)) as revenue from lineitem, part where ( p_partkey = l_partkey and p_brand = 'Brand#32' and p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG') and l_quantity >= 7 and l_quantity <= 7 + 10 and p_size between 1 and 5 and l_shipmode in ('AIR', 'AIR REG') and l_shipinstruct = 'DELIVER IN PERSON' ) or ( p_partkey = l_partkey and p_brand = 'Brand#35' and p_container in ('MED BAG', 'MED BOX', 'MED PKG', 'MED PACK') and l_quantity >= 15 and l_quantity <= 15 + 10 and p_size between 1 and 10 and l_shipmode in ('AIR', 'AIR REG') and l_shipinstruct = 'DELIVER IN PERSON' ) or ( p_partkey = l_partkeyand p_brand = 'Brand#24' and p_container in ('LG CASE', 'LG BOX', 'LG PACK', 'LG PKG') and l_quantity >= 26 and l_quantity <= 26 + 10 and p_size between 1 and 15 and l_shipmode in ('AIR', 'AIR REG') and l_shipinstruct = 'DELIVER IN PERSON' )
12.5.6 使用Hive CBO优化查询
说明: CBO优化器会基于统计信息和查询条件,尽可能地使join顺序达到最优。但是也可能存在特殊情况导致join顺序调整不准确。例如数据存在倾斜,以及查询条件值在表中不存在等场景,可能调整出非优化的join顺序。 开启列统计信息自动收集时,需要在reduce侧做聚合统计。对于没有reduce阶段的insert任务,将会多出reduce阶段,用于收集统计信息。
说明: 指定FOR COLUMNS时,收集列级别的统计信息。 指定NOSCAN时,将只统计文件大小和个数,不扫描具体文件。
说明: 列级别统计信息的收集不支持复杂的数据类型,例如Map,Struct等。 表级别统计信息的自动收集不支持Hive on HBase表。