cdh hive on spark_基于CDH集群的大数据项目的优化总结

基于CDH集群的大数据项目的优化总结

点击上方“技术支持联盟”,选择“置顶公众号”

第一时间了解程序员大小事儿

作者:Jin,一个头发茂密的大数据方向攻城狮,一个爱为小伙伴排忧解难的小伙伴~

 摘要:CDH是Cloudera公司的开源平台发行版,包括Apache Hadoop。通过将Hadoop与十几个其他关键的开源项目集成,可执行端到端的大数据工作流程。简单讲:CDH 封装了各类大数据组件,是一个拥有快速安装、中心化管理、集群监控等功能的工具。

7e2c5b9f02ee1cfb3b3dcec61dd6e519.png

01

概论

由于CDH的便利性,目前作者经历的多数项目都是运行在CDH集群上。近期由于工作需要,对部分大数据项目进行了梳理、优化,在这个过程中发现了一些问题,针对遇到的问题,进行了一些优化。对相关情况进行了总结,如有表述错误或偏差的情况,敬请谅解。

2

02

存在现象

  在项目运行和集群使用过程中,发现存在性能不理想,达不到预期效果、集群服务不稳定的问题。通过排查日志、监控任务发现,存在以下问题:

1.  因业务属性问题,存在大量数据量大、计算复杂的任务,这部分任务执行效率慢,造成整体作业时间较长;

2.  Hdfs Namenode服务暂停,造成任务无法提交

3.  Hive Server2服务暂停,造成任务无法提交

4.  Impala任务执行失败,返回内存不足情况

5.  Impala+kudu任务,仅千万级的数据量计算任务,执行耗时近3小时

6.  集群的计算资源使用不充分,利用率低

0 3

基本情况

1. 用户作业方面,目前10个用户进行作业,一半是实时作业用户,一半是离线作业的用户。

 2. 资源配置方面,实时作业用户分配资源较少,全天运行任务。离线作业用户分配资源较多,仅在固定时间点进行作业,虽然整体资源较高,但是分配到用户上较分散,利用率不高。

 3.  作业类型方面,实时作业以SparkStreaming任务为主,离线作业方面以Hive任务和Impala+Kudu任务为主。

 4.  组件使用方面,常出现的问题集中在impala内存不足、hive锁造成任务阻塞、impala+kudu任务耗时较长、hive任务耗时较长等问题上。

 5.  组件服务方面,常出现HDFS NameNode服务暂停、HIveServer2服务暂停等现象。

04

优化思路

对于发现的问题和梳理出的基本情况,进行点对点式的优化。

1. 在计算资源方面,主要优化思路是提高资源利用率、降低任务资源。

2. 在组件服务方面,主要优化思路是排查组件暂停阶段日志,定位服务暂停原因并进行针对性改进。

3. 在任务耗时方面,主要优化思路是调整sql、核查执行计划,定位慢的原因,同时根据对应组件机制,进行优化。

      优化从集群配置和代码程序两方面共同进行。

05

具体措施

提升资源利用率

提升任务执行效率最简单的方式,就是从资源上入手,增加计算资源。除了简单的增加资源,还可以从提升资源利用率方面入手。

目前作业用户中,除实时作业外的5个用户,各自进行计算的时间点皆不统一。主要分散在0-2点,2-4点,4-7点的几个时间段,在特点外的时间内,用户没有计算任务,资源是处于空闲状态当中。

对此情况,主要是实现让资源根据时间段来进行分配,将资源有效的使用起来,提高利用率,提升任务执行速度。

对此可以配置YARN组件动态资源池的计划模式,根据时间或日期分配资源。

解决Hive Server2服务暂停问题

个别情况下,出现hive任务报错,作业中断。开发人员从任务日志上查看,jdbc连接hive错误,连接拒绝。

91d6167a049a95b585bd1001a347055e.png

运维人员从组件日志中查看,GC时间过长。

6d3b02e7ba059aacf6bd1f4c6e304b8b.png

对于该情况,常见原因是H2服务挂掉。从CM组件界面上查看Hive服务运行状况,连接节点的HiveServer2服务确实处于挂掉状态。从监控图上看,该节点的连接数过多,JVM内存达到上限。

  解决方案:

(1)集群配置方面根据实际情况调大jvm堆内存上限。

(2)集群配置方面配置H2服务的高可用。

(3)项目组方面对同一个HiveServer2服务,减少并发量。(未配置H2的HA情况下)

(4)项目组方面对SQL进行优化,避免过于复杂且数据量较大的任务,拆分中间表

(5)项目组方面对SQL进行优化,避免同时生成过多的分区/大量动态分区

解决Hdfs NameNode服务暂停问题

作业任务超时,执行失败,任务报错信息返回连接超时等相关错误,经检查impala、hive组件连接正常,但任务执行失败,无法读取或写入数据。根据组件的机制,定位到HDFS组件问题,查看到HDFS NameNode服务运行状态不良。

