每天进步一点点——/srv/node不存在导致object-updater和container-updater崩溃(Swift Bug)

本文解析了一个在Swift集群中出现的合理Bug,详细介绍了当一台没有配置存储设备的服务器尝试运行object-updater和container-updater服务时所遇到的问题,并讨论了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


   最近在开发过程中遇到了swift中合理的bug,为什么说合理呢?且看bug的场景描述。
    现在有两台服务器A和B用于配制swift集群,由于某种原因A上的磁盘都没有被加入到ring文件中,只有B中的磁盘被加入了进来,但是A和B的/etc/swift/目录中所有ring文件都是对应相同的,如果当前A上的/srv/node目录不存在,此时分别去开启两太机器所有的swift服务,那么B将没有任何错误而A机器上将会报如下错误:
Apr 15 02:35:23 localhost object-updater UNCAUGHT EXCEPTION#012Traceback (most recent call last):#012 File "/usr/bin/swift-object-updater", line 23, in <module>#012 run_daemon(ObjectUpdater, conf_file, **options)#012 File "/usr/lib/python2.6/site-packages/swift/common/daemon.py", line 110, in run_daemon#012 klass(conf).run(once=once, **kwargs)#012 File "/usr/lib/python2.6/site-packages/swift/common/daemon.py", line 57, in run#012 self.run_forever(**kwargs)#012 File "/usr/lib/python2.6/site-packages/swift/obj/updater.py", line 73, in run_forever#012 for device in os.listdir(self.devices):#012OSError: [Errno 2] No such file or directory: '/srv/node'

Apr 15 02:33:10 localhost container-updater UNCAUGHT EXCEPTION#012Traceback (most recent call last):#012 File "/usr/bin/swift-container-updater", line 23, in <module>#012 run_daemon(ContainerUpdater, conf_file, **options)#012 File "/usr/lib/python2.6/site-packages/swift/common/daemon.py", line 110, in run_daemon#012 klass(conf).run(once=once, **kwargs)#012 File "/usr/lib/python2.6/site-packages/swift/common/daemon.py", line 57, in run#012 self.run_forever(**kwargs)#012 File "/usr/lib/python2.6/site-packages/swift/container/updater.py", line 123, in run_forever#012    for path in self.get_paths():#012 File "/usr/lib/python2.6/site-packages/swift/container/updater.py", line 80, in get_paths#012 for device in os.listdir(self.devices):#012OSError: [Errno 2] No such file or directory: '/srv/node'
通过上面的日志我们可以知道object-updater和container-updater两个进程都发生未知异常,从而奔溃了。

    从上面的描述可以解释为什么该问题是合理的了,因为A服务器上没有任何存储设备,因此,所有数据都不会被写到该节点上,该节点只相当于一个proxy部署节点,除了proxy服务外其他所有服务都可以关闭,所以object-updater和container-updater停止了,将是对系统资源的释放。


