hive 調(diào)優(yōu)

q1-q5搬運自:
http://www.reibang.com/p/32faae7230d5

主要是tez模式(hue)的調(diào)優(yōu)

Tez出現(xiàn)問題
Q1: java.lang.ArithmeticException: / by zero

Vertex failed, vertexName=Map 1, vertexId=vertex_1557110571873_0003_1_00, diagnostics=[Vertex vertex_1557110571873_0003_1_00 [Map 1] killed/failed due to:ROOT_INPUT_INIT_FAILURE, Vertex Input: tez initializer failed, vertex=vertex_1557110571873_0003_1_00 [Map 1], java.lang.ArithmeticException: / by zero
    at org.apache.hadoop.hive.ql.exec.tez.HiveSplitGenerator.initialize(HiveSplitGenerator.java:123)
    at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable$1.run(RootInputInitializerManager.java:278)
    at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable$1.run(RootInputInitializerManager.java:269)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1920)
    at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable.call(RootInputInitializerManager.java:269)
    at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable.call(RootInputInitializerManager.java:253)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

解決
SET hive.tez.container.size = ;
默認(rèn)值:-1
默認(rèn)情況下短纵,Tez將生成一個mapper大小的容器。這可以用來覆蓋默認(rèn)值。
配置文件:hive-site-xml
建議:不小于或者是yarn.scheduler.minimum-allocation-mb的倍數(shù)

Q2: map 0%卡住
解決

查看了一下hive中hive.map.aggr.hash.percentmemory屬性的說明: 
Hive Map 端聚合的哈稀存儲所占用虛擬機的內(nèi)存比例。 
意思是說,當(dāng)內(nèi)存的Map大小,占到JVM配置的Map進程的25%的時候
(默認(rèn)是50%),就將這個數(shù)據(jù)flush到reducer去稚矿,
以釋放內(nèi)存Map的空間。 
錯誤原因:Map端聚合時hash表所占用的內(nèi)存比例默認(rèn)為0.5,這個值超過可用內(nèi)存大小晤揣,導(dǎo)致內(nèi)存溢出桥爽。

Q3: java.lang.NoClassDefFoundError: com/esotericsoftware/kryo/Serializer

ERROR : Vertex failed, vertexName=Map 1, vertexId=vertex_1558679295627_0001_1_00, diagnostics=[Vertex vertex_1558679295627_0001_1_00 [Map 1] killed/failed due to:ROOT_INPUT_INIT_FAILURE, Vertex Input: tez initializer failed, vertex=vertex_1558679295627_0001_1_00 [Map 1], java.lang.NoClassDefFoundError: com/esotericsoftware/kryo/Serializer at org.apache.hadoop.hive.ql.exec.tez.HiveSplitGenerator.initialize(HiveSplitGenerator.java:107) at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable$1.run(RootInputInitializerManager.java:278) at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable$1.run(RootInputInitializerManager.java:269) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1920) at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable.call(RootInputInitializerManager.java:269) at org.apache.tez.dag.app.dag.RootInputInitializerManager$InputInitializerCallable.call(RootInputInitializerManager.java:253) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.ClassNotFoundException: com.esotericsoftware.kryo.Serializer at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 12 more

解決

# 切換指定目錄,拷貝缺少jar
$ cd /opt/cloudera/parcels/CDH-5.11.0-1.cdh5.11.0.p0.34/jars
###################################################################
# 同步配置至所有Hiveserver2以及Hive Metastore Server碉渡、gateway機器聚谁;
###################################################################
cp ./kryo-2.22.jar ../lib/hive/auxlib/
# 如果在hive命令行執(zhí)行,則不會報錯滞诺,如果在hue中執(zhí)行形导,需要重啟hive。

Q4: Caused by: java.lang.OutOfMemoryError: Java heap space

Caused by: java.lang.OutOfMemoryError: Java heap space
 at org.apache.hadoop.hive.serde2.WriteBuffers.nextBufferToWrite(WriteBuffers.java:206)
 at org.apache.hadoop.hive.serde2.WriteBuffers.write(WriteBuffers.java:182)
 at org.apache.hadoop.hive.ql.exec.persistence.MapJoinBytesTableContainer$LazyBinaryKvWriter.writeValue(MapJoinBytesTableContainer.java:248)
 at org.apache.hadoop.hive.ql.exec.persistence.BytesBytesMultiHashMap.writeFirstValueRecord(BytesBytesMultiHashMap.java:574)
 at org.apache.hadoop.hive.ql.exec.persistence.BytesBytesMultiHashMap.put(BytesBytesMultiHashMap.java:229)
 at org.apache.hadoop.hive.ql.exec.persistence.MapJoinBytesTableContainer.putRow(MapJoinBytesTableContainer.java:288)

