【排错】Failed to replace a bad datanode on the existing pipeline due to no more good ...

本文探讨了在Hadoop文件系统中遇到的写入错误,即无法替换现有管道中的坏数据节点的问题。通过分析错误日志,我们了解到在写操作时,系统无法找到可用的备用数据节点进行复制,导致写入失败。解决办法包括修改配置文件以更改数据节点替换策略,以避免此类问题。

错误:java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try.: ?: a/ d  V& o" Q  K
2014-05-07 12:21:41,820 WARN [Thread-115] org.apache.hadoop.mapreduce.v2.app.MRAppMaster: Graceful stop failed
7 V& J7 P7 t) y% Yorg.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try. (Nodes: current=[192.168.1.191:50010, 192.168.1.192:50010], original=[192.168.1.191:50010, 192.168.1.192:50010]). The current failed datanode replacement policy is DEFAULT, and a client may configure this via 'dfs.client.block.write.replace-datanode-on-failure.policy' in its configuration.
0 l: u) j: u, }# D; r        at org.apache.hadoop.mapreduce.jobhistory.JobHistoryEventHandler.handleEvent(JobHistoryEventHandler.java:514)
        at org.apache.hadoop.mapreduce.jobhistory.JobHistoryEventHandler.serviceStop(JobHistoryEventHandler.java:332)
        at org.apache.hadoop.service.AbstractService.stop(AbstractService.java:221)
6 t/ B7 R6 a8 I$ \1 Y        at org.apache.hadoop.service.ServiceOperations.stop(ServiceOperations.java:52)
  I6 f) _- g$ y0 \: G) z        at org.apache.hadoop.service.ServiceOperations.stopQuietly(ServiceOperations.java:80)
        at org.apache.hadoop.service.CompositeService.stop(CompositeService.java:159): \! V  U! K6 M4 S3 ~) 
        at org.apache.hadoop.service.CompositeService.serviceStop(CompositeService.java:132)
