MAPREDUCE服务 MRS-为什么创建Hive表失败?:回答
回答
当源表或子查询具有大数据量的Partition时,创建Hive表失败。执行查询需要很多的task,此时输出的文件数就会很多,从而导致driver OOM。
可以在创建Hive表的语句中增加distribute by子句来解决这个问题,其中distribute by的字段要选取合适的cardinality(即distinct值的个数)。
distribute by子句限制了Hive表的Partition数量。增加distribute by 子句后,最终的输出文件数取决于指定列的cardinality和“spark.sql.shuffle.partitions”参数值。但如果distribute by的字段的cardinality值很小,例如,“spark.sql.shuffle.partitions”参数值为200,但distribute by字段的cardinality只有100,则输出的200个文件中,只有其中100个文件有数据,剩下的100个文件为空文件。也就是说,如果选取的字段的cardinality过低,如1,则会造成严重的数据倾斜,从而严重影响查询性能。
因此,建议选取的distribute by字段的cardinality个数要大于“spark.sql.shuffle.partitions”参数,可大于2~3倍。
示例:
create table hivetable1 as select * from sourcetable1 distribute by col_age;
- MapReduce服务_如何使用MapReduce服务_MRS集群客户端安装与使用
- MapReduce服务_什么是Hive_如何使用Hive
- 大数据分析是什么_使用MapReduce_创建MRS服务
- MRS备份恢复_MapReduce备份_数据备份
- MapReduce服务_什么是Hue_如何使用Hue
- MapReduce服务_什么是存算分离_如何配置MRS集群存算分离
- MapReduce服务_什么是MapReduce服务_什么是HBase
- MapReduce服务_什么是Loader_如何使用Loader
- MapReduce服务_什么是Kafka_如何使用Kafka
- MapReduce服务_什么是HetuEngine_如何使用HetuEngine