解決
https://mapr.com/support/s/article/How-to-change-Tez-container-heapsize?language=en_US

修改配置:
<property>
  <name>tez.am.resource.memory.mb</name>
  <value>2048</value>
</property>

Q5 Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.tez.dag.api.TezException): App master already running a DAG

Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.tez.dag.api.TezException): App master already running a DAG
    at org.apache.tez.dag.app.DAGAppMaster.submitDAGToAppMaster(DAGAppMaster.java:1379)
    at org.apache.tez.dag.api.client.DAGClientHandler.submitDAG(DAGClientHandler.java:140)
    at org.apache.tez.dag.api.client.rpc.DAGClientAMProtocolBlockingPBServerImpl.submitDAG(DAGClientAMProtocolBlockingPBServerImpl.java:175)
    at org.apache.tez.dag.api.client.rpc.DAGClientAMProtocolRPC$DAGClientAMProtocol$2.callBlockingMethod(DAGClientAMProtocolRPC.java:7636)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:617)
    at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1073)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2220)
    at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2216)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1920)
    at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2214)
添加配置;
[beeswax]
    max_number_of_sessions=10

Q6 java.lang.AbstractMethodError: org.codehaus.jackson.map.AnnotationIntrospector.findSerializer(Lorg/codehaus/jackson/map/introspect/Annotated;)Ljava/lang/Object;

java.lang.AbstractMethodError: org.codehaus.jackson.map.AnnotationIntrospector.findSerializer(Lorg/codehaus/jackson/map/introspect/Annotated;)Ljava/lang/Object;
    at org.codehaus.jackson.map.ser.BasicSerializerFactory.findSerializerFromAnnotation(BasicSerializerFactory.java:362)
    at org.codehaus.jackson.map.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:252)
    at org.codehaus.jackson.map.ser.StdSerializerProvider._createUntypedSerializer(StdSerializerProvider.java:782)
    at org.codehaus.jackson.map.ser.StdSerializerProvider._createAndCacheUntypedSerializer(StdSerializerProvider.java:735)
    at org.codehaus.jackson.map.ser.StdSerializerProvider.findValueSerializer(StdSerializerProvider.java:344)
    at org.codehaus.jackson.map.ser.StdSerializerProvider.findTypedValueSerializer(StdSerializerProvider.java:420)
    at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:601)
    at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:256)
    at org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:1604)
    at org.codehaus.jackson.jaxrs.JacksonJsonProvider.writeTo(JacksonJsonProvider.java:527)
    at com.sun.jersey.api.client.RequestWriter.writeRequestEntity(RequestWriter.java:300)
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:204)
    at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:147)
    at org.apache.hadoop.yarn.client.api.impl.TimelineClientImpl$TimelineJerseyRetryFilter$1.run(TimelineClientImpl.java:226)
    at org.apache.hadoop.yarn.client.api.impl.TimelineClientImpl$TimelineClientConnectionRetry.retryOn(TimelineClientImpl.java:162)
    at org.apache.hadoop.yarn.client.api.impl.TimelineClientImpl$TimelineJerseyRetryFilter.handle(TimelineClientImpl.java:237)
    at com.sun.jersey.api.client.Client.handle(Client.java:648)
    at com.sun.jersey.api.client.WebResource.handle(WebResource.java:670)
    at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
    at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:563)
    at org.apache.hadoop.yarn.client.api.impl.TimelineClientImpl.doPostingObject(TimelineClientImpl.java:472)
    at org.apache.hadoop.yarn.client.api.impl.TimelineClientImpl.doPosting(TimelineClientImpl.java:321)
    at org.apache.hadoop.yarn.client.api.impl.TimelineClientImpl.putEntities(TimelineClientImpl.java:301)
    at org.apache.tez.dag.history.logging.ats.ATSHistoryLoggingService.handleEvents(ATSHistoryLoggingService.java:358)
    at org.apache.tez.dag.history.logging.ats.ATSHistoryLoggingService.serviceStop(ATSHistoryLoggingService.java:233)
    at org.apache.hadoop.service.AbstractService.stop(AbstractService.java:221)
    at org.apache.hadoop.service.ServiceOperations.stop(ServiceOperations.java:52)
    at org.apache.hadoop.service.ServiceOperations.stopQuietly(ServiceOperations.java:80)
    at org.apache.hadoop.service.CompositeService.stop(CompositeService.java:157)
    at org.apache.hadoop.service.CompositeService.serviceStop(CompositeService.java:131)
    at org.apache.tez.dag.history.HistoryEventHandler.serviceStop(HistoryEventHandler.java:111)
    at org.apache.hadoop.service.AbstractService.stop(AbstractService.java:221)
    at org.apache.hadoop.service.ServiceOperations.stop(ServiceOperations.java:52)
    at org.apache.hadoop.service.ServiceOperations.stopQuietly(ServiceOperations.java:80)
    at org.apache.hadoop.service.ServiceOperations.stopQuietly(ServiceOperations.java:65)
    at org.apache.tez.dag.app.DAGAppMaster.stopServices(DAGAppMaster.java:1949)
    at org.apache.tez.dag.app.DAGAppMaster.serviceStop(DAGAppMaster.java:2140)
    at org.apache.hadoop.service.AbstractService.stop(AbstractService.java:221)
    at org.apache.tez.dag.app.DAGAppMaster$DAGAppMasterShutdownHook.run(DAGAppMaster.java:2438)
    at org.apache.hadoop.util.ShutdownHookManager$1.run(ShutdownHookManager.java:54)

