`
zhangxiong0301
  • 浏览: 359823 次
社区版块
存档分类
最新评论

转载--淘宝hadoop升级遇到的问题

阅读更多

搜索离线dump集群(hadoop&hbase)2013进行了几次重大升级:

 

 

 

2013-04

 

第一阶段,主要是升级hdfs为2.0版本,mapreduce仍旧是1.0;同时hbase也进行了一次重大升级(0.94.5版本),hive升级到0.9.0;

 

2013-09,2013-12

 

第二阶段,主要升级mapreduce到2.0版本即(YARN),hive升级到0.10.0,在13年年底的时候对hbase进行了一次小版本升级;

 

至此,dump离线集群完全进入2.0时代:

 

 

 

通过升级hdfs 2.0优化shortcircuit read,使用domain socket通信等等提升了效率,加快了任务运行速度,同时支持成熟的NAMENODE HA,Federation,解决了让大家担心的集群NN单点问题,集群容量和扩展性得到大大提升。

 

 

 

通过升级yarn对集群资源进行更有效的管理,摒弃了slots的物理划分,采用内存资源控制使集群资源被更有效的利用,从而提高整个集群的吞吐,同时支持丰富的计算框架,为后续DUMP应用架构优化调整提供了广阔的舞台。

 

当然集群的升级过程也遇到了很多问题和困难

 

第一阶段升级过程中遇到的主要问题:

 

1)hdfs升级为2.0后,需要同时升级下hive版本(hive-0.9.0-cdh4.1),之前使用老版本hive jar编译的任务需要使用新版本jar包重新编译

 

2)mr1任务要运行在hdfs 2.0上部分任务会运行失败,主要是2.0中将原来的class换成了interface,需要重新编译即可,少量代码需要添加下throws IOException,依赖的hadoop-core jar包也被拆分成了几个(common,hdfs,mr1等)

 

3)hdfs shell命令差异,主要是针对mkdir或者touchz等中间如果有不存在的路径不会自动创建

 

4)从云梯distcp数据由于hdfs版本不兼容,必须使用hftp的方式,且因hftp不支持密码访问,后来patch解决

 

5)升级hdfs 2.0后集群整体读I/O升高明显,从而导致特别是I/O需求高的build任务延时

 

原因是2.0对dfs.client.read.shortcircuit的调整,在检查是否有权限(dfs.block.local-path-access.user中配置的用户名)进行shortcircuit读取时如果没有权限会将本地的datanode作为deadnode处理,然后数据通过远程读取

 

又因为hbase中dfs.client.read.shortcircuit.buffer.size设置的值不合适导致多读了很多无谓的数据,导致整个集群I/O升高

 

解决方案:

 

设置dfs.client.read.shortcircuit.buffer.size=16K与hbase的block的大小相匹配

 

详细的分析过程见:

 

http://www.atatech.org/article/detail/2733/193

 

http://www.atatech.org/article/detail/7207/193

 

第二阶段升级遇到的主要问题:

 

1)升级到yarn后,Capacity Schedule进行了更新,job提交只需要指定叶子queue名字即可,指定全路径会报错

 

2)没有了map/reduce slots的概念,集群只需配置可用的内存大小,主要的参数:

 

集群:

 

yarn.nodemanager.resource.memory-mb:                            一个nodemanager上可分配给container使用的物理内存大小

yarn.scheduler.minimum-allocation-mb:                                  resource manage分配内存的最小粒度,暂设成1024,job提交需要内存必须为此参数的整数倍

yarn.scheduler.capacity.<queue>.maximum-am-resource-percent:   am所占资源比例,可按queue设,暂设成0.3

yarn.scheduler.capacity.<queue>.user-limit-factor:            单个用户提交job限制,可按queue设,单用户如要抢占最大资源,需要设大

应用:

 

mapreduce.map.memory.mb,mapreduce.reduce.memory.mb:          map,reduce的内存数,默认是1024,2048,如需设大,必须是1024的整数倍,可以简单理解为之前的slots数配置

mapreduce.map.java.opts,mapreduce.reduce.java.opts:           java child进程的jvm heap大小,比上面的值小些

mapreduce.job.reduce.slowstart.completedmaps:                      对于map数较多需要跑多轮,可以设大此值,延迟reduce启动避免占用资源

3)yarn中不在兼容commons-cli-2.0-SNAPSHOT.jar,之前通过将该jar文件copy到hadoop classpath中使用的应用需要部署到各自应用的相关目录下,并在提交任务的时候引用

 

4)一些使用0.19等老版本的hadoop-streaming.jar需要更换为新版本

 

5)container内存超配被kill掉,考虑到job内存的自然增长及一些使用共享内存的任务,所以设置yarn.nodemanager.vmem-pmem-ratio=false关闭物理内存检查

 

6)客户端向AM获取job status报错:IOException

 

原因是AM内存设置太小,频繁GC导致,通过调大yarn.app.mapreduce.am.resource.mb解决

 

7)c2c_merge任务在yarn上运行缓慢

 

经过排查分析是因使用的mmap文件在pagecache中频繁换进换出导致,根本原因还是18与32内核的差异,因为集群升级过程中也对内核进行了升级,通过修改应用代码

 

去除madvise设置的MADV_SEQUENTIA后问题解决,参考:

 

http://baike.corp.taobao.com/index.php/Kbuild在32内核上性能退化问题

 

8)IPV4和IPV6差异引起的长短机器名问题及job data local比例低的问题

 

在yarn resource manager下显示部分机器是长机器名,部分机器是短机器名

 

hbase集群下显示全是长机器名,原因是yarn与hbase获取机器名调用的方法不一样,得到的结果也不一样,导致resourcemanager在分配container时进行优先的host匹配是匹配不上,最后变成任意匹配导致

 

获取机器名差异的根本原因经过分析是java处理ipv6有bug和yarn脚本bug共同导致

 

http://bugs.sun.com/view_bug.do?bug_id=7166687

 

http://www.atatech.org/article/detail/10731/193

 

解决方案1是修改yarn脚本,并提交issue到社区:https://issues.apache.org/jira/browse/YARN-1226

 

解决方案2就是给集群配置上机架感知,且让一个机器一个rack的虚拟机架配置,通过rack匹配绕开任意匹配,在http://www.atatech.org/article/detail/10731/193�0�2中有详细分析

 

9)由于我们当时在方案1还未得出结论前临时采用方案2快速解决线上data local低的问题后发现有部分任务提交失败报错: Max block location exceeded for split

 

原因是:配置了一个节点一个机架后CombineFileInputFormat获取split的block localtion时会根据block分布在哪些rack上获取locations信息,由于机架数等同于机器数,获取到的localtions数会超过集群的默认配置:

 

mapreduce.job.max.split.locations = 10,而yarn上修改了代码会在超出这个配置值时抛出异常,所以任务提交失败

 

解决方案1:增大mapreduce.job.max.split.locations和集群节点数一致

 

解决方案2:patch修改JobSplitWriter中超过配置值抛异常为打印警告日志,与升级前一致

 

详情见:http://www.atatech.org/article/detail/11707/193

 

10)gcih不能正常工作

 

GCIH:http://baike.corp.taobao.com/index.php/GCIH

 

不能正常工作的原因有两个:

 

l�0�2集群升级到yarn后,nm管理job临时目录和distribute file的方式与tt不同,导致GCIH会生成多个mmap文件gcih.dat

 

l�0�2在修复上述问题的过程中,发现散列到不同磁盘上task,jvm classpath加载顺序不一致,导致GCIH不能正常工作

 

解决方案,升级GCIH

 

将gcih.dat生成到gcih.jar软连对应的源目录下,这样一个job只会有一个

 

调整gcih.jar的加载顺序,放到preload里

 

11)集群资源使用100%,job一直hang住

 

当集群root跑满100%而下面的子queue未满时(因为希望集群的资源共享竞争,queue的最大可用资源会进行适当的超配)

 

不会触发抢占reduce资源的过程

 

解决方案:

 

l�0�2不同queue的大任务尽量避开运行

 

l�0�2后续patch修改在root满时触发抢占

 

详细分析过程见:

 

http://www.atatech.org/article/detail/10924/193

 

12)load任务写hbase偶尔会卡住

 

原因是当集群中有节点挂掉或者网络等出现异常可能会导致hbaseclient在select时无线等待,而锁无法释放

 

解决方案:

 

在hbase client的代码里设置超时时间

 

具体原因分析见:

 

http://www.atatech.org/article/detail/9061/193

 

13)集群有节点出现问题,上面的任务一直失败,后续别的任务起来后还会将container分配到这个节点

 

原因是yarn和之前mr1黑名单机制发生了改变

 

mr1是全局的黑名单,一旦被加入黑名单后续任务不会再分配

 

yarn的黑名单是在AM上的,也就是任务级别的,被AM加入黑名单后可以保证当前任务不会被分配上去,但是其他任务的AM中是没有这个信息的,所以还是会分配任务上去

 

解决方案:等待NM将节点健康信息汇报给RM,RM将节点从集群摘除

 

如果一直无法汇报,可以通过yarn支持的外围用户脚本来做健康检查和汇报(需要在yarn配置中配置该脚本)

 

详细分析见:

 

http://www.atatech.org/article/detail/11266/193

 

hive相关:

 

1)out join被拆成多个job

 

问题发现:loader在做多表join的过程时原来的一个job被hive拆成了8个job,耗时由原来的3分钟变成30分钟

 

通过patch解决,参考:

 

http://mail-archives.apache.org/mod_mbox/hive-user/201305.mbox/+r2mdv_tsofa@mail.gmail.com>

 

https://issues.apache.org/jira/browse/HIVE-4611

 

2)设置mapreduce.map.tasks不生效

 

分析是Hive的InputFormat的问题

 

如InputFormat设置为org.apache.hadoop.hive.ql.io.CombineHiveInputFormat,需要设置mapreduce.input.fileinputformat.split.maxsize来控制map的个数

 

如InputFormat设置为org.apache.hadoop.hive.ql.io.HiveInputFormat,则此参数生效

 

解决,将hive配置中默认的InputFormat配置成org.apache.hadoop.hive.ql.io.HiveInputFormat

 

3)写redis的hive job拆成了两个job

 

hive默认设置中,当map输出文件太小,会新起一个job合并小文件

 

解决方案:set hive.merge.mapfiles=false;

 

仍然存在待解决的问题:

 

1)有部分job会导致单disk io到100%,拖慢这个任务

 

2)机器出现异常问题,task全部都在localizing,job一直pending,只能kill掉重新提交

 

3)job或者task被kill掉后,日志也被删除,history中看不到该job的信息,排查问题困难

 

集群HADOOP 2.0的升级,在更好的支持现有业务:主搜,商城,店铺内,PORA个性化,尼米兹平台,中文站(offer,company,minisearch),国际站(ae,sc,p4p,aep4p,scp4p)的基础上为后续离线dump平台:ADUMP的建设夯实了基础。

 

一个统一存储,模块插件化设计,减少各业务线之间数据冗余,避免重复开发,同时支持快速响应各条业务线新需求的全新平台ADUMP将在3月底左右上线,紧跟集群升级的节奏,离线DUMP也将马上进入2.0时代,敬请期待!

分享到:
评论

相关推荐

    Hadoop 3.x(MapReduce)----【Hadoop 序列化】---- 代码

    Hadoop 3.x(MapReduce)----【Hadoop 序列化】---- 代码 Hadoop 3.x(MapReduce)----【Hadoop 序列化】---- 代码 Hadoop 3.x(MapReduce)----【Hadoop 序列化】---- 代码 Hadoop 3.x(MapReduce)----【Hadoop ...

    hadoop最新版本3.1.1全量jar包

    hadoop-annotations-3.1.1.jar hadoop-common-3.1.1.jar hadoop-mapreduce-client-core-3.1.1.jar hadoop-yarn-api-3.1.1.jar hadoop-auth-3.1.1.jar hadoop-hdfs-3.1.1.jar hadoop-mapreduce-client-hs-3.1.1.jar ...

    spark--bin-hadoop3-without-hive.tgz

    本压缩包“spark--bin-hadoop3-without-hive.tgz”提供了Spark二进制版本,针对Hadoop 3.1.3进行了编译和打包,这意味着它已经与Hadoop 3.x兼容,但不包含Hive组件。在CentOS 8操作系统上,这个版本的Spark已经被...

    hadoop-eclipse-plugin1.2.1 and hadoop-eclipse-plugin2.8.0

    为了方便开发者在Eclipse或MyEclipse这样的集成开发环境中高效地进行Hadoop应用开发,Hadoop-Eclipse-Plugin应运而生。这个插件允许开发者直接在IDE中对Hadoop集群进行操作,如创建、编辑和运行MapReduce任务,极大...

    spark-assembly-1.6.0-cdh5.9.2-hadoop2.6.0-cdh5.9.2.jar

    spark-assembly-1.6.0-cdh5.9.2-hadoop2.6.0-cdh5.9.2.jar

    spark-3.1.3-bin-without-hadoop.tgz

    这个"spark-3.1.3-bin-without-hadoop.tgz"压缩包是Spark的3.1.3版本,不含Hadoop依赖的二进制发行版。这意味着在部署时,你需要自行配置Hadoop环境,或者在不依赖Hadoop的环境中运行Spark。 Spark的核心特性包括...

    spark-2.0.0-bin-hadoop2.6.tgz

    本资源是spark-2.0.0-bin-hadoop2.6.tgz百度网盘资源下载,本资源是spark-2.0.0-bin-hadoop2.6.tgz百度网盘资源下载

    spark-3.2.0-bin-hadoop3.2.tgz

    9. **错误修复**:修复了大量已知问题,提高了整体的稳定性和可靠性。 10. **社区支持**:随着版本的更新,Spark的社区活跃度持续增长,这意味着更多的开发者和用户可以提供帮助和支持。 总的来说,Spark 3.2.0是...

    spark-3.2.1-bin-hadoop2.7.tgz

    在Spark 3.2.1版本中,包含了对性能的优化、新功能的添加以及已知问题的修复。 Spark的主要组件包括: 1. Spark Core:Spark的基础框架,负责任务调度、内存管理、错误恢复以及与存储系统的交互。 2. Spark SQL:...

    spark-3.0.0-bin-hadoop2.7.tgz

    Spark-3.0.0-bin-hadoop2.7.tgz 是Spark 3.0.0版本的预编译二进制包,其中包含了针对Hadoop 2.7版本的兼容性构建。这个版本的发布对于数据科学家和大数据工程师来说至关重要,因为它提供了许多性能优化和新功能。 1...

    spark-3.2.1 安装包 下载 hadoop3.2

    Spark 3.2.1是该框架的一个稳定版本,提供了对Hadoop 3.2的支持,这意味着它可以很好地集成到Hadoop生态系统中,利用Hadoop的存储和计算能力。Hadoop是一个分布式文件系统(HDFS)和MapReduce计算模型的集合,为大...

    spark-2.1.0-bin-without-hadoop版本的压缩包,直接下载到本地解压后即可使用

    在Ubuntu里安装spark,spark-2.1.0-bin-without-hadoop该版本直接下载到本地后解压即可使用。 Apache Spark 是一种用于大数据工作负载的分布式开源处理系统。它使用内存中缓存和优化的查询执行方式,可针对任何规模...

    spark-3.0.0-bin-without-hadoop.tgz

    "spark-3.0.0-bin-without-hadoop.tgz" 是Spark 3.0.0版本的二进制发行版,但不包含Hadoop依赖。这个版本特别适合那些已经拥有Hadoop环境或者打算在其他分布式存储系统上运行Spark的应用场景。 Spark的设计目标是...

    spark-3.1.3-bin-hadoop3.2.tgz

    在这个特定的压缩包"spark-3.1.3-bin-hadoop3.2.tgz"中,我们得到了Spark的3.1.3版本,它已经预编译为与Hadoop 3.2兼容。这个版本的Spark不仅提供了源码,还包含了预编译的二进制文件,使得在Linux环境下快速部署和...

    spark-3.2.0-bin-hadoop3-without-hive

    《Spark 3.2.0 与 Hadoop 3 的集成——无 Hive 版本解析》 Spark,作为大数据处理领域的重要工具,以其高效的内存计算和分布式数据处理能力备受青睐。Spark 3.2.0 是一个重要的版本更新,它在性能、稳定性和功能上...

    spark-2.4.5-bin-hadoop2.7.tar.gz

    spark-2.4.5-bin-hadoop2.7.tgz的安装包,适用ubuntu,Redhat等linux系统,解压即可安装,解压命令:tar -zxvf spark-2.4.5-bin-hadoop2.7.tar.gz -C dst(解压后存放路径)

    spark-3.1.2-bin-hadoop3.2.tgz

    Spark 3.1.2是Apache Spark的一个重要版本,它为大数据处理提供了高效、可扩展的框架。这个版本是针对Scala 2.12编译的,并且与...通过深入理解这些概念和组件,开发者可以更好地利用Spark解决各种数据密集型问题。

    spark-assembly-1.5.2-hadoop2.6.0.jar

    《Spark编程核心组件:spark-assembly-1.5.2-hadoop2.6.0.jar详解》 在大数据处理领域,Spark以其高效、易用和灵活性脱颖而出,成为了许多开发者的首选框架。Spark-assembly-1.5.2-hadoop2.6.0.jar是Spark中的一个...

    spark-3.2.1 不集成hadoop安装包

    2. **依赖管理**:Spark运行时可能需要Hadoop的相关库,比如hadoop-client、hadoop-common等,这些需要在构建或运行环境中单独添加。 3. **YARN集成**:如果打算在Hadoop的YARN资源管理器上运行Spark作业,需要配置...

    spark-3.4.1-bin-hadoop3.tgz - Spark 3.4.1 安装包(内置了Hadoop 3)

    文件名: spark-3.4.1-bin-hadoop3.tgz 这是 Apache Spark 3.4.1 版本的二进制文件,专为与 Hadoop 3 配合使用而设计。Spark 是一种快速、通用的集群计算系统,用于大规模数据处理。这个文件包含了所有必要的组件,...

Global site tag (gtag.js) - Google Analytics