暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Yarn-Hive-MapReducer-Impala性能优化篇

whoami 2016-03-09
724

  Hadoop企业级应用案例之SQL on Hadoop倒数第二周课程马上就要完成了,感谢一直以来支持的朋友,坚持下来不容易,也有很多不如意的地方,经验不足,请大家多参与讨论,有反馈才能根据情况做调整?性能优化篇,目前更新了2节最新的内容。还有一些小思考,课后大家有时间尽量回复我。非常感谢支持!


• Yarn 

  –CPU:yarn.nodemanager.resource.cpu-vcores = 8

  –内存:yarn.nodemanager.resource.memory-mb = 8G


• Map Tasks:

mapreduce.map.memory.mb=2240   # Container size

mapreduce.map.java.opts=-Xmx2016m  # JVM arguments for a Map task

mapreduce.map.cpu.vcores=1


• Reduce Tasks:

mapreduce.reduce.memory.mb=2240  # Container size

mapreduce.reduce.java.opts=-Xmx2016m  # JVM arguments for a Reduce task

mapreduce.reduce.cpu.vcores=1


• MapReduce Application Master:

yarn.app.mapreduce.am.resource.mb=2240  # Container size

yarn.app.mapreduce.am.command-opts=-Xmx2016m  # JVM arguments for an Application Master

yarn.app.mapreduce.am.resource.cpu-vcores=1


-----

Yarn: 

yarn.nodemanager.resource.memory-mb  60GB #yarn中其他一些任务也耗内存 

yarn.nodemanager.resource.cpu-vcores 18core


Mapper /node

 CPU:1   [mapreduce.map.cpu.vcores ]

 MEM:2G  [mapreduce.map.memory.mb ]  


  ===> 18 map slot/node


Reducer/node

 CPU:1   [mapreduce.reduce.cpu.vcores]

 MEM:2G  [mapreduce.reduce.memory.mb]   

   ===> 【如果有60G内存,实际有CPU 18个,所以只能启动18个reduce在每个node上】 | 18 reduce slot/node



–Heap Size:-Xmx在mapreduce.map.java.opts

–Heap Size:-Xmx在mapreduce.reduce.java.opts



<property>

<name>hive.mapred.reduce.tasks.speculative.execution</name>

<value>false</value>

</property>

<property>

<name>mapreduce.reduce.speculative</name>

<value>false</value>

</property>

<property>

<name>hive.ignore.mapjoin.hint</name>

<value>false</value>

</property>

<property>

<name>hive.mapjoin.smalltable.filesize</name>

<value>500000000</value>

</property>

<property>

<name>hive.exec.parallel</name>

<value>true</value>

</property>

<property>

<name>hive.exec.parallel.thread.number</name>

<value>16</value>

</property>

<property>

<name>hive.cli.print.current.db</name>

<value>true</value>

</property>

<property>

<name>hive.cli.print.header</name>

<value>true</value>

</property>

<property>

<name>hive.stats.autogather</name>

<value>false</value>

</property>


reducer个数

  • hive.exec.reducers.bytes.per.reducer

  • mapred.reduce.tasks=-1


权限问题

  • hive.warehouse.subdir.inherit.perms


HiveServer2内存

 -Xmx=2048m 甚至 -Xmx=4g


数据倾斜

  set hive.exec.reducers.max=200

  set mapred.reduce.tasks=200

  set hive.groupby.skewindata=true;

  set hive.skewjoin.key=100000

  set hive.optimize.skewjoin=true

  set hive.groupby.mapaggr.checkinterval=100000


Hadoop 2.7+ :

允许用户设置每个job可同时运行的map task和reduce task数目。这个功能非常实用,用户可通过以下两个参数控制同时运行的task数目:

mapreduce.job.running.map.limit (default: 0, for no limit)

mapreduce.job.running.reduce.limit (default: 0, for no limit)


spark on yarn

----

// 启用动态资源分配

set spark.dynamicAllocation.enabled=true;

set spark.dynamicAllocation.schedulerBacklogTimeout=  1s;

set spark.dynamicAllocation.executorIdleTimeout=120s;

set spark.dynamicAllocation.sustainedSchedulerBacklogTimeout=1s

set spark.dynamicAllocation.minExecutors=100;

set spark.dynamicAllocation.maxExecutors=400;

