Hive引擎替换为Spark(Hive on Spark)
1、背景
Hive on Spark是由Cloudera发起,由Intel、MapR等公司共同参与的开源项目,其目的是把Spark作为Hive的一个计算引擎,将Hive的 查询作为Spark的任务提交到Spark集群上进行计算。通过该项目,可以提高Hive查询的性能,同时为已经部署了Hive或者Spark的用户提供 了更加灵活的选择,从而进一步提高Hive和Spark的普及率。
2、Hive引擎选择
MapReduce: 是一种离线计算框架,将一个算法抽象成Map和Reduce两个阶段进行处理,每个阶段都是用键值对(key/value)作为输入和输出,非常适合数据密集型计算。Map/Reduce通过把对数据集的大规模操作分发给网络上的每个节点实现可靠性;每个节点会周期性地返回它所完成的工作和最新的状态。如果一个节点在设定的时间内没有进行心跳上报,主节点(可以理解为主服务器)就会认为这个节点down掉了,此时就会把分配给这个节点的数据发到别的节点上运算,这样可以保证系统的高可用性和稳定性。因此它是一个很好的计算框架。
TEZ:是基于Hadoop YARN之上的DAG(有向无环图,Directed Acyclic Graph)计算框架。核心思想是将Map和Reduce两个操作进一步拆分,即Map被拆分成Input、Processor、Sort、Merge和Output, Reduce被拆分成Input、Shuffle、Sort、Merge、Processor和Output等。这样,这些分解后的元操作可以任意灵活组合,产生新的操作,这些操作经过一些控制程序组装后,可形成一个大的DAG作业,从而可以减少Map/Reduce之间的文件存储,同时合理组合其子过程,也可以减少任务的运行时间。
Spark:Hive on Spark总体的设计思路是,尽可能重用Hive逻辑层面的功能;从生成物理计划开始,提供一整套针对Spark的实现,比如 SparkCompiler、SparkTask等,这样Hive的查询就可以作为Spark的任务来执行了
三者比较个人意见:
MR计算,会对磁盘进行多次的读写操作,这样启动多轮job的代价略有些大,不仅占用资源,更耗费大量的时间 <–相比较–>
TEZ计算,就会生成一个简洁的DAG作业,算子跑完不退出,下轮继续使用上一轮的算子,这样大大减少磁盘IO操作,从而计算速度更快。 TEZ比MR至少快5倍(约值,反正是快,不必较真0.0) <–相比较–>
Spark计算,DAG生成,Stage划分,比MR快10倍(约值,反正是快,不必较真0.0)与TEZ相比我选择Spark,一来快,二来奇葩问题比较少
3、三种引擎如何切换引擎?
1、配置mapreduce计算引擎
set hive.execution.engine=mr;
2、配置tez计算引擎
set hive.execution.engine=tez;
3、配置spark计算引擎
set hive.execution.engine=spark;
4、hive on spark配置集群模式
set hive.execution.engine=spark;
set spark.master=yarn-cluster;
set mapreduce.job.queuename=xxx;
5、hive on spark参数调优
xxx依据集群规模配置,切合理配置
1、核数调优:yarn.nodemanager.resource.cpu-vcores=xxx
2、内存调优:yarn.nodemanager.resource.memory-mb=xxx*1024
3、executor调优:spark.executor.cores=xxx; spark.executor.memory=xxx;spark.executor.instances;
4、driver调优(作用不大):spark.driver.cores=xxx;spark.driver.memory=xxx;
5、并行度调优:保证核数是task数的2~3倍或以上,重复利用资源
6、结束语
不是意味着把MR放弃,MR依然是离线计算首选;
耗时长的SQL可以用set hive.execution.engine=spark来解决,鼓励尝试;
切换引擎后注意观察函数是否支持、执行结果是否成功、资源划分是否合理。
祝大家顺利,have a good day!