Category Archives: EMR

Aliyun EMR 值班问题解决汇总–DataNode不断掉线问题

在最近给一个大用户排查问题的过程中,发现了这个问题。

现象

客户的DataNode在40分钟内相继有5台掉线,导致了大量的块under replica,客户认为是Hadoop DataNode问题,向我们反馈。

排查

看了客户的ganglia后发现客户的进程总数在那段时间不断增加,直到超过了ulimit。先查看了NameNode的日志,发现这一时期DataNode心跳都超时了,导致了DataNode被认为dead。再查看了一下DataNode的日志,有大量的无法创建线程日志

2017-12-15 10:58:01,078 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Unexpected exception in block pool Block pool ****** (Datanode Uuid ******) service to ******
java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:714)
    at org.apache.hadoop.hdfs.server.datanode.DataNode.transferBlock(DataNode.java:1922)
    at org.apache.hadoop.hdfs.server.datanode.DataNode.transferBlocks(DataNode.java:1930)
    at org.apache.hadoop.hdfs.server.datanode.BPOfferService.processCommandFromActive(BPOfferService.java:657)
    at org.apache.hadoop.hdfs.server.datanode.BPOfferService.processCommandFromActor(BPOfferService.java:615)
    at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.processCommand(BPServiceActor.java:858)
    at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.offerService(BPServiceActor.java:672)
    at org.apache.hadoop.hdfs.server.datanode.BPServiceActor.run(BPServiceActor.java:824)
    at java.lang.Thread.run(Thread.java:745)

这个错误一般是由下面两方面造成的
1.ulimit设置不合理,设置 /etc/security/limits.d/20-nproc.conf (CentOs 7), /etc/security/limits.conf
2.异常程序耗尽资源
排查了一下ulimit,是正常的。再查看了一下DataNode的其它日志,并没有发现态度异常,gc情况也是正常的,于是怀疑是异常任务导致的。
于是查看了一下客户的NodeManager日志,发现了异常的任务日志:

2017-12-15 11:00:26,023 WARN org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor: Exception from container-launch with container ID: container_****** and exit code: 52
ExitCodeException exitCode=52:
        at org.apache.hadoop.util.Shell.runCommand(Shell.java:545)
        at org.apache.hadoop.util.Shell.run(Shell.java:456)
        at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:722)
        at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:212)
        at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:302)
        at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:82)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

这是一个spark任务,查看了一下spark任务异常退出值,52代表了OutOfMemory Error,同时看了一下这个程序监控的proc情况,发现了虚拟内存到110G。所以怀疑是这个程序造成的问题。

结论

最后将我们的结论很快反馈给了客户,让用户检查一下程序,客户找到了相关人员,发现是由于使用线程没有释放,不断生成线程导致的,把异常程序停止后集群恢复正常。

Install Nvidia CUDA on Aliyun ECS

1.首先确认硬件存在Nvidia GPU,并且操作系统版本兼容,我们选取的是CentOS 7版本,所以没有问题

lspci | grep -i nvidia

2.安装cuda toolkit
从官网下载,http://developer.nvidia.com/cuda-downloads,下载后选择对应的平台,我选取的是centos7,对应了cuda toolkit为9,这个对后面的driver安装选择有影响,后面会说明。

rpm -i cuda-repo-rhel7-9-0-local-9.0.176-1.x86_64.rpm
yum install cuda

这样安装好了cuda。

3.加入PATH等

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

4.reboot服务器,然后验证一下

[root@emr-worker-1 release]# nvidia-smi -L
GPU 0: Tesla M40 (UUID: GPU-5ac5582f-b7cb-225a-b698-2c1da3cb1646)

至此,安装完成。

Aliyun EMR 值班问题解决汇总

加入EMR团队将近两个月,开始了值班,主要就是解决用户使用Aliyun EMR产品中出现的问题。不同于当年在新浪做hadoop管理员,当年只是针对HDFS,YARN,OLAP,Stream来解决用户的问题,现在针对EMR所有产品栈的问题道都需要了解,解决,如果解决不了找到相应的同事解决。
本帖会针对出现的一些问题,做记录,并提出解决问题的方法:
1. 用户提出的问题为

使用emr集群上sqoop将RDS上的mysql整库导入到hive,其中修改了hive配置,将hive.metastore.warehouse.dir设置到oss下,现出现数据量大的表不能正常导入,mysql到hdfs这过程成功,到hdfs到oss这过程失败,报错信息为:
错误信息

查看错误后很明显是由于环境变量中缺少distcp jar包,distcp jar包在Hadoop tools中,第一个想到的解决方法是export CLASSPATH中添加hadoop tools中对应的jar包,但是运行时候依然报错,查看了代码路径,发现了是sqoop会调用hive的命令,这个时候的CLASSPATH由hive定义,所以最简单的方法是将distcp jar包拷贝到hive 的lib目录下。
根本的解决方法是在Hive的启动脚本中,yarn的启动脚本中加入hadoop tools的CLASSPATH。