set spark.shuffle.service.enabled=true;

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

spark.shuffle.service.enabled true   //启用External shuffle Service服务

spark.dynamicAllocation.enabled true  //开启动态资源分配

spark.dynamicAllocation.minExecutors 1  //每个Application最小分配的executor数

spark.dynamicAllocation.maxExecutors 30  //每个Application最大并发分配的executor数

spark.dynamicAllocation.schedulerBacklogTimeout 1s 

spark.dynamicAllocation.executorIdleTimeout=120; //executor空闲时间超过120s回收

spark.dynamicAllocation.sustainedSchedulerBacklogTimeout 5s


compress.codec:

      •mapreduce.map.output.compress.codec 

      •mapreduce.output.fileoutputformat.compress.codec 

      •mapreduce.output.fileoutputformat.compress.type 

      – org.apache.hadoop.io.compress.DefaultCodec 

      – org.apache.hadoop.io.compress.SnappyCodec [最佳选择]

      – org.apache.hadoop.io.compress.BZip2Codec GzipCodec【GzipCodec压缩最高,但是时间上比较耗时】


客户端设置:

  Job:

    •mapreduce.job.reduces 根据情况设置 

     –(节点数 * reduce slot数) 的倍数 

    •mapreduce.client.submit.file.replication 提交jar文件的副本个数

    •mapreduce.map.output.compress + codec (对map生成的中间数据,做一些压缩,但是会耗时,cpu压力?)


  io.sort:

    •mapreduce.task.io.sort.factor = 64 

    •mapreduce.task.io.sort.mb - io.sort的内存,缓存map中间结果的buffer 

      –io.sort.mb (MR1)

    •mapreduce.map.sort.spill.percent - MR2的map.sort内存溢出百分比

      –io.sort.spill.percent (MR1)

    •mapreduce.reduce.shuffle.parallelcopies - 复制(洗牌)阶段期间 reduce 运行的并行传输的默认数量

      –sqrt(节点数* map slot数) 与 (节点数 * map slot数)/2 之间



--SQL 95

SELECT count(distinct ws1.ws_order_number) as order_count,

               sum(ws1.ws_ext_ship_cost) as total_shipping_cost,

               sum(ws1.ws_net_profit) as total_net_profit

FROM web_sales ws1

JOIN customer_address ca ON (ws1.ws_ship_addr_sk = ca.ca_address_sk)

JOIN web_site s ON (ws1.ws_web_site_sk = s.web_site_sk)

JOIN date_dim d ON (ws1.ws_ship_date_sk = d.d_date_sk)

LEFT SEMI JOIN (SELECT ws2.ws_order_number as ws_order_number

                               FROM web_sales ws2 JOIN web_sales ws3

                               ON (ws2.ws_order_number = ws3.ws_order_number)

                               WHERE ws2.ws_warehouse_sk <> ws3.ws_warehouse_sk

      ) ws_wh1

ON (ws1.ws_order_number = ws_wh1.ws_order_number)

LEFT SEMI JOIN (SELECT wr_order_number

                               FROM web_returns wr

                               JOIN (SELECT ws4.ws_order_number as ws_order_number

                                          FROM web_sales ws4 JOIN web_sales ws5

                                          ON (ws4.ws_order_number = ws5.ws_order_number)

                                         WHERE ws4.ws_warehouse_sk <> ws5.ws_warehouse_sk

        ) ws_wh2

                               ON (wr.wr_order_number = ws_wh2.ws_order_number)) tmp1

ON (ws1.ws_order_number = tmp1.wr_order_number)

WHERE d.d_date between '2002-05-01' and '2002-06-30' and

               ca.ca_state = 'GA' and

               s.web_company_name = 'pri';



Hive优化:

   前: 344.609 s

   后: 273.793 s




Impala:

  impala 无on yarn,没资源池限制: 184.84s

  llama on yarn模式,资源池控制:143.13s


  +-------------+---------------------+--------------------+

  | order_count | total_shipping_cost | total_net_profit   |

  +-------------+---------------------+--------------------+

  | 508         | 823037.2186106443   | -138806.7298403084 |

  +-------------+---------------------+--------------------+

  Fetched 1 row(s) in 143.13s


