| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Hive优化策略 -> 正文阅读 |
|
[大数据]Hive优化策略 |
语句级别优化--列、分区裁剪 ? ? ? ? 查询过程中减少不必要的分区和列的查询。 --NULL处理 ? ? ? ? -如无需对应字段可以在语句中直接过滤; ? ? ? ? -如需要可以提前筛选出来Union all关联输出,或者赋予新值(测试结果显示更优于前者)。 --不同类型字段关联 ? ? ? ? 会导致按照数据类型分配Reducer,导致数据倾斜,此处需要转化为同一类型。 --Join操作 ? ? ? ? -大&小表:小表在左(会被先加载),大表在右。新版Hive已经处理了这个问题,会自动优化。 ? ? ? ? -大&大表:减少查询量,如仅查询增量 ? ? ? ? -map join:当一个表比较小时,可以开始此功能,将join从reducer提前到Map阶段。Join操作在Map阶段完成,不再需要Reduce,所以Map Task的个数就等于结果文件数。
--谓词下推
? ? ? ? -注意:如果使用外连接,则谓词下推会失效 --group by操作 ? ? ? ? 默认情况下,完成Map阶段后,同一key值会发送到同一reducer,此时一个key值过大的就会产生数据倾斜。针对这种情况有一下两种方式:
--count&distinct操作 ? ? ? ?数据量大的情况下,count distinct需要一个reduce task完成,这一个reducer处理数据量太大。建议使用先group by再count的方式。 Map&Reduce级别优化--减少Map数 ? ? ? ? 主要针对小文件(远小于文件块大小)较多的情况,如一个SQL查询对应共有10000个文件,但其中很多是远小于128MB的小文件,总大小只有1G,正常执行会用10000个map任务,将会耗费大量的Map计算资源。那么此时需要通过合并文件的方式来减少map数,如下:
--增大Map数 ????????当input的文件比较大且任务逻辑复杂,从而导致map执行非常慢,此时可以考虑增加Map数,使得每个map处理的数据量减少,从而提高任务的执行效率。
--Reduce数确定与调整 ? ? ? ? 在不指定reducer个书的情况下,hive会根据以下设定来确定个数
--只有一个reducer的情况 ? ? ? ? 当操作都是全局的,如没有group by的汇总、使用order by、存着笛卡尔乘积 文件级别优化--源头减少 ? ? ? ? -使用distribute by分区,尽量少使用动态分区 ? ? ? ? -减少reduce的数据 --文件合并 ? ? ? ? -重建表,建表时减少reduce数量 ? ? ? ? -hadoop archive文件归档 ? ? ? ? -合并Map和Reduce的结果文件
系统级别优化--计算引擎 ? ? ? ? 当前可以使用的计算引擎有MR、TEZ、SPARK,可以通过hive.execution.engine设置 --存储格式 ? ? ? ? -TextFile:默认格式,行存储,数据不压缩;可以使用压缩算法,但是压缩后不切分。 ? ? ? ? -SequenceFile:二进制文件,行存储,Hadoop API提供的一种二进制文件,以key-value的形式序列化到文件中。支持三种级别压缩,block级别最好。 ? ? ? ? -RCFile:数据按行分块,每块按列存储,不支持任意方式的数据写操作,仅提供一种追加接口。 ? ? ? ? -ORCFile:是RCFile的改良版本 ? ? ? ? 其中SequenceFile、RCFile、ORC格式的表不能直接从本地文件导入数据,数据要先导入到TextFile格式的表中,然后再从TextFile表中用insert导入到SequenceFile、RCFile表中。另外还有Parquet、AVRO等格式 --本地MR ????????如果在hive中运行的sql本身数据量很小,那么使用本地MR的效率要比分布式的快很多。如下三个参数都满足时,才会使用本地MR:
--并行执行 ????????应用于可以并行运行的MR作业,例如在联接之前处理不同源表的作业。从Hive0.14开始,也适用于移动可以并行运行的任务,例如在多次插入期间移动文件以插入目标。通过set hive.exec.parallel=true设置。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/4 3:30:12- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |