一. 故障处理部分

1.1. spark提交任务报错java.lang.NoClassDefFoundError: com/alibaba/fastjson/JSON

报错原因: 在运行环境没有找到fastjson的依赖库

解决方法: 在SPARK_HOME/jars/ 添加fastjson-VERSION.jar包。 例如我的环境下SPARK_HOME是/usr/local/service/spark/。

  1. [hadoop@10 ~]$ ls $SPARK_HOME/jars/fast*
  2. /usr/local/service/spark/jars/fastjson-1.2.12.jar

1.2.  跨HDFS集群、HDFS属主用户不同,传输文件没有权限的问题

这个问题衍生出两件事,把这两件事处理完问题即可解决。

  • 不同集群间解析
  • 不同集群属主

先看一下不同集群间解析。要想跨集群传输文件,首先得确定集群相互"认识",即集群间确定通过ip或者hostname可达。在ip可达的前提下,我们判断集群间是否"认识",则需要检查hdfs-site.xml中dfs.namenode.datanode.registration.ip-hostname-check这项配置。它表示是否将ip反向解析成主机名,默认为true。如果未设置这一项,则需要对/etc/hosts添加主机解析,对于HDFS这种规模性集群来说,这很显然是比较繁琐的。

对于不同集群属主来说,可以通过修改被传文件权限或通过添加用户、附加组使用户获得文件的读取权限。

1.3 HDFS中hdfshosts直接使用ip遇到的问题

故障描述:

  1. 在hdfs web页面显示dn全部dead
  2. strace 追踪dn进程,发现连接nn超时
  3. 查看dn日志报错如下:
  1. 18/11/27 22:53:00 ERROR datanode.DataNode: Initialization failed for Block pool BP-958982478-10.0.220.44-1543329751956 (Datanode Uuid null) service to /10.0.220.44:9100 Datanode denied communication with namenode because hostname cannot be resolved (ip=10.0.220.48, hostname=10.0.220.48): DatanodeRegistration(0.0.0.0:50010, datanodeUuid=1e26933b-35a3-4d3f-8c5f-3ab03f10ca62, infoPort=50075, infoSecurePort=0, ipcPort=50020, storageInfo=lv=-56;cid=CID-1f213b85-b28c-4824-a44c-813c95ce7ecc;nsid=1612667934;c=0)
  2.         at org.apache.hadoop.hdfs.server.blockmanagement.DatanodeManager.registerDatanode(DatanodeManager.java:852)
  3.         at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.registerDatanode(FSNamesystem.java:4486)
  4.         at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.registerDatanode(NameNodeRpcServer.java:1286)
  5.         at org.apache.hadoop.hdfs.protocolPB.DatanodeProtocolServerSideTranslatorPB.registerDatanode(DatanodeProtocolServerSideTranslatorPB.java:96)
  6.         at org.apache.hadoop.hdfs.protocol.proto.DatanodeProtocolProtos$DatanodeProtocolService$2.callBlockingMethod(DatanodeProtocolProtos.java:28752)
  7.         at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:616)
  8.         at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:982)
  9.         at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2217)
  10.         at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2213)
  11.         at java.security.AccessController.doPrivileged(Native Method)
  12.         at javax.security.auth.Subject.doAs(Subject.java:422)
  13.         at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1758)
  14.         at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2213)

问题分析:

首先想到的就是NN与DN通信出现了问题。但是如题所述"直接使用ip",也就是说不在/etc/hosts做任何配置的前提下能正常工作。这时就需要考虑怎样在hdfs的配置里面能够使DN直接通过ip来访问NN,即禁用对DN的ip做反向域名解析。

解决方法:

在NameNode节点 的 hdfs-site.xml添加如下内容

  1. <property>
  2.       <name>dfs.namenode.datanode.registration.ip-hostname-check</name>
  3.       <value>false</value>
  4. </property>

1.4 ambari hive server2启动失败。