解決

更改tez的jackson JAR為1.9.13版本

Q7: spark讀取表為空习霹,hue中有數(shù)據(jù)
hive --orcfiledump -d



查看s3文件生成目錄朵耕,發(fā)現(xiàn)在表文件夾下面建個二級文件夾, 在內(nèi)部才是數(shù)據(jù)塊文件,與其他表產(chǎn)生的文件存放路徑不一致淋叶。




查看表生成數(shù)據(jù)的過程阎曹,差異是由于直接使用了 union all操作插入語句

Hive on tez 中對insert union操作進行了優(yōu)化,會并行輸出到對應(yīng)的表目錄煞檩,為防止有相同名文件存在处嫌,所以為各自輸出在表目錄下各自設(shè)置了一個目錄,里邊存放執(zhí)行結(jié)果

解決方案:
在運行前設(shè)置計算引擎為mr斟湃,運行速度會下降些熏迹,但生成的數(shù)據(jù)不會產(chǎn)生子目錄,使用起來不會出錯凝赛。
set hive.execution.engine=mr

其他參數(shù)調(diào)優(yōu):搬運自https://www.cnblogs.com/yjt1993/p/11050791.html

一注暗、AM、Container大小設(shè)置
1墓猎、tez.am.resource.memory.mb  #設(shè)置 tez AM容器內(nèi)存
  默認(rèn)值:1024  
  配置文件:tez-site.xml
  建議:不小于或者等于yarn.scheduler.minimum-allocation-mb值捆昏。
  

2、hive.tez.container.size  #設(shè)置 tez container內(nèi)存
  默認(rèn)值:-1
  默認(rèn)情況下毙沾,Tez將生成一個mapper大小的容器骗卜。這可以用來覆蓋默認(rèn)值。
  配置文件:hive-site-xml
  建議:不小于或者是yarn.scheduler.minimum-allocation-mb的倍數(shù)
  
二搀军、AM膨俐、Container JVM參數(shù)設(shè)置
1、tez.am.launch.cmd-opts  #設(shè)置 AM jvm罩句,啟動TEZ任務(wù)進程期間提供的命令行選項。
  默認(rèn)值:-XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps -XX:+UseNUMA -XX:+UseParallelGC(用于GC)敛摘,默認(rèn)的大忻爬谩:80%*tez.am.resource.memory.mb
  配置文件:tez-site.xml
  建議:不要在這些啟動選項中設(shè)置任何xmx或xms,以便tez可以自動確定它們。
  

2屯远、hive.tez.java.ops  #設(shè)置 container jvm
  默認(rèn)值:Hortonworks建議“–server –Djava.net.preferIPv4Stack=true–XX:NewRatio=8 –XX:+UseNUMA –XX:UseG1G”蔓姚,默認(rèn)大小:80%*hive.tez.container.size
  說明:在hive 2.x的官方文檔中沒有找到這個參數(shù)慨丐∑缕辏看有些博客里面有這個值。
  配置文件:hive-site.xml