经排查,是NameNode组件的JVM内存达到上限,频繁GC,该参数受到HDFS 中文件夹、文件数量影响,发现当时文件数达到1300多万,但实际HDFS存储占用不大。

053c093c240d4376a7102f82b66a9afa.png

              当时组件监控状态

  解决方案:

(1)集群配置方面根据实际情况调大jvm堆内存上限。

(2)集群配置方面配置NameNode服务的高可用。

(3)项目组方面降低小文件数

优化小文件数

在使用过程中出HDFS小文件过多,除了造成HDFS NameNode组件暂停外,还对计算任务有影响,小文件过多,影响读取性能。

对HDFS组件中文件情况进行统计,发现文件数过多的情况主要集中在OGG实时同步任务和Hive任务当中。

OGG任务是每分钟同步一次,生成一个或多个文件(单表全天至少3600个文件),没有再做定期合并,存在大量小/空文件情况。

Hive任务主要是进行计算然后落地的数据表,存储文件存在大量低于50M的文件,但整表大小是大于G级别的。经检查,hive组件中涉及到合并部分的参数配置过低,并未进行调优,故默认生成的文件数较小。              

  解决方案:

(1)集群配置提高合并相关配置参数。

(2)项目组方面在脚本中根据情况设定参数合并文件。

(3)项目组方面对OGG任务中添加定期合并数据文件逻辑

Hive on spark模式

在使用Hive组件进行离线计算过程中,发现遇到大表计算、复杂关联计算的场景时,执行缓慢,个别任务的缓慢造成了项目整体完成时间的延迟。

当前Hive计算引擎使用的是默认的MapReduce,在CDH6.0.0集群中,还可以选择Spark作为执行引擎并且Hive on spark模式性能远优于hive on MapReduce,但由于默认的参数配置过低,hive on spark 模式下无法合理使用资源,性能达不到预期效果,资源无法全部利用,在集群方面修改参数可能会影响其他用户项目而且需要重启集群,所以没有从集群方面修改。后考虑在Hive脚本中设置Session级参数进行个性化修改,但又由于当前集群Hive的权限限制无法修改,相关参数在无法修改的名单当中。

 解决方案:

(1)集群方面将相关配置参数添加到白名单当中,修改hive.security.authorization.sqlstd.confwhitelist.append参数。

(2)项目组方面在程序中根据实际情况设置session级参数,调整内存、核数等配置

优化impala+kudu任务

在检查作业日志过程中,发现一个impala+kudu计算任务,执行时间达到2.5-3个小时,后续任务依赖于该任务,从而造成调度阻塞,影响整体的完成时间。

对该任务进行检查时,主要是检查任务的执行计划及对应时间,发现任务主要堵塞在线程存储等待时间和KUDU扫描时间。

511c2c0098efc9c787c7d0289135430e.png

根据具体的执行计划后发现,kudu表扫描速度低到每秒500条左右,性能极差。Kudu是存在缓存的概念,表数据若在缓存当中,则读取性能高,若不在缓存当中,需要临时读取磁盘,遇到磁盘IO高,网络波动大等情况下,读取很缓慢。

 解决方案:

(1)集群方面提高kudu组件缓存参数上限,提升读性能

(2)集群方面增加机器内存配置

(3)项目组方面降低数据表数据量

(4)项目组方面根据kudu特性进行代码开发,修改语法

(5)项目组方面临时性增加定时任务,将数据表保持在热数据状态

优化impala使用

impala组件单节点内存上限分别是25G/35G,原来集群没有操作资源隔离,用户使用内存没有设置上限,故所有任务都能够提交,目前完成资源隔离后,各用户有资源使用上限,故在使用过程中,impala部分任务提交失败,返回内存不足。

97dbf8903f18fa87f47abf6ae4e97f15.png

 解决方案:

(1)项目组方面在提交任务前使用compute stats XXX命令,统计表信息;

06

达成效果

1. 提高资源利用率方面,配置计划模式实现根据时间段动态使用资源。配置完成后用户G、用户H整体作业完成时间分别提升1小时左右。配置情况如下:

f3ab832c5261a7ae5ee2c4fbf8793790.png     2. 使用hive on spark 模式并设定合理参数后,性能提升至少35%-50%,作业耗时减少将近一半。对比图如下:

8901f92ec5a885bc29d3350b17106fc6.png1702ab41869d019bc1cf8afd72dc3db5.png44a053d3d956927ccf671e27010ef027.png

测试序号

作业名

执行引擎

设置executor内存

耗时

1

Mem16G

spark

16G

21s

2

Mem4G

spark

4G

52s

3

--

mr

--

59s

    3. 优化impala+kudu任务后,个别任务作业耗时由2.5-3小时降为秒级;该项目作业整体运行时间提前两小时完成。对比图如下:

9c8738567cbf213ec96f12c491e56524.png

d963a286e9262665854361187d173e83.png

    4. 因内存问题报错的Impala任务在执行前增加compute stats命令后,能够在当前上限资源情况下执行完成作业。

    5. 调整hive、hdfs组件、进行小文件合并后,截止目前没有再出现过相同错误造成的服务暂停现象。