报错日志如下

  1. Caused by: java.sql.SQLException: Access denied for user 'hive'@'xx.xx.xx.xx'(using password: YES)
  2.         at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
  3.         at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4187)
  4.         at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119)
  5.         at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:927)
  6.         at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1709)
  7.         at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1252)
  8.         at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2488)
  9.         at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2521)
  10.         at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2306)
  11.         at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:839)
  12.         at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49)
  13.         at sun.reflect.GeneratedConstructorAccessor17.newInstance(Unknown Source)
  14.         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  15.         at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
  16.         at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
  17.         at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:421)
  18.         at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:350)
  19.         at java.sql.DriverManager.getConnection(DriverManager.java:664)
  20.         at java.sql.DriverManager.getConnection(DriverManager.java:208)
  21.         at com.jolbox.bonecp.BoneCP.obtainRawInternalConnection(BoneCP.java:361)
  22.         at com.jolbox.bonecp.BoneCP.<init>(BoneCP.java:416)
  23.         ... 71 more

手动连接mysql依然连接不上,检查发现连接权限不够,重新授权后,启动成功。

1.5 通过flume HDFSSink 写HDFS丢数据

flume 日志报错如下

  1. 30 Jul 2018 21:33:01,573 WARN [SinkRunner-PollingRunner-DefaultSinkProcessor] (org.apache.flume.sink.hdfs.BucketWriter.append:545) - Caught IOException writing to HDFSWriter (No lease on /tmp/20180730/2018073021.1564493581533.json.tmp (inode 33774359): File does not exist. [Lease. Holder: DFSClient_NONMAPREDUCE_-2075237917_36, pendingcreates: 1]
  2. at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkLease(FSNamesystem.java:3432)
  3. at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.analyzeFileState(FSNamesystem.java:3233)
  4. at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getNewBlockTargets(FSNamesystem.java:3071)
  5. at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getAdditionalBlock(FSNamesystem.java:3031)
  6. at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.addBlock(NameNodeRpcServer.java:725)
  7. at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.addBlock(ClientNamenodeProtocolServerSideTranslatorPB.java:492)
  8. at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java)
  9. at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:616)
  10. at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:982)
  11. at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2049)
  12. at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:2045)
  13. at java.security.AccessController.doPrivileged(Native Method)
  14. at javax.security.auth.Subject.doAs(Subject.java:422)
  15. at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698)
  16. at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2045)
  17. ). Closing file (hdfs://xx.xx.xx.xx:xx/tmp/20180730//2018073021.1564493581533.json.tmp) and rethrowing exception.

问题分析:

从报错情况来看,flume 使用HDFSWriter.appened方法写事件时,发现临时文件已经没有租约,并未找到该文件,然后尝试close文件,发现文件早已经close,再次抛出异常。

为什么出现这种情况呢?通过查看配置文件sink部分,发现hdfs.idleTimeout 的值设置过小。

  1. agent.sinks.k1.type = hdfs
  2. agent.sinks.k1.hdfs.path = "hdfs地址"
  3. agent.sinks.k1.hdfs.filePrefix = %Y%m%d%H
  4. agent.sinks.k1.hdfs.fileSuffix = .json
  5. agent.sinks.k1.hdfs.useLocalTimeStamp=true
  6. agent.sinks.k1.hdfs.writeFormat = Text
  7. agent.sinks.k1.hdfs.fileType = DataStream
  8. agent.sinks.k1.hdfs.rollInterval = 300
  9. agent.sinks.k1.hdfs.rollSize = 5073741824
  10. agent.sinks.k1.hdfs.batchSize = 10000
  11. agent.sinks.k1.hdfs.rollCount = 0
  12. agent.sinks.k1.hdfs.callTimeout = 100000
  13. agent.sinks.k1.hdfs.idleTimeout = 30
  14. agent.sinks.k1.hdfs.round = true
  15. agent.sinks.k1.hdfs.roundValue =60
  16. agent.sinks.k1.hdfs.roundUnit = minute

由于这个值设置的太小,然后每隔30s 就会判断正在 bucketWriter 的文件是否更新,如果没有更新 ,他就会flush, 然后关闭bucketWriter 。而实际上我们的source类型采用的是spooldir,每60s才会产生新文件。在没有延迟的情况下,每60s bucketWriter才会更新,最后就导致一部分正常的HDFS写请求失败。

解决方法

修改hdfs.idleTimeout 的值为 hdfs.rollInterval 的2倍。

  1. agent.sinks.k1.hdfs.idleTimeout = 600

hdfs.rollInterval 为hdfs文件的回滚周期,刚好达到rollInterval 需要回滚时,若出现HDFS或者网络错误,导致回滚失败。那么就经常在hdfs上出现很多.tmp文件。这时如果设置了hdfs.idleTimeout ,就可以很好的解决这个问题。但是切记,不可以设置的太短。建议稍微大于 hdfs.rollInterval 值。

二. hadoop集群平滑退役/上线节点(DataName/tasktracker or NodeManager)

在生产环境中可能会遇到退役(下线)服务器需求,对于计算节点来说强制下线节点影响的只是task作业,但是对于HDFS来说,就会出现数据丢失的风险。当然hadoop也提供了平滑下线的机制。

2.1 退役DataNode

2.1.1 在namenode节点hdfs-site.xml中增加配置,PATH路径根据自己实际情况进行修改

  1. <property>
  2. <name>dfs.hosts.exclude</name>
  3. <value>/usr/local/service/hadoop/etc/hadoop/hdfsexcludedhosts</value>
  4. </property>

2.1.2 在相关文件中添加需要退役的主机

  1. [hadoop@10 ~]$ cat /usr/local/service/hadoop/etc/hadoop/hdfsexcludedhosts
  2. 10.0.0.1
  3. 10.0.0.2

2.1.3 在NameNode 运行以下命令,将经过审核的DataNode更新至NameNode

  1. [hadoop@10 ~]$ hdfs dfsadmin -refreshNodes

2.1.4 查看下线情况

  1. hdfs dfsadmin -report

Decomissioning标记的即为正在下线的DataNode,hadoop集群会将下线的DataNode数据块复制到其他节点。

复制完成之后会变成Decommission Status : Decommissioned。

2.1.5 下线完成后,清空/usr/local/service/hadoop/etc/hadoop/hdfsexcludedhosts 文件

  1. [hadoop@10 ~]$ > /usr/local/service/hadoop/etc/hadoop/hdfsexcludedhosts

注意: 如果hadoop集群为HA,则需要在2个主控节点做相同操作

2.2 退役NodeManager 节点

2.2.1 在RM(ResourceManager)节点yarn-site.xml中增加配置,PATH路径根据自己实际情况进行修改

  1. <property>
  2. <name>yarn.resourcemanager.nodes.exclude-path</name>
  3. <value>/usr/local/service/hadoop/etc/hadoop/yarnexcludedhosts</value>
  4. </property>

2.2.2 在相关文件中添加需要退役的主机

  1. [hadoop@10 ~]$ cat /usr/local/service/hadoop/etc/hadoop/yarnexcludedhosts
  2. 10.0.0.1
  3. 10.0.0.2

2.2.3 在RM节点 运行以下命令,将经过审核的NodeManager更新至RM

  1. [hadoop@10 ~]$ yarn rmadmin -refreshNodes

2.2.4 下线完成后,在nodes include文件中去掉下线的机器,并清空exclude 文件

  1. #yarn-site.xml 中nodes include 配置路径,路径根据自己实际情况
  2. <property>
  3. <name>yarn.resourcemanager.nodes.include-path</name>
  4. <value>/usr/local/service/hadoop/etc/hadoop/yarnhosts</value>
  5. </property>
  1. [hadoop@10 hadoop]$ > /usr/local/service/hadoop/etc/hadoop/yarnexcludedhosts

注意: 如果hadoop集群为HA,则需要在2个主控节点做相同操作

2.3 上线DataNode节点

2.3.1 修改dfs.hosts对应配置文件,添加需要上线的机器

  1. [hadoop@10 ~]$ cat /usr/local/service/hadoop/etc/hadoop/hdfshosts
  2. 10.0.100.53
  3. 10.0.100.52

2.3.2 在NameNode节点运行以下命令,将经过审核的datanode更新至namenode

  1. [hadoop@10 ~]$ hdfs dfsadmin -refreshNodes

2.3.3 检查是否上线成功

  1. hdfs dfsadmin -report

注意: 如果hadoop集群为HA,则需要在2个主控节点做相同操作

2.4 上线NodeManager节点

2.4.1 在nodes include文件中添加需要上线的机器

  1. #yarn-site.xml 中nodes include 配置路径,路径根据自己实际情况
  2. <property>
  3. <name>yarn.resourcemanager.nodes.include-path</name>
  4. <value>/usr/local/service/hadoop/etc/hadoop/yarnhosts</value>
  5. </property>
  1. [hadoop@10 ~]$ cat /usr/local/service/hadoop/etc/hadoop/yarnhosts
  2. 10.0.100.53
  3. 10.0.100.52

2.4.2 在RM节点 运行以下命令,将经过审核的NodeManager更新至RM

  1. [hadoop@10 ~]$ yarn rmadmin -refreshNodes

注意: 如果hadoop集群为HA,则需要在2个主控节点做相同操作

三. hadoop集群标签加入与退出

在生产环境中除了会遇到退役(下线)服务器需求,也可能会对集群标签做一些相关操作,下面主要说一下在集群中如何从标签中添加或退出节点

标签相关操作

列出当前集群中存在的节点标签

  1. yarn cluster --list-node-labels

删除当前集群中已存在的节点标签

  1. yarn rmadmin -removeFromClusterNodeLabels "<label1>,<label2>,..."

添加节点标签到节点上

  1. yarn rmadmin -replaceLabelsOnNode "node1.example.com=X"

通过如下命令可以批量从节点标签中添加节点

  1. $ cat addNodeList.txt
  2. node1.example.com
  3. node2.example.com
  4. node3.example.com
  5. node4.example.com
  6. node5.example.com
  7. $ cat addNodeList.txt | xargs -t -i yarn rmadmin -replaceLabelsOnNode "{}=X"

从节点标签中移除节点

  1. yarn rmadmin -replaceLabelsOnNode "node1.example.com"

通过如下命令可以批量从节点标签中移除节点

  1. cat addNodeList.txt
  2. node1.example.com
  3. node2.example.com
  4. node3.example.com
  5. node4.example.com
  6. node5.example.com
  7. $ cat addNodeList.txt | xargs -t -i yarn rmadmin -replaceLabelsOnNode "{}"

致谢:Hadoop 委任和解除节点

Flume-ng HDFS Sink “丢数据”

hadoop运维笔记的更多相关文章

  1. Linux系统运维笔记(五),CentOS 6.4安装java程序

    Linux系统运维笔记(五),CentOS 6.4安装java程序 用eclipse编译通的java程序,现需要实施到服务器.实施步骤: 一,导出程序成jar包. 1,在主类编辑界面点右健,选  ru ...

  2. Linux系统运维笔记(四),CentOS 6.4安装 MongoDB

    Linux系统运维笔记(四),CentOS 6.4安装 MongoDB 1,下载 https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6 ...

  3. Linux系统运维笔记(四),CentOS 6.4安装Nginx

    Linux系统运维笔记(四),CentOS 6.4安装Nginx 1,安装编译工具及库文件 yum -y install make zlib zlib-devel gcc-c++ libtool op ...

  4. Linux系统运维笔记(三),设置IP和DNS

    Linux系统运维笔记(三),设置IP和DNS 手工配置静态的IP地址 也就是手工配置IP地址.子网掩码.网关和DNS. vi /etc/sysconfig/network-scripts/ifcfg ...

  5. Linux系统运维笔记(二),Linux文件编辑命令

    Linux系统运维笔记 Linux文件编辑命令 首先我们使用命令 vi filename 打开一个文件,这个时候进入到的是命令模式 接下来我们按i,然后键盘随便输入写内容. 然后按ESC重新进入到命令 ...

  6. Linux系统运维笔记(一),查看系统版本和设置系统时间

    Linux系统运维笔记 查看系统版本和设置系统时间 查看系统版本 lsb_release -a (适用于所有的linux,包括Redhat.SuSE.Debian等发行版,但是在debian下要安装l ...

  7. Hadoop运维记录系列

    http://slaytanic.blog.51cto.com/2057708/1038676 Hadoop运维记录系列(一) Hadoop运维记录系列(二) Hadoop运维记录系列(三) Hado ...

  8. Linux系统运维笔记(6),CentOS 7.6双网卡路由配置

    Linux系统运维笔记(6),CentOS 7.6双网卡路由配置. 一,先确认系统版本: [root@localhost ~]# cat /etc/redhat-releaseCentOS Linux ...

  9. 运维笔记--postgresql占用CPU问题定位

    运维笔记--postgresql占用CPU问题定位 场景描述: 业务系统访问变慢,登陆服务器查看系统负载并不高,然后查看占用CPU较高的进程,发现是连接数据库的几个进程占用系统资源较多. 处理方式: ...

随机推荐

  1. December 21st 2016 Week 52nd Wednesday

    Keep conscience clear, then never fear. 问心无愧,永不畏惧. I find it is very difficult for me to keep consci ...

  2. HTML5 拖放、交换位置

    设置元素为可拖放 draggable 属性设置为 true: <img draggable="true" /> 拖动什么 - ondragstart 和 setData ...

  3. Redis数据的底层存储原理

    redis底层是用什么结构来存储数据的呢? 我们从源码上去理解就会容易的多:   redis底层是使用C语言来编写的,我们可以看到它的数据结构声明.一个 dict 有两个dictht,一个dictht ...

  4. iOS动画暂停和继续-本质是速度控制和时间坐标转换

    时间永不停止! 写一个CALayer的分类,控制动画的暂停与继续 extension CALayer { ///暂停动画 func pauseAnimation() { //取出当前时间,转成动画暂停 ...

  5. 【jQuery】todolist

    1 2 3 用npm命令下载依赖,优点:不用去网上找链接,代码都一样 4.jQuery自动下载进node_modules文件下 npm install jquery --save  这句命令的意思是保 ...

  6. 【Vue】hello world

    参考链接:http://www.jianshu.com/p/5ba253651c3b 1.Vue 是一个前端框架,特点是数据绑定.组件化 如果你之前已经习惯了用jQuery操作DOM,学习Vue.js ...

  7. 在Windows 10中更改网络连接优先级

    查看接口列表 (也可使用 如下) 选择网络连接,然后单击右侧的箭头以更改网络连接优先级.  可以参考之前的部分 链接在此 更改单个wi-fi连接顺序可以使用如下

  8. Kali-linux攻击路由器

    前面介绍的各种工具,都是通过直接破解密码,来连接到无线网络.由于在一个无线网络环境的所有设备中,路由器是最重要的设备之一.通常用户为了保护路由器的安全,通常会设置一个比较复杂的密码.甚至一些用户可能会 ...

  9. fpn

    class-aware detector 和 class-agnostic detector:https://blog.csdn.net/yeyang911/article/details/68484 ...

  10. 日期字符串解析--SimpleDateFormat严格限制日期转换setLenient(false)

    输入“33/12/2011”,用SimpleDateFormat parse()方法,转化为Date(2012,01,02).这样处理相当“33/12/2011”是正常输入,如果需要"33/ ...