3房揭、tez.container.max.java.heap.fraction  #設(shè)置task/AM占用jvm內(nèi)存大小的比例备闲。
  默認(rèn)值:0.8
  配置文件:tez-site.xml
  說明:這個值按具體需要調(diào)整,當(dāng)內(nèi)存不足時捅暴,一般都要調(diào)小恬砂。

三、Hive內(nèi)存Map Join參數(shù)設(shè)置
1蓬痒、tez.runtime.io.sort.mb  #設(shè)置輸出排序內(nèi)存大小
  默認(rèn)值:100
  配置文件:tez-site.xml
  建議:40%*hive.tez.container.size泻骤,一般不超過2G
2、hive.auto.convert.join.noconditionaltask  #是否將多個mapjoin合并為一個
  默認(rèn)值:true
  建議使用默認(rèn)值梧奢。
  配置文件:hive-site.xml
3狱掂、hive.auto.convert.join.noconditionaltask.size  
  默認(rèn)值:10000000  (10M)
  說明:這個參數(shù)使用的前提是hive.auto.convert.join.noconditionaltask值為true,多個mapjoin轉(zhuǎn)換為1個時亲轨,所有小表的文件大小總和小于這個值趋惨,這個值只是限制輸入的表文件的大小,并不代表實際mapjoin時hashtable的大小瓶埋。 建議值:1/3* hive.tez.container.size
  配置文件:hive-site.xml
4希柿、tez.runtime.unordered.output.buffer.size-mb  #如果不直接寫入磁盤,使用的緩沖區(qū)大小
  默認(rèn)值:100M
  建議:10%* hive.tez.container.size
  配置文件:tez-site.xml

5养筒、tez.am.container.reuse.enabled  #容器重用
  默認(rèn)值:true
  配置文件:tez-ste.xml

Hive常見錯誤以及優(yōu)化調(diào)參

1. 在使用一些合并操作時曾撤,會有奇怪的報錯

Error while compiling statement: FAILED: IllegalArgumentException Size requested for unknown type: java.util.Collection
這個報錯可能是資源不夠,使用tez模式速度快晕粪,但是更耗資源挤悉。
網(wǎng)上的解決方法:set hive.execution.engine=mr;
在待合并字段前加上distinct修飾,盡量不要有重復(fù)的巫湘。

2.join操作報錯

Cartesian products are disabled for safety reasons. If you know what you are doing, please sethive.strict.checks.cartesian.product to false and that hive.mapred.mode is not set to 'strict' to proceed. Note that if you may get errors or incorrect results if you make a mistake while using some of the unsafe features.

通常是使用多個full outer join或者在使用其他join時装悲,on沒有去等于,而是大于小于之類尚氛,使用笛卡爾積cross join不加on也會有這個情況诀诊。
為了保障整個集群的穩(wěn)定性,類似非全等的 Join 是默認(rèn)禁止的阅嘶,原因在異常代碼中給出了:
FAILED: SemanticException Cartesian products are disabled for safety reasons
這樣就可以避免因為大規(guī)模數(shù)據(jù)的 Join 導(dǎo)致網(wǎng)絡(luò)癱瘓属瓣。

如果清晰的知道载迄,非全等 Join 不會造成影響,那么可以修改這些配置來啟動非全等 join 的操作抡蛙。

set hive.strict.checks.cartesian.product=false;
set hive.mapred.mode=nonstrict;

3.分隔符使用;報錯

Error: Error while compiling statement: FAILED: ParseException line 23:39 cannot recognize input near '<EOF>' '<EOF>' '<EOF>' in ……
concat_ws或者split中使用分號作為分隔符時护昧,會報這樣的錯誤。
在HUE或者數(shù)據(jù)平臺里面可以跑通粗截。
解決方法: 用分號的二進制 073來代替即可惋耙。
例如:concat_ws('\073',collect_set(data))

4.內(nèi)存不夠報錯。

這種錯誤通常是集群機器比較少熊昌。
set hive.auto.convert.join = false;
考慮加上這個設(shè)置可以解決绽榛。
shuffle的時候加上這個設(shè)置不會把小的表放到內(nèi)存中提速。

5.運行特別慢被kill

hive中可以增加或減少map/reduce數(shù)目浴捆,相當(dāng)于改變并行的task數(shù)量蒜田,類似spark中的repartition,也相當(dāng)于最后寫進hive的小文件數(shù)量选泻。
如果某個表只有一個文件冲粤,大小為120M,但包含幾千萬的記錄页眯,如果用1個map去完成這個任務(wù)梯捕,是比較耗時的,這種情況下窝撵,我們要考慮將這一個文件合理的拆分成多個傀顾,這樣就可以用多個map任務(wù)去完成。

  set mapred.reduce.tasks=10;
  create table a_1 as select * from a distribute by rand(123);

