Hive是否执行mapreduce
因为有些sql语句是不需要走mapreduce的。比如:select *、limit。
#在配置文件中hive-site.xml设置
<name>hive.fetch.task.conversion</name>
<value>more</value>
Hive表创建的调优
- 是否创建分区表。(加快查询速率)
- 是否创建外部表。(多个部门使用时可以保证表的安全)
- 选择什么样的存储格式。(textFile,ORCFile,Parquet)
- textFile:行存储格式
- ORCFile:列存储格式(但是数据量太大,会被分会多个块)
- Parquet:行存储格式,但是压缩性能更好
Hive中JOIN语句的调优
首先需要知道默认情况下,join操作是在reduce端进行的,因为通常情况下,要连接的表中的数据会分布在不同的map中处理,这样造成了即使同一个key对应的value可能存在不同的map中,所以必须要等到reduce中去连接。
- map join
在有一个表为小表的情况下,可以把小表所有数据一次性读到每个map节点的内存中,然后进行join关联操作。这样省去了reduce操作运行的效率也会高很多。
数据倾斜
- 引起数据倾斜的操作
- Join,group by
- 本质原因
key值分布不均匀,导致某些reduce的处理的数据量远远大于平均值。 - 表现
任务进度长时间保持在一个值,查看监控页面的时候,发现只有一个或几个reduce子任务未完成。 - 解决方式
- 大小表join:用map join,在map端完成join
- 大大表join:对空值的key变成一个随机字符串,这样相同的空值key就分不到了不同的reduce中。
- 讲倾斜的数据提出出来单独处理,最后union回去。