Hive on MR/Spark

在当前稍微新一点的Hadoop版本中,都支持Hive跑在Spark上,即使用Spark代替默认的MapReduce作为Hive的执行引擎。实际上,除了Spark和MapReduce,Hive还支持使用Tez作为执行引擎,这里对Hive on Tez不作介绍。假如在已经安装配置好Spark之后,只需要简单地通过“set hive.execution.engine=spark”来切换让Hive跑在Spark之上。

首先试验使用默认的MapReduce作为Hive的计算引擎,

hive> select count(*) from parquet_part;
Query ID = trafodion_20171214134444_539bfa11-c931-4d08-87f7-32384b2afdaa
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapreduce.job.reduces=<number>
Starting Job = job_1512024625412_0010, Tracking URL = http://esg06.esgyncn.local:8088/proxy/application_1512024625412_0010/
Kill Command = /opt/cloudera/parcels/CDH-5.4.11-1.cdh5.4.11.p0.5/lib/hadoop/bin/hadoop job  -kill job_1512024625412_0010
Hadoop job information for Stage-1: number of mappers: 5; number of reducers: 1
2017-12-14 13:44:50,830 Stage-1 map = 0%,  reduce = 0%
2017-12-14 13:44:57,147 Stage-1 map = 40%,  reduce = 0%, Cumulative CPU 7.76 sec
2017-12-14 13:44:58,185 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 20.63 sec
2017-12-14 13:45:04,410 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 22.32 sec
MapReduce Total cumulative CPU time: 22 seconds 320 msec
Ended Job = job_1512024625412_0010
MapReduce Jobs Launched:
Stage-Stage-1: Map: 5  Reduce: 1   Cumulative CPU: 22.32 sec   HDFS Read: 75549 HDFS Write: 9 SUCCESS
Total MapReduce CPU Time Spent: 22 seconds 320 msec
OK
20000000
Time taken: 25.052 seconds, Fetched: 1 row(s)

从以上输出可以看出,上述SQL语句的运行过程中做map、reduce的动作。下面我们使用Spark做为执行引擎,

hive> set hive.execution.engine=spark;
hive> select count(*) from parquet_part;
Query ID = trafodion_20171214134545_788e5aab-7fc0-4484-8769-69fff1c464f5
Total jobs = 1
Launching Job 1 out of 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
  set mapreduce.job.reduces=<number>
Starting Spark Job = 13195ebf-4daf-4203-a605-6c0d209c4965

Query Hive on Spark job[0] stages:
0
1

Status: Running (Hive on Spark job[0])
Job Progress Format
CurrentTime StageId_StageAttemptId: SucceededTasksCount(+RunningTasksCount-FailedTasksCount)/TotalTasksCount [StageCost]
2017-12-14 13:46:01,340 Stage-0_0: 0(+2)/5      Stage-1_0: 0/1
2017-12-14 13:46:04,368 Stage-0_0: 0(+2)/5      Stage-1_0: 0/1
2017-12-14 13:46:05,377 Stage-0_0: 3(+1)/5      Stage-1_0: 0/1
2017-12-14 13:46:06,387 Stage-0_0: 4(+0)/5      Stage-1_0: 0/1
2017-12-14 13:46:08,404 Stage-0_0: 4(+1)/5      Stage-1_0: 0/1
2017-12-14 13:46:09,411 Stage-0_0: 5/5 Finished Stage-1_0: 1/1 Finished
Status: Finished successfully in 15.12 seconds
OK
20000000
Time taken: 23.379 seconds, Fetched: 1 row(s)

从上述输出结果可以看出,这条SQL语句的执行过程中已经采用Spark的方式去执行了。