<think>我们正在处理一个Hadoop权限错误:访问路径`/srv/Bigdata/hadoop/data1/nm/localdir`时出现`Permission denied`。 根据错误信息,这通常是由于运行YARN任务的用户(例如xwq)对NodeManager的本地目录没有足够的权限。 解决方案的核心是确保YARN本地目录(此处为`/srv/Bigdata/hadoop/data1/nm/localdir`)的权限设置正确,允许YARN用户(如xwq)写入。 步骤: 1. 确认目录权限:检查目录的所有者权限,确保YARN用户(或用户组)有读写权限。 2. 修改目录权限:如果权限正确,使用chownchmod修改。 3. 验证:重新运行作业,确认问题已解决。 详细步骤: 1. 检查目录权限: 在NodeManager节点上(通常每个DataNode节点也是NodeManager)执行: ```bash ls -ld /srv/Bigdata/hadoop/data1/nm/localdir ``` 期望输出:目录的所有者应为yarn(或hadoop,取决于集群配置),或者至少目录的组为hadoop,且组有写权限。 2. 修改权限(如果需要): ```bash # 将目录的所有者改为yarn(如果Hadoop以yarn用户运行)并设置组为hadoop sudo chown -R yarn:hadoop /srv/Bigdata/hadoop/data1/nm/localdir # 设置权限为770(所有者yarn组hadoop有读写执行权限) sudo chmod -R 770 /srv/Bigdata/hadoop/data1/nm/localdir ``` 3. 如果问题仍然存在,考虑以下情况: - 确认所有NodeManager节点上的目录权限都已修改(因为作业可能被分配到任意节点)。 - 如果集群启用了SELinux,可能需要调整SELinux策略: ```bash sudo setenforce 0 # 临时关闭SELinux(重启后失效) ``` 或者永久关闭:编辑`/etc/selinux/config`,设置`SELINUX=permissive`。 4. 验证: 重新提交作业,观察是否还有权限错误。 注意:如果目录是挂载点(如NFS),请确保挂载选项允许yarn用户写入。 引用说明: [^1]: 修改目录权限是解决本地文件系统权限问题的标准方法,确保运行YARN任务的用户(或组)有访问权限。 相关问题: 1. 如何配置YARN的本地目录? 2. Hadoop中如何管理多用户环境下的本地目录权限? 3. SELinux如何影响Hadoop服务? 4. 如何调试Hadoop中的文件权限问题?</think>### 解决Hadoop路径权限问题:`/srv/Bigdata/hadoop/data1/nm/localdir Permission denied` #### 问题分析 该错误表示YARN的NodeManager服务在访问本地目录`/srv/Bigdata/hadoop/data1/nm/localdir`时缺乏足够权限。这通常由以下原因导致: 1. **目录所有权错误**:目录属于YARN运行用户(通常是`yarn`用户) 2. **权限设置足**:缺少`rwx`权限(至少需要`770`权限) 3. **SELinux限制**:SELinux安全策略阻止访问 4. **路径配置错误**:`yarn-site.xml`中的本地目录配置与实际路径符[^1] --- #### 完整解决方案(需在**所有NodeManager节点**执行) ##### 1. 验证目录所有权权限 ```bash # 查看目录权限 ls -ld /srv/Bigdata/hadoop/data1/nm/localdir ``` 期望输出: ```bash drwxrwx--- 2 yarn hadoop 4096 Jun 10 10:00 /srv/Bigdata/hadoop/data1/nm/localdir ``` ##### 2. 修正目录权限(关键步骤) ```bash # 修改目录所有者 sudo chown -R yarn:hadoop /srv/Bigdata/hadoop/data1/nm/ # 设置权限(所有者:rwx,组:rwx,其他:无) sudo chmod -R 770 /srv/Bigdata/hadoop/data1/nm/localdir # 验证结果 ls -ld /srv/Bigdata/hadoop/data1/nm/localdir ``` ##### 3. 检查SELinux状态(若启用) ```bash # 查看SELinux状态 sestatus # 临时禁用(测试用) sudo setenforce 0 # 永久禁用(需谨慎) sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config ``` ##### 4. 验证YARN配置 检查`yarn-site.xml`确保路径一致: ```xml <property> <name>yarn.nodemanager.local-dirs</name> <value>/srv/Bigdata/hadoop/data1/nm/localdir</value> </property> ``` ##### 5. 重启服务 ```bash # 重启NodeManager yarn-daemon.sh stop nodemanager yarn-daemon.sh start nodemanager # 检查日志 tail -f /var/log/hadoop-yarn/yarn-yarn-nodemanager-*.log ``` --- #### 关键注意事项 1. **集群范围执行**:必须在所有NodeManager节点执行相同操作 2. **权限递归**:使用`-R`参数确保子目录权限同步修改 3. **用户组一致性**:确保`yarn`用户属于`hadoop`组(`id yarn`验证) 4. **磁盘空间**:检查目录所在分区的可用空间(`df -h`) 5. **路径存在性**:确认目录真实存在(特别是挂载点) --- #### 验证方法 提交测试作业检查权限: ```bash yarn jar /path/to/hadoop-mapreduce-examples.jar \ wordcount /input /output ``` 观察NodeManager日志中是否仍有权限错误。 [^1]: 目录权限所有权设置是解决本地存储访问问题的核心步骤,需确保与YARN服务用户匹配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值