背景

在某次启动hdfs之后,在一个月之后,需要将其重启,但却发现无法停止,无奈只有kill掉进程,再次启动。我并不打算将其问题放弃,想看看到底是什么原因导致这个情况。

查看停止脚本

[hadoop@hadoop001 sbin]$ vim stop-dfs.sh
....
# namenodesNAMENODES=$($HADOOP_PREFIX/bin/hdfs getconf -namenodes)echo "Stopping namenodes on [$NAMENODES]""$HADOOP_PREFIX/sbin/hadoop-daemons.sh" \        <--- 调用另一个脚本--config "$HADOOP_CONF_DIR" \--hostnames "$NAMENODES" \--script "$bin/hdfs" stop namenode
...[hadoop@hadoop001 sbin]$ vim hadoop-daemons.sh
...
# 这里又调用了hadoop-daemon.sh脚本
exec "$bin/slaves.sh" --config $HADOOP_CONF_DIR cd "$HADOOP_PREFIX" \; "$bin/hadoop-daemon.sh"
--config $HADOOP_CONF_DIR "$@"
...[hadoop@hadoop001 sbin]$ vim hadoop-daemon.sh
...
#   HADOOP_PID_DIR   The pid files are stored. /tmp by default.
#   HADOOP_IDENT_STRING   A string representing this instance of hadoop. $USER by defaultpid=$HADOOP_PID_DIR/hadoop-$HADOOP_IDENT_STRING-$command.pid
...
(stop)if [ -f $pid ]; then      <-- 这里主要找到pid,来进行killTARGET_PID=`cat $pid`if kill -0 $TARGET_PID > /dev/null 2>&1; thenecho stopping $commandkill $TARGET_PIDsleep $HADOOP_STOP_TIMEOUTif kill -0 $TARGET_PID > /dev/null 2>&1; thenecho "$command did not stop gracefully after $HADOOP_STOP_TIMEOUT seconds: killing with kill -9"kill -9 $TARGET_PIDfielseecho no $command to stopfirm -f $pidelseecho no $command to stopfi;;(*)echo $usageexit 1;;esac
复制代码

根据脚本中的内容可知,hdfs停止靠的就是/tmp下的pid文件,文件中存的就是pid,就像下面的一样:

[hadoop@hadoop001 tmp]$ pwd
/tmp
[hadoop@hadoop001 tmp]$ ll
-rw-rw-r-- 1 hadoop     hadoop  6 Jul  6 12:54 hadoop-hadoop-datanode.pid
-rw-rw-r-- 1 hadoop     hadoop  6 Jul  6 12:54 hadoop-hadoop-namenode.pid
-rw-rw-r-- 1 hadoop     hadoop  6 Jul  6 12:54 hadoop-hadoop-secondarynamenode.pid
[hadoop@hadoop001 hadoop]$ jps
25330 NameNode
25636 SecondaryNameNode
25463 DataNode
25751 Jps
[root@hadoop001 tmp]# cat hadoop-hadoop-datanode.pid
25463
复制代码

实验

将/tmp路径下的datanode.pid文件删除,再次停止hdfs,看是否会出现无法停止的情况呢?

[hadoop@hadoop001 tmp]$ rm -rf hadoop-hadoop-datanode.pid
[hadoop@hadoop001 tmp]$ ll
-rw-rw-r-- 1 hadoop     hadoop  6 Jul  6 12:54 hadoop-hadoop-namenode.pid
-rw-rw-r-- 1 hadoop     hadoop  6 Jul  6 12:54 hadoop-hadoop-secondarynamenode.pid
[hadoop@hadoop001 hadoop]$ sbin/stop-dfs.sh
19/07/06 14:01:53 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Stopping namenodes on [hadoop001]
hadoop001: stopping namenode
hadoop001: no datanode to stop
Stopping secondary namenodes [hadoop001]
hadoop001: stopping secondarynamenode
19/07/06 14:02:06 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[hadoop@hadoop001 hadoop]$ jps
24906 Jps
17391 DataNode
复制代码

看来情况就是无法停止DataNode,这个进程依旧存在,原因就是hdfs停止脚本找不到DataNode的pid。那么,为什么路径/tmp下就没有了pid呢?

Linux自动删除文件

上网搜索Linux的tmp路径相关资料,发现Linux系统有个自动清理tmp目录的机制,默认每30天删除一次。相关详细资料请点击这里,关于Linux系统清理/tmp/文件夹的原理。

解决方案

# 先停hdfs,再修改文件,重启
[hadoop@hadoop001 hadoop]$ vim hadoop-env.sh
# The directory where pid files are stored. /tmp by default.
# NOTE: this should be set to a directory that can only be written to by
#       the user that will run the hadoop daemons.  Otherwise there is the
#       potential for a symlink attack.
# export HADOOP_PID_DIR=${HADOOP_PID_DIR}
export HADOOP_PID_DIR=/home/hadoop/data/tmp   <---改成你想要存储pid文件的目录
export HADOOP_SECURE_DN_PID_DIR=${HADOOP_PID_DIR}[hadoop@hadoop001 ~]$ ll data/tmp/
total 12
-rw-rw-r-- 1 hadoop hadoop 6 Jul  6 14:32 hadoop-hadoop-datanode.pid
-rw-rw-r-- 1 hadoop hadoop 6 Jul  6 14:32 hadoop-hadoop-namenode.pid
-rw-rw-r-- 1 hadoop hadoop 6 Jul  6 14:32 hadoop-hadoop-secondarynamenode.pid
复制代码

转载于:https://juejin.im/post/5d2062d8e51d4555fd20a3b5

hdfs居然无法正常停止相关推荐

  1. shell 进入hadoop_Hadoop关于HDFS的基本操作(Shell命令)

    在这里我给大家继续分享一些关于hdfs分布式文件的经验哈,其中包括一些hdfs的基本的shell命令的操作,再加上hdfs java程序设计.在前面我已经写了关于如何去搭建hadoop这样一个大数据平 ...

  2. 【甘道夫】Hadoop2.4.1尝鲜部署+完整版配置文件

    引言 转眼间,Hadoop的stable版本已经升级到2.4.1了,社区的力量真是强大!3.0啥时候release呢? 今天做了个调研,尝鲜了一下2.4.1版本的分布式部署,包括NN HA(目前已经部 ...

  3. hadoop的datanode多磁盘空间处理

    link:http://hi.baidu.com/wisejenny/item/c199beb87219c0f462388e96 hadoop-0.20.2 测试修改hdfs-site.xml:添加 ...

  4. Hadoop 2.7集群环境搭建

    系统拓扑 角色 ip地址 hdfs yarn Master 10.0.0.201 NameNode ResourceManager slave 10.0.0.202 DataNode NodeMana ...

  5. Hadoop集群(四) Hadoop升级

    Hadoop前面安装的集群是2.6版本,现在升级到2.7版本. 注意,这个集群上有运行Hbase,所以,升级前后,需要启停Hbase. 更多安装步骤,请参考: Hadoop集群(一) Zookeepe ...

  6. Linux 下配置 Hadoop2.x 高可用 zookeeper Yarn,详细步骤。

    此系列文章是探索大数据道路的记录,有些记录是为了备忘,有些记录是为了学习心得内容,有些是为了给大家提供一个好的学习资料.持续更新中-大家也可以到我的私人blog查看该系列文章.blog.cutexim ...

  7. hadoop启动后,9000端口无法连接,netstat -tpnl中找不到该端口

    已解决: 需要重新格式化hdfs. 1.停止hdfs: 2.删除hdfs的相关文件目录(hdfs-site.xml中配置的存放文件的目录). 3.启动journalnode:sbin/hadoop-d ...

  8. hdp对应hadoop的版本_好程序员大数据学习路线分享hadoop的知识总结

    大数据学习路线分享hadoop的知识总结,Hadoop的背景:原生公司是apache, cdh的cloudar公司,hortworks公司提供hdp. 其中apache的发行版本大致有1.x ,2.x ...

  9. Apache Hadoop大数据集群及相关生态组件安装

    大数据集群安装 写在前头 集群安装部署 Hadoop HA与ZOOKEEPER HBASE HIVE FLUME KAFKA SPARK Kylin Kafka-eagel 问题排查 写在前头 本文就 ...

最新文章

  1. scala可变长度参数函数
  2. [系统开发] Postfix 邮件管理系统
  3. centos的ssh配置
  4. Rose VS PowerDesigner
  5. eclipse基本断点调试
  6. 如何基于多线程队列简单实现mq
  7. auto-sklearn详解
  8. IOS 中runtime 不可变数组__NSArray0 和__NSArrayI
  9. 稍微成型点的用WEBSOCKET实现的实时日志LOG输出
  10. 什么样的运营才是好运营?
  11. DbEntry 开发实践:Wiki 系统(四)
  12. 狗屎一样的React(前言)
  13. Android Retrofit2.0 上传单张图片和多张图片
  14. grpc生成pb.go文件报错github.com/gogo/protobuf/gogoproto/gogo.proto: File not found.
  15. 深度学习模型知识产权保护怎么做?看看IJCAI 2021这场Workshop说了什么
  16. Struts 官方下载地址
  17. 办公小技巧,批量修改文件名,手把手教你
  18. 高速公路上遇事故报警,微信扫这个二维码一键报警定位
  19. [视觉概述] 机器视觉应用方向、项目流程及学习思路总结
  20. android x86 最新手机,Android-x86手机PC版的引导方法

热门文章

  1. NYOJ242 - 计算球体积
  2. mysql日志监控 zabbix_zabbix监控mysql+报警
  3. socketmq 设置队列大小_TCP 半连接队列和全连接队列满了会发生什么?又该如何应对?...
  4. rope 实用把一段区间的数字整体搬到序列中的一段的时候用
  5. OpenGL基础13:第一个正方体
  6. “玲珑杯”郑州轻工业学院第八届ACM程序设计大赛Problem G: 蛤玮点菜
  7. python机器学习库教程——结巴中文分词
  8. codeblocks修改MINGW位置使它能编译Build
  9. 8086的总线操作顺序
  10. luogu P3810 【模板】三维偏序(陌上花开)