1、内存

    -服务器端(impalad)

        .mem_limit #一个节点的impala守护进程能使用的内存


    -default_query_options

        .mem_limit=xxx   #每启动一个impala client它的单一查询,能够使用的最大内存


2、并发查询

    -queue

        .default pool 设置

        .-queue_wait_timeout_ms默认只有60s-->600s


3、资源管理  

    -Dynamic Resource Pools

        .并发控制:max running queries


4、llama on yarn  #impala基于yarn的动态资源分配实现

    - default_query_options --> REQUEST_POOL=root.llama  # 指定一个以长任务运行于yarn,资源池

    - http://cloudera.github.io/llama/llama-site.html

    - cpu && mem config


5、impala 溢写磁盘,需要占用空间

   Impala Daemon 暂存目录 


-- 大数据数据仓库选型中,集群性能指标的主要基准测试标准是?


-- 看具体的应用场景

    -做报表,没有太多的adhoc查询,ok ?

    -有多用户同时访问,多用户同时提交查询的话,hadoop表现就不那么好了,延迟严重,

      并发性没看到很好的解决方案出现?

    -一个是计算,一个是数据转换,hadoop计算处理后放入rdbms or NOSQL(newsql) ?


我的几个问题:

-- 是否需要讲解更多?有关错误以及解决过程?目前我把最佳实践告诉各位?

   你在使用集群1-2年后才能慢慢遇到问题,才知道集群规划,参数该怎么设置

   该犯的错你一个不会少? 


-- 基础,百度谷歌就能解决的,就别直接来问我,在群里讨论即可?一些概念性的东西,下来多去看看资料?

   泪流满面,不是说了0基础学习大数据技术吗?我们这个课程太高级?NO,NO,NO! 

   

==> Impala Daemon 内存限制,mem_limit,impalad内存设置导致问题:导致的问题如下:


ERROR:  com.cloudera.llama.util.LlamaException: RESERVATION_ASKING_MORE_MB - Reservation '574da7b46da0b8d0:1dc47257073ccab2', expansion 'null' is asking for more memory in mb '15112' than capacity '5281' on node 'server04'., com.cloudera.llama.util.LlamaException: RESERVATION_ASKING_MORE_MB - Reservation '574da7b46da0b8d0:1dc47257073ccab2', expansion 'null' is asking for more memory in mb '15112' than capacity '5281' on node 'server04'.,  at com.cloudera.llama.am.impl.ExpansionReservationsLlamaAM.checkAndUpdateCapacity(ExpansionReservationsLlamaAM.java:170),   at com.cloudera.llama.am.impl.ExpansionReservationsLlamaAM.reserve(ExpansionReservationsLlamaAM.java:129),  at com.cloudera.llama.am.impl.APIContractLlamaAM.reserve(APIContractLlamaAM.java:144),  at com.cloudera.llama.am.LlamaAMServiceImpl.Reserve(LlamaAMServiceImpl.java:132),   at com.cloudera.llama.am.MetricLlamaAMService.Reserve(MetricLlamaAMService.java:140),   at com.cloudera.llama.thrift.LlamaAMService$Processor$Reserve.getResult(LlamaAMService.java:512),   at com.cloudera.llama.thrift.LlamaAMService$Processor$Reserve.getResult(LlamaAMService.java:497),   at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39),  at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39),  at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:206),  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145),   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615),   at java.lang.Thread.run(Thread.java:745)

WARNING: The following tables are missing relevant table and/or column statistics.

tpcds_text_10.customer_address,tpcds_text_10.date_dim,tpcds_text_10.web_returns,tpcds_text_10.web_sales,tpcds_text_10.web_site


1. If I understand correctly, what you want is to set a default query mem limit from CM using the safety valve machanism. That should have the effect that any Impala query has a default query mem_limit based on that value (you can still change it on a case by case basis if needed):


You can refer to this docs page:

http://www.cloudera.com/content/cloudera/en/documentation/cloudera-impala/latest/topics/impala_config_options.htm


Search for 'default_query_option'


2. Alternatively, you may want to refer to:


http://www.cloudera.com/documentation/cdh/5-1-x/Impala/Installing-and-Using-Impala/ciiu_resource_management.html#rm_resource_estimates_unique_1


and consider setting the 'rm_always_use_defaults' option min conjunction with 'rm_default_memory' and 'rm_default_cpu_cores'.


文章转载自whoami,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论