我在蜂巢上工作,我是新手。我面临一些关于配置单元查询性能的问题。
即使有数百个可用的映射器,分配给我的工作的映射器数量也非常少。我试过设置
mapred.map.tasks=200
。但它只需要 20 到 30 个映射器。我了解,映射器的数量取决于输入拆分。有没有其他选择来增加映射器?如果不是,那么为什么要mapred.map.tasks
引入 parameter()?是否有任何资源可以让我理解将 hive 查询与 map-reduce 作业相关联,即查询的不同部分在哪里执行?
有关设置地图任务的更多信息,请查看此链接:http ://wiki.apache.org/hadoop/HowManyMapsAndReduces 。基本上, mapred.map.tasks 只是一个提示;它通常不会真正控制任何东西。
要查看 Hive 查询是如何执行的,只需在查询前加上explain
. 例如:explain select foo from bar;
。如果您需要更多信息,还有explain extended
.
我看到这个问题很久以前就被问过了,我会尝试回答它,即使这里的一些建议在被问到问题时不可用。
要优化 Hive 性能:
mapreduce.input.fileinputformat.split.maxsize
的输入大小和每个 reducer 的输入大小来完成:hive.exec.reducers.bytes.per.reducer
请记住,“越多越好”并不总是正确的。因此,您需要根据需要调整这些数字。
优化连接,将连接转换为映射连接,如果其中一张表是小表(如果可能)...(https://cwiki.apache.org/confluence/display/Hive/LanguageManual+JoinOptimization)
在条件中经常使用的列(WHERE)上对表进行分区。
例如,如果您经常请求
SELECT * from myTable WHERE someColumn = 'someValue'
,建议在“someColumn”列上对表进行分区,
这将使您的查询仅搜索分区文件 someColumn=SomePartition 而不是搜索整个表文件。
在某些情况下,压缩中间结果可能会提高性能(取决于您的硬件配置、网络和 CPU/内存)。这可以通过设置属性来完成:hive.intermediate.compression.codec
选择正确的压缩编解码器,例如使用 Snappy(如这里):
SET hive.exec.compress.output=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
SET mapred.output.compression.type=BLOCK;
在提问时不可用:
使用优化的文件格式来存储您的表格,而不是使用文本文件或序列文件,您可以使用 ORC (hive 0.11 +) 例如 ( https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC )
使用另一个引擎来执行您的查询,而不是 MapReduce,您可以使用 Tez 甚至 Spark 。例如,使用 tez:
<property>
<name>hive.execution.engine</name>
<value>tez</value>
</property>
如需进一步优化,您可以参考此处
您可以减少 'mapreduce.input.fileinputformat.split.maxsize' 以增加映射器的数量(更多拆分)。