<think>嗯,用户想了解Hive on MapReduce的性能调优最佳实践和参数配置。我需要结合他们提供的引用内容来整理答案。首先,Hive调优通常涉及多个方面,比如数据压缩、资源分配、动态分区和查询优化等。让我仔细看看用户提供的引用内容。 引用[1]提到了中间数据的压缩,设置hive.exec.compress.intermediate为true,这样可以减少数据传输量,提升性能。中间文件压缩很重要,尤其是在多个MapReduce作业之间传输数据的时候。可能需要提到使用哪种压缩算法,比如Snappy或LZO,因为它们压缩和解压速度快。 引用[2]和[3]虽然主要是关于Hive on Spark的参数调优,但里面提到的一些思路可能也适用于MapReduce。比如动态分配Executor,但在MapReduce里可能对应的是调整mapper和reducer的数量。不过MapReduce的资源管理可能更多依赖于YARN的配置,比如mapreduce.map.memory.mb和mapreduce.reduce.memory.mb这些参数。需要确认这些参数是否属于Hive调优的一部分。 引用[4]提到动态分区的设置,需要将hive.exec.dynamic.partition.mode设为nonstrict。动态分区在处理大量分区时能提升效率,避免静态分区的限制。另外,可能还需要设置hive.exec.max.dynamic.partitions来控制最大分区数,防止过多分区导致的问题。 接下来,用户的问题是关于MapReduce的,所以需要重点整理MapReduce相关的调优参数。比如: 1. 压缩设置:中间数据和最终输出的压缩,如hive.exec.compress.output和hive.exec.compress.intermediate,以及压缩编解码器的选择。 2. 调整mapper和reducer的数量:MapReduce中可以通过mapreduce.job.maps和mapreduce.job.reduces来设置,但通常Hive会自动计算,但有时候手动调整可能更好。比如减少reducer数量过大导致的小文件问题。 3. 资源分配:调整每个task的内存,避免OOM错误,如mapreduce.map.memory.mb和mapreduce.reduce.memory.mb,以及JVM堆大小的设置。 4. 动态分区和分桶:合理使用动态分区和分桶技术,优化数据存储和查询效率。 5. 数据倾斜处理:比如通过hive.groupby.skewindata来应对group by时的数据倾斜。 6. 并行执行:设置hive.exec.parallel为true,允许多个阶段并行执行。 7. 合并小文件:输入阶段合并小文件,输出阶段也合并,减少任务数。 可能还需要提到一些其他参数,比如hive.optimize.sort.dynamic.partition在插入动态分区时的排序优化,或者使用Tez引擎替代MapReduce,不过用户明确问的是MapReduce,所以Tez可能不在讨论范围内。 另外,需要注意参数设置的上下文,比如是在hive-site.xml中设置,还是在会话级别通过SET命令设置。引用中提到的hive.exec.compress.intermediate就是一个例子,用户需要知道在哪里配置这些参数。 可能还要提到监控和诊断工具,比如查看作业的Counter数据,分析哪些阶段耗时较长,从而针对性优化。 总结起来,结构应该分为几个部分:压缩优化、资源参数调整、任务并行度、数据存储优化、动态分区配置、处理数据倾斜、小文件合并等。每个部分给出具体参数和推荐值,并引用对应的引用来支持。例如,中间压缩引用[1],动态分区引用[4],资源参数参考引用[3]中的思路,虽然引用[3]是关于Spark的,但类似的资源管理原则可能适用。 最后生成相关问题的时候,要确保问题覆盖调优的不同方面,比如压缩配置、资源参数、动态分区使用、数据倾斜处理等。</think>### Hive on MapReduce 性能调优最佳实践 #### 一、中间数据压缩优化 1. **启用中间文件压缩** 设置`hive.exec.compress.intermediate=true`,可减少MapReduce作业间的数据传输量,提升I/O效率[^1]。建议使用**Snappy**或**LZO**压缩算法(需Hadoop支持),平衡压缩率速度: ```sql SET hive.exec.compress.intermediate=true; SET mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec; ``` 2. **输出结果压缩** 启用`hive.exec.compress.output`压缩最终输出文件: ```sql SET hive.exec.compress.output=true; SET mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; ``` --- #### 二、资源分配任务并行度 1. **Mapper/Reducer资源配置** - **内存分配**:通过YARN参数控制单个任务资源,避免OOM: ```sql SET mapreduce.map.memory.mb=4096; -- 单个Map Task内存 SET mapreduce.reduce.memory.mb=8192; -- 单个Reduce Task内存 ``` - **JVM重用**:减少任务启动开销: ```sql SET mapreduce.job.jvm.numtasks=10; -- 单个JVM运行的任务数 ``` 2. **动态调整Reducer数量** Hive默认根据数据量计算Reducer数量,可通过`hive.exec.reducers.bytes.per.reducer`调整: ```sql SET hive.exec.reducers.bytes.per.reducer=256000000; -- 每个Reducer处理256MB数据 ``` --- #### 三、数据存储查询优化 1. **动态分区配置** 避免全表扫描,启用动态分区并限制最大分区数[^4]: ```sql SET hive.exec.dynamic.partition.mode=nonstrict; SET hive.exec.max.dynamic.partitions=10000; ``` 2. **合并小文件** - **输入阶段合并**:减少Map任务数: ```sql SET hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; ``` - **输出阶段合并**:避免生成过多小文件: ```sql SET hive.merge.mapfiles=true; -- Map-only作业输出合并 SET hive.merge.mapredfiles=true; -- MapReduce作业输出合并 SET hive.merge.size.per.task=256000000; -- 合并文件阈值 ``` 3. **数据倾斜处理** - **Group By倾斜优化**:启用`hive.groupby.skewindata`: ```sql SET hive.groupby.skewindata=true; -- 生成两个MR Job分散负载 ``` - **Join倾斜处理**:使用Map Join或过滤倾斜键值: ```sql SET hive.auto.convert.join=true; -- 自动转为Map Join(小表<25MB) ``` --- #### 四、高级参数调优 | 参数 | 作用 | 推荐值 | |------|------|--------| | `hive.exec.parallel` | 开启Stage并行执行 | `true` | | `hive.optimize.sort.dynamic.partition` | 动态分区插入时排序优化 | `true` | | `mapreduce.reduce.shuffle.input.buffer.percent` | Reduce阶段Shuffle缓冲区占比 | `0.7` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据源的港湾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值