不当心删除了spark的目录,可是hadoop集群是使用 NFS 来同步spark的整个目录。 php
showmount 命令用于查询NFS服务器的相关信息,在全部slave上执行 showmount -e,提示: java
mount clntudp_create: RPC: Program not registered linux
rpc.mountd 命令全名叫 NFS mount daemon,执行后部分机器恢复正常,但仍有部分slave提示: shell
clnt_create: RPC: Port mapper failure - Unable to receive: errno 111 (Connection refused) 服务器
根据以上的错误提示,能够大概知道是RPC的问题。 app
NFS(Network FileSystem)服务启动时会绑定一个随机的端口(至于为什么要绑定随机端口而不是指定固定端口多是为了防止冲突), ssh
并会通知到RPC服务(RPC服务的进程由一个叫rpcbind的程序来完成,它会绑定一个固定的端口如111),NFS借助这个随机端口来实现与客户端的文件传输与状态共享, socket
所以客户端一开始须要向RPC服务端询问NFS具体绑定的端口信息。整个NFS集群包含NFS和RPC两部分,而且NFS的工做依赖于RPC。 oop
以上图片来源于:鸟哥的 Linux 私房菜 -- NFS 伺服器 spa
说完原理,再来解释报错的含义:
先卸载目录挂载:umount /spark,出错:umount.nfs: /spark: device is busy
查找使用该目录的进程:fuser -m -v /spark/,仍旧报错:Cannot stat : Stale file handle
因而强制卸载:umount -l /spark,执行成功可是showmount 继续报错。
因而只好重启NFS了:service rpcbind restart、service nfs restart
这里必须先重启RPC而后再启动NFS,不然会报错:
Starting NFS mountd: [FAILED]
Starting NFS daemon: rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused)
rpc.nfsd: unable to set any sockets for nfsd
缘由前面已经讲过,恢复整个集群的脚本以下:
ssh='ssh -p2222' all_slave={1..10} eval eval \"$ssh slave\"$all_slave\" \'rpc.mountd\'\;\" eval eval \"$ssh slave\"$all_slave\" \'umount -l /spark\'\;\" eval eval \"$ssh slave\"$all_slave\" \'service rpcbind restart \&\& service nfs restart\'\;\" eval eval \"$ssh slave\"$all_slave\" \'mount -t nfs master:/spark/ /spark/\'\;\"
集群已经配置好host和SSH免密登陆,最后执行mount便可查看到已经加载的NFS文件系统:
master:/root/.ssh/ on /root/.ssh type nfs (rw,vers=4,addr=master,clientaddr=slave1) master:/usr/local/java/ on /usr/local/java type nfs (rw,vers=4,addr=master,clientaddr=slave1) master:/tmp/logs/ on /tmp/logs/ type nfs (rw,vers=4,addr=master,clientaddr=slave1) nfsd on /proc/fs/nfsd type nfsd (rw) master:/spark/ on /spark type nfs (rw,vers=4,addr=master,clientaddr=slave1)