在介绍hive优化之前,首先要知道hive是什么。
1.hive简介
- hive是基于hadoop的一哥数据仓库工具,可以将结构化的数据文件映射成一张完整的数据包,并提供完整的sql查询功能,可以将sql语句转化成mapreduce任务进行运行。
- Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。
2.Hive与关系型数据库的区别
- hive和关系数据库存储文件的系统不同,hive使用的是hadoop的HDFS(hadoop的分布式文件系统),关系数据库则是服务器本地的文件系统
- hive使用的计算模型是mapreduce,而关系数据库则是自己设计的计算模型
- 关系数据库都是为实时查询的业务进行设计的,而hive则是为海量数据做数据挖掘设计的,实时性很差
- Hive很容易扩展自己的存储能力和计算能力,这个是继承hadoop的,而关系数据库在这个方面要比数据库差很多
3.Hive优化策略
根据前面介绍,hive是将sql语句转化成MapReduce任务去运行,一个hive查询往往会生成多个Map Reduce Job而一个MR又会有Map,Reduce,Splii,Shuffle,Sort等阶段。所以hive优化可以分为针对MR中具体步骤的优化,MR的整体优化以及查询的优化。
(1)MR中具体步骤的优化
一个MR Job会有Map、Reduce、Spill、Shuffle和Sort这几个阶段,接下来根据这些具体的阶段去优化hive。
Map的优化:
Map阶段的优化主要是确定合适的map数。map数的确定与其计算公式有关系,map数的计算公式如下:
num_Map_tasks = max[${Mapred.min.split.size},
min(${dfs.block.size}, ${Mapred.max.split.size})]
• Mapred.min.split.size指的是数据的最小分割单元大小。
• Mapred.max.split.size指的是数据的最大分割单元大小。
• dfs.block.size指的是HDFS设置的数据块大小。
一般来说dfs.block.size这个值是一个已经指定好的值,而且这个参数Hive是识别不到的,所以实际上只有Mapred.min.split.size和Mapred.max.split.size这两个参数(本节内容
后面就以min和max指代这两个参数)来决定Map数量。在Hive中min的默认值是1B,max的默认值是256MB。所以如果不做修改的话,就是1个Map task处理256MB数据,我们就以调整max为主。通过调整max可以起到调整Map数的作用,减小max可以增加Map数,增大max可以减少Map数。需要提醒的是,直接调整Mapred.Map.tasks这个参数是没有效果的。
调整大小的时机根据查询的不同而不同,总的来讲可以通过观察Map task的完成时间来确定是否需要增加Map资源。如果