這樣會將a表的記錄碌奉,隨機的分散到包含10個文件的a_1表中短曾,再用a_1代替上面sql中的a表,則會用10個map任務(wù)去完成赐劣。每個map任務(wù)處理約十分之一的數(shù)據(jù)嫉拐。這樣一定程度上也能解決數(shù)據(jù)傾斜。
由于字段數(shù)據(jù)的不均勻魁兼,按照某一字段分區(qū)reduce執(zhí)行時會產(chǎn)生數(shù)據(jù)傾斜婉徘,此時在distribute by 后加一個隨機數(shù),按照隨機數(shù)分區(qū)咐汞。

6.sql運行特別慢盖呼,最后報超時或者oom。

方法1:
如果是很簡單的sql化撕,可以考慮設(shè)置:
set hive.fetch.task.conversion=none;
有時候特別慢很簡單的sql取不出數(shù)據(jù)几晤,先執(zhí)行上面的設(shè)置試試。
fetch task = 不啟動MapReduce植阴,直接讀取本地文件輸出結(jié)果锌仅。
這個屬性有三個可選的值:
none:關(guān)閉fetch task優(yōu)化
minimal:只在select 章钾、使用分區(qū)列過濾墙贱、帶有l(wèi)imit的語句上進行優(yōu)化
more:在minimal的基礎(chǔ)上更加強大了热芹,select不僅僅可以是
,還可以單獨選擇幾列惨撇,并且filter也不再局限于分區(qū)字段伊脓,同時支持虛擬列(別名)

方法2:
有時候確實是太慢了,可以考慮增加并行度
hive.exec.parallel參數(shù)控制在同一個sql中的不同的job是否可以同時運行,默認(rèn)為false.

select r1.a
from (
   select t.a from table1 t join table2 s on t.a=s.b) r1 
   join 
   (select s.b from table2 t join table1 s on t.a=s.b) r2 
   on (r1.a=r2.b);

1 當(dāng)參數(shù)為false的時候,三個job是順序的執(zhí)行
set hive.exec.parallel=false;
2 但是可以看出來其實兩個子查詢中的sql并無關(guān)系,可以并行的跑
set hive.exec.parallel=true;
在資源充足的時候hive.exec.parallel會讓那些存在并發(fā)job的sql運行得更快,但同時消耗更多的資源

方法3:
調(diào)整hive.exec.orc.split.strategy參數(shù)
hive.exec.orc.split.strategy參數(shù)控制在讀取ORC表時生成split的策略魁衙。

  • BI策略以文件為粒度進行split劃分报腔;
  • ETL策略會將文件進行切分,多個stripe組成一個split剖淀;
  • HYBRID(默認(rèn))策略為:當(dāng)文件的平均大小大于hadoop最大split值(默認(rèn)256 * 1024 * 1024)時使用ETL策略纯蛾,否則使用BI策略。

對于一些較大的ORC表纵隔,可能其footer較大翻诉,ETL策略可能會導(dǎo)致其從hdfs拉取大量的數(shù)據(jù)來切分split,甚至?xí)?dǎo)致driver端OOM捌刮,因此這類表的讀取建議使用BI策略碰煌。
對于一些較小的尤其有數(shù)據(jù)傾斜的表(這里的數(shù)據(jù)傾斜指大量stripe存儲于少數(shù)文件中),建議使用ETL策略绅作。
另外芦圾,spark.hadoop.mapreduce.input.fileinputformat.split.minsize參數(shù)可以控制在ORC切分時stripe的合并處理。具體邏輯是俄认,當(dāng)幾個stripe的大小小于spark.hadoop.mapreduce.input.fileinputformat.split.minsize時个少,會合并到一個task中處理∶行樱可以適當(dāng)調(diào)小該值夜焦,以此增大讀ORC表的并發(fā)。

方法4:
考慮一些調(diào)優(yōu)
控制map和reduce的數(shù)量:
map役拴、reduce數(shù)據(jù)量糊探,對效率影響較大,因為在啟動和初始化階段是很耗費時間和資源的河闰。
 map數(shù)普遍是通過執(zhí)行時長來確認(rèn)的科平,至少應(yīng)當(dāng)保證每個map執(zhí)行時長在1分鐘以上,太短的話意味著大量重復(fù)的jvm啟用和銷毀姜性。具體設(shè)置要根據(jù)具體任務(wù)來處理瞪慧,有些任務(wù)占用cpu大,有些占用io大部念。