07

总结

大数据项目依赖于稳定的集群环境和高效的程序,同时大数据项目使用多组件共同运行,具有一定的复杂性,针对不同的业务场景、不同的数据量、不同的组件、不同的硬件,解决方案都不相同,集群和程序两方面都需要进行协调沟通,针对性的进行更改参数或程序。

96832e433b48100a2e4957a426cd8d6f.pngEND

5b6f18cb0eab9d567e76a36dea4f323a.gif

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CDH(Cloudera's Distribution for Hadoop)是Cloudera公司针对Hadoop生态系统进行的一系列软件包和工具的集成,其中包括Hive on Spark的配置。 Hive是一个建立在Hadoop之上的数据仓库基础架构,它提供了类似于SQL的查询语言HiveQL,方便用户使用SQL语言对存储在Hadoop中的大型数据集进行查询和分析。Spark是一个快速、通用的数据处理引擎,具有内存计算的特性,能在内存中高效地处理大规模数据。 在CDH中配置Hive on Spark需要进行以下步骤: 1. 确保CDH集群已经正确安装和配置,并且已经启动了Hive服务和Spark服务。 2. 在CDH管理界面中,选择Hive服务,然后点击“配置”选项卡。 3. 在配置页面中,找到“Hive 服务”下的“Ancillary Service Configuration”部分。在“Spark”部分中,填写正确的Spark主节点地址和端口号。 4. 点击“保存并重启”以应用配置更改。 5. 在CDH管理界面中,选择Spark服务,然后点击“配置”选项卡。 6. 在配置页面中,找到“Spark 特定”的部分。在“Spark 实例模式”中选择“Standalone”,表示将使用独立的Spark集群。 7. 在“Spark 主节点地址”中填写正确的Spark主节点的地址。 8. 点击“保存并重启”以应用配置更改。 9. 配置完成后,可以使用HiveQL语句在Hive中使用Spark进行查询和分析数据。在Hive命令行或Hue界面中,编写需要的查询语句并执行。 通过以上步骤,就可以在CDH上成功配置Hive on Spark。这样就可以同时利用HiveSpark的强大功能,实现对大规模数据的高效分析和处理。 ### 回答2: CDH配置Hive on Spark是指在CDH平台上配置使用Spark作为Hive的计算引擎。下面是具体的步骤: 1. 首先,确保已经在CDH平台上安装了HiveSpark组件。 2. 在Hive的配置文件中,需要添加以下参数来启用Hive on Sparkhive.execution.engine = spark hive.spark.client.connect.timeout = 300s hive.spark.client.server.connect.timeout = 300s 3. 在Spark的配置文件中,需要增加以下参数来支持Hive on Sparkspark.master = yarn-client spark.deploy.mode = client spark.submit.deployMode = client spark.yarn.queue = default spark.executor.instances = 10 spark.executor.memory = 4G spark.executor.cores = 2 spark.driver.memory = 4G 4. 然后,重启HiveSpark的服务。 5. 运行Hive脚本或者Hive命令时,可以在Hive中使用"hive.execution.engine=spark"设置为Spark引擎,或者在命令行中使用"--engine=spark"参数。 配置完成后,Hive会将相应的作业提交给Spark来执行,利用Spark的分布式计算能力加速Hive查询的执行速度。需要注意的是,配置Hive on Spark需要确保CDH平台中的HiveSpark是兼容的,并且调整Spark的资源配置以满足计算需求。 总之,通过CDH配置Hive on Spark可以充分发挥Spark的并行处理能力,提高Hive查询的执行效率和性能。 ### 回答3: CDH是一种大数据解决方案,用于配置Hive on Spark的步骤如下: 1. 首先,确保已安装CDH集群并启动了HiveSpark组件。如果还没有安装,请按照CDH文档进行安装和配置。 2. 检查HiveSpark的版本兼容性。Hive on Spark需要HiveSpark版本之间的兼容性,查看CDH文档以了解哪些版本适用于您的集群。 3. 在Hive配置文件中启用HiveSpark支持。打开Hive配置文件(hive-site.xml),设置hive.execution.engine为spark。 4. 配置Spark属性。在Spark配置文件(spark-defaults.conf)中,设置spark.master为yarn-client或yarn-cluster,这取决于您的CDH集群配置。还可以通过设置其他属性来优化Spark执行引擎的性能。 5. 启动Hive服务。重启Hive服务以使配置更改生效。您可以使用以下命令重新启动Hive服务: sudo service hive-server2 restart 6. 测试Hive on Spark。使用Hive命令行或其他Hive客户端,运行一些Hive查询并确认它们是否在Spark上执行。 配置Hive on Spark可以提供更好的性能和资源利用率。而且,使用Spark作为执行引擎还可以充分利用Spark提供的丰富的数据处理功能和API。通过使用CDHHive on Spark配置,您可以更好地处理和分析大规模的数据集。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值