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