reduce是可以直接設(shè)置的弃酌,reduce數(shù)過多:生成很多小文件氨菇,可能會影響下一個任務(wù)輸入。

控制mapper數(shù)量

Map輸入合并小文件
對應(yīng)參數(shù):
set mapred.max.split.size=256000000; #每個Map最大輸入大小
set mapred.min.split.size.per.node=100000000; #一個節(jié)點上split的至少的大小
set mapred.min.split.size.per.rack=100000000; #一個交換機下split的至少的大小
set hive.input.format=org.apache.Hadoop.hive.ql.io.CombineHiveInputFormat; #執(zhí)行Map前進行小文件合并

在開啟了org.apache.hadoop.hive.ql.io.CombineHiveInputFormat后妓湘,一個data node節(jié)點上多個小文件會進行合并查蓉,合并文件數(shù)由mapred.max.split.size限制的大小決定。

mapred.min.split.size.per.node決定了多個data node上的文件是否需要合并~

mapred.min.split.size.per.rack決定了多個交換機上的文件是否需要合并~

輸出合并(控制下一個任務(wù)的map數(shù)量)

set hive.merge.mapfiles = true #在Map-only的任務(wù)結(jié)束時合并小文件
set hive.merge.mapredfiles = true #在Map-Reduce的任務(wù)結(jié)束時合并小文件
set hive.merge.size.per.task = 256 * 1000 * 1000 #合并文件的大小
set hive.merge.smallfiles.avgsize=16000000 #當(dāng)輸出文件的平均大小小于該值時榜贴,啟動一個獨立的map-reduce

控制reducer的數(shù)據(jù)量

set mapred.reduce.tasks=12; #直接指定reducer個數(shù)
set hive.exec.reducers.bytes.per.reducer=1073741824; #調(diào)整每個reduce處理的數(shù)據(jù)量來控制reducer,默認(rèn)1000^3=1G
hive.exec.reducers.max; #每個任務(wù)最大的reduce數(shù)豌研,默認(rèn)為999

什么情況下只會有一個reduce:
很多時候會發(fā)現(xiàn),任務(wù)重不管數(shù)據(jù)量有多大唬党,不管有沒有調(diào)整reduce的個數(shù)鹃共,任務(wù)一直都只有一個reduce
(1) 數(shù)據(jù)量小于hive.exec.reducers.bytes.per.reducer參數(shù)值的情況外
(2) 沒有g(shù)roup by的匯總
(3) 用了order by

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市驶拱,隨后出現(xiàn)的幾起案子霜浴,更是在濱河造成了極大的恐慌,老刑警劉巖蓝纲,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阴孟,死亡現(xiàn)場離奇詭異,居然都是意外死亡驻龟,警方通過查閱死者的電腦和手機温眉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翁狐,“玉大人类溢,你說我怎么就攤上這事÷独粒” “怎么了闯冷?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長懈词。 經(jīng)常有香客問我蛇耀,道長,這世上最難降的妖魔是什么坎弯? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任纺涤,我火速辦了婚禮,結(jié)果婚禮上抠忘,老公的妹妹穿的比我還像新娘撩炊。我一直安慰自己,他們只是感情好崎脉,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布拧咳。 她就那樣靜靜地躺著,像睡著了一般囚灼。 火紅的嫁衣襯著肌膚如雪骆膝。 梳的紋絲不亂的頭發(fā)上祭衩,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音阅签,去河邊找鬼掐暮。 笑死,一個胖子當(dāng)著我的面吹牛愉择,可吹牛的內(nèi)容都是我干的劫乱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼锥涕,長吁一口氣:“原來是場噩夢啊……” “哼钦奋!你這毒婦竟也來了慰于?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤买猖,失蹤者是張志新(化名)和其女友劉穎刁笙,沒想到半個月后破花,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡疲吸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年座每,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摘悴。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡峭梳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹂喻,到底是詐尸還是另有隱情葱椭,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布口四,位于F島的核電站孵运,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蔓彩。R本人自食惡果不足惜治笨,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赤嚼。 院中可真熱鬧旷赖,春花似錦、人聲如沸探膊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逞壁。三九已至流济,卻和暖如春锐锣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绳瘟。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工雕憔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糖声。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓斤彼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蘸泻。 傳聞我的和親對象是個殘疾皇子琉苇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容