% O. c$ ?/ x/ B4 V" y" L        at org.apache.hadoop.service.AbstractService.stop(AbstractService.java:221)
4 |$ `( S3 s3 y        at org.apache.hadoop.mapreduce.v2.app.MRAppMaster.shutDownJob(MRAppMaster.java:548)
        at org.apache.hadoop.mapreduce.v2.app.MRAppMaster$JobFinishEventHandler$1.run(MRAppMaster.java:599)
Caused by: java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try. (Nodes: current=[192.168.1.191:50010, 192.168.1.192:50010], original=[192.168.1.191:50010, 192.168.1.192:50010]). The current failed datanode replacement policy is DEFAULT, and a client may configure this via 'dfs.client.block.write.replace-datanode-on-failure.policy' in its configuration.
5 x2 U! w+ R0 m        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.findNewDatanode(DFSOutputStream.java:860)
& T7 m$ }/ C; x* k        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.addDatanode2ExistingPipeline(DFSOutputStream.java:925)
: a/ I# ?* Y' F7 M; j8 k6 T        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.setupPipelineForAppendOrRecovery(DFSOutputStream.java:1031)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.processDatanodeError(DFSOutputStream.java:823)
        at org.apache.hadoop.hdfs.DFSOutputStream$DataStreamer.run(DFSOutputStream.java:475)
9 a1 G7 [4 i+ i3 s
4 L" D( R5 Q; i0 V' @5 Y原因:无法写入;我的环境中有3个datanode,备份数量设置的是3。在写操作时,它会在pipeline中写3个机器。默认replace-datanode-on-failure.policy是DEFAULT,如果系统中的datanode大于等于3,它会找另外一个datanode来拷贝。目前机器只有3台,因此只要一台datanode出问题,就一直无法写入成功
解决办法:修改hdfs-site.xml文件,添加或者修改如下两项:

<property>

 <name>dfs.client.block.write.replace-datanode-on-failure.enable</name>
; t+ J, w) V) j1 ?0 W  <value>true</value>
</property>
<property>
4 ~. B1 C* T9 j) J. {$ h; n  <name>dfs.client.block.write.replace-datanode-on-failure.policy</name>
% M7 D. y5 K4 n) H$ g  <value>NEVER</value>
</property>
对于dfs.client.block.write.replace-datanode-on-failure.enable,客户端在写失败的时候,是否使用更换策略,默认是true没有问题。
4 ^% Y3 d5 F+ Q- z) [  x对于,dfs.client.block.write.replace-datanode-on-failure.policy,default在3个或以上备份的时候,是会尝试更换结点尝试写入datanode。而在两个备份的时候,不更换datanode,直接开始写。对于3个datanode的集群,只要一个节点没响应写入就会出问题,所以可以关掉。
$ [4 F- x) S6 n& I. o  ?" R

<think>首先,用户的问题是关于解决 'smb.service' 启动失败且提示 'Unit smb.service not found' 的错误。具体错误是:"Failed to start smb.service: Unit smb.service not found"。用户参考了一个站内引用,但那个引用是关于Samba排错的,提到了不同的错误信息。用户说那个引用仅供参考,不是真正的需求,所以我要基于用户当前的问题来回答。 用户上一次的问题和我的回答:在对话历史中,用户提到了引用[1],是关于Samba的排错,涉及另一个错误。但现在用户的问题是关于 "smb.service not found",所以我需要专注于这个新问题。 关键错误:"Unit smb.service not found"。这表明系统找不到指定的服务单元文件。在Linux系统中,服务通常由systemd管理,单元文件存储在/etc/systemd/system/或/usr/lib/systemd/system/目录下。 可能的原因: 1. Samba服务未安装:如果Samba没有安装,就不会有对应的服务文件。 2. 服务名称错误:用户可能使用了错误的服务名称。标准的Samba服务通常是 "smbd.service" 而不是 "smb.service"。用户输入的是 "smb.service",但标准名称可能是 "smb.service" 或 "smbd.service",我需要检查。 3. 单元文件缺失或损坏:即使安装了Samba,单元文件可能丢失或损坏。 4. Systemd配置问题:可能需要重新加载systemd单元。 解决步骤: - 首先,检查Samba是否安装。 - 然后,检查服务的正确名称。 - 如果安装正确,尝试重新加载systemd。 - 最后,启动服务。 用户引用中提到 "smbd",这是Samba的守护进程,所以服务名称可能应该是 "smbd.service"。 在Linux中,Samba的服务通常是: - smbd.service:Samba SMB守护进程。 - nmbd.service:NetBIOS名称服务。 用户错误是 "Unit smb.service not found",但标准名称是 "smbd.service",所以可能是用户拼写错误。 解决步骤: 1. 确认Samba安装:运行 `sudo apt-get install samba` 或 `sudo yum install samba` ,取决于发行版。 2. 检查服务名称:运行 `systemctl list-unit-files | grep samba` 或 `systemctl list-unit-files | grep smb` 来查找正确的服务名称。 3. 如果找不到,可能需要安装Samba。 4. 如果已安装但单元文件缺失,尝试重新安装Samba。 5. 重新加载systemd:`sudo systemctl daemon-reload`。 6. 然后尝试启动正确的服务,如 `sudo systemctl start smbd.service`。 用户的问题中显示的错误是 "Failed to start smb.service: Unit smb.service not found",所以我要建议用户确认服务名称。 为了回答结构清晰,我需要: - 使用中文回答。 - 行内数学表达式用$...$,如果涉及数学(但这里是系统管理问题,可能不涉及数学)。 - 独立公式用$$...$$(不太可能用到)。 - 生成相关问题。 - 在引用的段落末尾添加引用标识(虽然用户提供了引用[^1],但它不是直接相关,所以我可能不需要引用它,除非我引用外部资料)。 用户指令说:"回答中引用的段落末尾自然地添加引用标识",但在这个上下文中,我没有引用外部来源。用户提供的引用[1]是关于另一个错误的,我可以忽略它或不提及。 回答结构: 1. 理解问题:简述错误。 2. 解释原因:Unit not found 通常表示服务未安装或名称错误。 3. 提供解决步骤:逐步指导。 4. 生成相关问题。 确保回答真实可靠:基于Linux系统管理知识。 最终回答: - 首先,确认错误:"Failed to start smb.service: Unit smb.service not found" 表示systemd找不到名为 'smb.service' 的服务单元。 - 常见原因:服务未安装或服务名称错误。 - 步骤: 步骤1:检查Samba是否安装。 步骤2:确认正确的服务名称(如smbd.service)。 步骤3:如果未安装,安装Samba。 步骤4:重新加载systemd守护进程。 步骤5:启动服务。 - 生成相关问题。 相关问题: 1. 如何安装Samba在特定Linux发行版上? 2. 什么是systemd服务单元文件? 3. 如何查看服务状态和日志以诊断问题? 这应该涵盖用户的疑问。 </think>### 解决 'Failed to start smb.service: Unit smb.service not found' 错误的方法 您的错误信息 `Failed to start smb.service: Unit smb.service not found` 表示系统找不到名为 `smb.service` 的服务单元文件。这通常发生在尝试启动Samba服务时,原因可能是服务未安装、服务名称错误或systemd配置问题。以下我将逐步解释原因并提供详细解决方法。步骤基于Linux系统管理知识(适用于多数发行版,如Ubuntu、CentOS)。 #### 错误原因分析 - **主要原因**: - **服务未安装**: Samba软件包未正确安装,导致systemd无法识别相关服务。 - **服务名称错误**: 标准的Samba服务名称通常是 `smbd.service`(针对Samba SMB守护进程),而不是 `smb.service`。您的命令可能使用了不正确的名称。 - **单元文件缺失或损坏**: 即使Samba已安装,单元文件(如 `smbd.service`)可能丢失或损坏。 - **Systemd未更新**: 新安装的服务需要重新加载systemd配置才能识别。 - **引用信息无关性**: 您提供的引用[^1]涉及Samba日志错误(如 `symbol krb5_get_init_creds_opt_set_pac_request`),这与“Unit not found”错误不同,因此无需参考它来解决当前问题。 #### 解决步骤(按顺序操作) 以下步骤在终端中执行(需要sudo权限): 1. **检查Samba是否安装**: - 运行命令确认Samba软件包状态: ```bash # 对于Debian/Ubuntu系统 dpkg -l | grep samba # 对于CentOS/RHEL系统 rpm -qa | grep samba ``` - 如果输出为空,表示Samba未安装。跳过此步直接安装。如果已安装,检查版本以确保兼容性。 2. **安装或重新安装Samba**(如果未安装或安装不完整): - 使用包管理器安装Samba: ```bash # Debian/Ubuntu sudo apt-get update sudo apt-get install samba -y # -y 选项自动确认安装 # CentOS/RHEL sudo yum install samba -y ``` - 安装后,会自动生成正确的服务单元文件(如 `smbd.service`)。 3. **确认正确的服务名称**: - 查找所有相关服务单元文件: ```bash systemctl list-unit-files | grep -i "samba\|smb" ``` - 典型输出应包含 `smbd.service` 或 `nmbd.service`(例如在Ubuntu中为 `smbd.service`)。您的错误中 `smb.service` 可能拼写错误,标准名称应为 `smbd.service`。 4. **重新加载systemd配置**: - 安装或更新服务后,必须重新加载systemd以识别新单元文件: ```bash sudo systemctl daemon-reload ``` 5. **启动正确的Samba服务**: - 使用标准服务名称启动: ```bash sudo systemctl start smbd.service # 使用 smbd.service 而非 smb.service ``` - 检查服务状态: ```bash sudo systemctl status smbd.service ``` - 如果输出显示 `active (running)`,表示启动成功。 - 如果失败,查看日志细节:`journalctl -u smbd.service -xe`。 6. **设置开机自启**(可选): - 确保服务在系统启动时自动运行: ```bash sudo systemctl enable smbd.service ``` #### 常见问题排查 - **如果步骤5仍失败**: - 检查单元文件路径:运行 `ls /usr/lib/systemd/system/smbd.service` 或 `/etc/systemd/system/` 确认文件存在。 - 如果文件缺失,重新安装Samba:`sudo apt-get --reinstall install samba`(或等效命令)。 - **权限问题**: 确保使用 `sudo` 执行所有管理命令。 - **发行版差异**: - Ubuntu通常使用 `smbd.service`。 - CentOS 8+ 可能整合为 `smb.service`(但检查步骤3优先)。 按照以上步骤,多数情况下错误会解决。如果问题持续,提供 `sudo systemctl status smbd.service` 的输出以进一步诊断。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值