Most of the disks failed. 1/1 local-dirs have errors: [ /opt/ha/hadoop/data/nm-local-dir : Cannot

在配置Hadoop的Kerberos时遇到错误,具体是YARN的nodemanager无法创建/local-dir。已尝试手动创建并赋予正确权限,但问题依旧。日志显示目录创建失败,后通过重新创建并设置/opt/ha/hadoop/nm-local-dir目录及权限,修改yarn-site.xml配置并重启YARN集群,成功解决此问题。

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

项目场景:

ERROR org.apache.hadoop.yarn.server.nodemanager.LocalDirsHandlerService: Most of the disks failed. 1/1 local-dirs have errors: [ /opt/ha/hadoop/data/nm-local-dir : Cannot create directory : /opt/ha/hadoop/data/nm-local-dir, error mkdir of /opt/ha/hadoop/data/nm-local-dir failed ]

问题描述

在配置hadoop的kerberos時,發現出現了如下的bug,一直都無法解決

2023-06-20 16:00:01,301 INFO org.apache.hadoop.metrics2.impl.MetricsConfig: loaded properties from hadoop-metrics2.properties
2023-06-20 16:00:01,350 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Scheduled Metric snapshot period at 10 second(s).
2023-06-20 16:00:01,350 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: NodeManager metrics system started
2023-06-20 16:00:01,385 INFO org.apache.hadoop.security.UserGroupInformation: Login successful for user nm/hadoop103@EXAMPLE.COM using keytab file /etc/security/keytab/nm.service.keytab
2023-06-20 16:00:01,402 INFO org.apache.hadoop.yarn.server.nodemanager.DirectoryCollection: Disk Validator: yarn.nodemanager.disk-validator is loaded.
2023-06-20 16:00:01,412 INFO org.apache.hadoop.yarn.server.nodemanager.DirectoryCollection: Disk Validator: yarn.nodemanager.disk-validator is loaded.
2023-06-20 16:00:01,462 WARN org.apache.hadoop.yarn.server.nodemanager.DirectoryCollection: Unable to create directory /opt/ha/hadoop/data/nm-local-dir error mkdir of /opt/ha/hadoop/data/nm-local-dir failed, removing from the list of valid directories.
2023-06-20 16:00:01,464 ERROR org.apache.hadoop.yarn.server.nodemanager.LocalDirsHandlerService: Most of the disks failed. 1/1 local-dirs have errors:  [ /opt/ha/hadoop/data/nm-local-dir : Cannot create directory : /opt/ha/hadoop/data/nm-local-dir, error mkdir of /opt/ha/hadoop/data/nm-local-dir failed ] 
2023-06-20 16:00:01,485 INFO org.apache.hadoop.yarn.server.nodemanager.NodeResourceMonitorImpl:  Using ResourceCalculatorPlugin : org.apache.hadoop.yarn.util.ResourceCalculatorPlugin@62656be4
2023-06-20 16:00:01,487 INFO org.apache.hadoop.yarn.event.AsyncDispatcher: Registering class org.apache.hadoop.yarn.server.nodemanager.containermanager.loghandler.event.LogHandlerEventType for class org.apache.hadoop.yarn.server.nodemanager.containermanager.logaggregation.LogAggregationService
2023-06-20 16:00:01,488 INFO org.apache.hadoop.yarn.event.AsyncDispatcher: Registering class org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.sharedcache.SharedCacheUploadEventType for class org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.sharedcache.SharedCacheUploadService
2023-06-20 16:00:01,489 INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.ContainerManagerImpl: AMRMProxyService is disabled
2023-06-20 16:00:01,489 INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.ResourceLocalizationService: per directory file limit = 8192
2023-06-20 16:00:01,492 INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.ResourceLocalizationService: Disk Validator: yarn.nodemanager.disk-validator is loaded.
2023-06-20 16:00:01,497 INFO org.apache.hadoop.yarn.event.AsyncDispatcher: Registering class org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.event.LocalizerEventType for class org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer.ResourceLocalizationService$LocalizerTracker
2023-06-20 16:00:01,530 INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.AuxServices: Adding auxiliary service mapreduce_shuffle, "mapreduce_shuffle"
2023-06-20 16:00:01,571 INFO org.apache.hadoop.yarn.server.nodemanager.containermanager.monitor.ContainersMonitorImpl:  Using ResourceCalculatorPlugin : org.apache.hadoop.yarn.util.ResourceCalculatorPlugin@68f1b

原因分析:

一直報錯無法創建這個目錄,但是這個目錄,我已經創建出來了,而且也賦予了權限,但是依舊報錯,目前也不知道是什麼原因,可能是由於其父目錄的權限是hfds:

例如:Handler 发送消息有两种方式,分别是 Handler.obtainMessage()Handler.sendMessage(),其中 obtainMessage 方式当数据量过大时,由于 MessageQuene 大小也有限,所以当 message 处理不及时时,会造成先传的数据被覆盖,进而导致数据丢失。
在这里插入图片描述

在这里插入图片描述

解决方案:

在hadoop所有節點中,重新心創建了nm-local-dir目錄,並賦予權限

[root@hadoop104 logs]# mkdir /opt/ha/hadoop/nm-local-dir/
[root@hadoop104 logs]# chown -R yarn:hadoop /opt/ha/hadoop/nm-local-dir/
[root@hadoop104 logs]# chmod -R 775 /opt/ha/hadoop/nm-local-dir/
[root@hadoop104 logs]# cd ..
[root@hadoop104 hadoop]# ll
total 212
drwxr-xr-x 2 sarah sarah    4096 Sep 12  2019 bin
drwx------ 6 hdfs  hadoop   4096 Jun 20 14:51 data
drwxr-xr-x 3 root  hadoop   4096 Sep 12  2019 etc
drwxr-xr-x 2 sarah sarah    4096 Sep 12  2019 include
drwxr-xr-x 3 sarah sarah    4096 Sep 12  2019 lib
drwxr-xr-x 4 sarah sarah    4096 Sep 12  2019 libexec
-rw-rw-r-- 1 sarah sarah  147145 Sep  4  2019 LICENSE.txt
drwxrwxr-x 3 hdfs  hadoop   4096 Jun 21 08:20 logs
drwxrwxr-x 2 yarn  hadoop   4096 Jun 21 08:59 nm-local-dir
-rw-rw-r-- 1 sarah sarah   21867 Sep  4  2019 NOTICE.txt
-rw-rw-r-- 1 sarah sarah    1366 Sep  4  2019 README.txt
drwxr-xr-x 3 sarah sarah    4096 Jun 20 16:08 sbin
drwxr-xr-x 4 sarah sarah    4096 Sep 12  2019 share

修改yarn-site文件,將yarn.nodemanager.local-dirs改為/opt/ha/hadoop/nm-local-dir

 ` <property>
        <description>List of directories to store localized files in. An
            application's localized file directory will be found in:
            ${yarn.nodemanager.local-dirs}/usercache/${user}/appcache/application_${appid}.
            Individual containers' work directories, called container_${contid}, will
            be subdirectories of this.
        </description>
        <name>yarn.nodemanager.local-dirs</name>
        <value>/opt/ha/hadoop/nm-local-dir</value>
    </property>`

分發yarn-site文件,重啟yarn集群
在这里插入图片描述
所有節點從unhealthy狀態變為active,done~~~~~~~~

version: '3.8' services: spark-master: image: bitnami/spark:3.4.1 container_name: spark-master hostname: spark-master ports: - 8080:8080 - 7077:7077 environment: - SPARK_MODE=master - SPARK_RPC_AUTHENTICATION_ENABLED=no - SPARK_RPC_ENCRYPTION_ENABLED=no - SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no - SPARK_SSL_ENABLED=no - SPARK_MASTER_PORT=7077 - SPARK_WEBUI_PORT=8080 - SPARK_MASTER_HOST=0.0.0.0 volumes: - ./config/spark:/opt/bitnami/spark/conf - ./app:/app - ./data:/data user: "0" networks: - hadoop spark-worker: image: bitnami/spark:3.4.1 container_name: spark-worker environment: - SPARK_MODE=worker - SPARK_MASTER_URL=spark://spark-master:7077 - SPARK_WORKER_MEMORY=4g - SPARK_WORKER_CORES=2 - SPARK_RPC_AUTHENTICATION_ENABLED=no - SPARK_RPC_ENCRYPTION_ENABLED=no - SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no - SPARK_SSL_ENABLED=no depends_on: - spark-master volumes: - ./config/spark:/opt/bitnami/spark/conf - ./app:/app - ./data:/data - ./storage/clickhouse/data:/var/lib/clickhouse:wr user: "0" networks: - hadoop jupyter: image: jupyter/base-notebook:latest container_name: jupyter hostname: jupyter ports: - 8888:8888 - 4040:4040 volumes: - ./app:/home/jovyan/app - ./config/hadoop:/etc/hadoop environment: - SPARK_MASTER=spark://spark-master:7077 - HADOOP_CONF_DIR=/etc/hadoop - JUPYTER_TOKEN=110124 depends_on: - spark-master user: "0" networks: - hadoop clickhouse-server: image: clickhouse/clickhouse-server:latest container_name: clickhouse-server ports: - "8123:8123" networks: - hadoop environment: - CHOWN_EXTRA=/var/lib/clickhouse - CHOWN_EXTRA_OPTS=-R volumes: - ./storage/clickhouse/conf/config.xml:/etc/clickhouse-server/config.xml - ./storage/clickhouse/conf/users.xml:/etc/clickhouse-server/users.xml - ./storage/clickhouse/data:/var/lib/clickhouse:wr - ./storage/clickhouse/log:/var/log/clickhouse-server:wr user: "0" networks: hadoop: driver: bridge这是我的配置文件,需要修改什么来解决这个问题
最新发布
06-28
<think>我们正在解决在Docker中运行ClickHouse时出现的文件系统权限问题,具体错误是`filesystem error: inrename:Permission denied`。根据引用[1]中的信息,在WindowsDocker中挂载本地目录到ClickHouse容器时,可能会遇到无法写入数据的问题。其中一个解决方案是在docker-compose文件中添加`privileged:true`和`user:root`来提升权限。然而,我们还需要考虑Linux系统下的权限问题,因为错误信息中提到了`/var/lib/clickhouse/store`目录,这通常出现在Linux环境中。错误原因分析:1.挂载目录的权限问题:宿主机上的目录被挂载到容器内,但容器内的ClickHouse服务(默认以`clickhouse`用户运行)没有足够的权限在宿主机目录中进行重命名操作(rename操作需要写和执行权限)。2.容器内用户与宿主机目录的权限不匹配:宿主机目录可能属于某个特定用户(如root),而容器内运行ClickHouse的用户(UID=101)没有该目录的写权限。解决方案:根据引用[1]的提示,我们可以尝试以下步骤:步骤1:在docker-compose文件中使用特权模式并指定root用户(快速验证,但不安全)在docker-compose.yml中为ClickHouse服务添加`privileged: true`和`user: root`,这样容器内将以root用户运行,从而拥有最高权限。但请注意,这仅适用于开发环境,生产环境不推荐。示例docker-compose.yml片段: ```yamlservices:clickhouse:image:clickhouse/clickhouse-server:23container_name: clickhouseprivileged: true#添加特权模式user:root#以root用户运行容器ports:- "8123:8123"-"9000:9000"volumes:-./data:/var/lib/clickhouse:rw```步骤2:调整宿主机目录的权限(推荐)如果不想使用root用户(出于安全考虑),我们可以将宿主机上挂载的目录权限设置为允许容器内的clickhouse用户(UID=101)访问。在宿主机上执行:```bash#假设当前目录下有一个data目录,用于挂载到容器的/var/lib/clickhousemkdir -p ./data#将目录的所有权改为UID=101(即容器内的clickhouse用户)sudochown-R101:101./data#或者,如果当前用户有权限,也可以直接设置权限为777(开发环境临时使用)sudo chmod -R777 ./data#不推荐,仅临时测试```步骤3:使用命名卷(Docker管理权限)如果问题仍然存在,可以考虑使用Docker的命名卷来管理数据,这样Docker会自动处理权限问题。修改docker-compose.yml: ```yamlvolumes:clickhouse-data:driver: localservices:clickhouse:volumes:-clickhouse-data:/var/lib/clickhouse```步骤4:检查SELinux(如果宿主机是Linux且启用了SELinux)如果宿主机启用了SELinux,可能需要调整安全上下文或临时禁用SELinux。临时禁用SELinux(重启后失效):```bashsudosetenforce0```或者为挂载目录添加SELinux策略:```bashchcon -Rt svirt_sandbox_file_t./data```步骤5:尝试使用特定版本的ClickHouse镜像引用[2]中提到,回退到版本21.3.20.1可以解决另一个问题(UnexpectedPacketFromServerError),但我们的问题可能是权限问题。如果以上步骤不能解决,可以尝试更换镜像版本(如引用[2]中的版本)来排除版本特定问题。步骤6:检查ClickHouse配置确保ClickHouse配置文件中没有限制写入权限。主要检查`config.xml`或`users.xml`中的相关设置,但通常默认配置是允许写入的。验证:在调整权限后,重新启动ClickHouse容器,尝试写入数据,看是否还会出现权限错误。注意:在Windows上使用Docker时,挂载的目录可能涉及到Windows文件系统和Linux容器的权限映射问题。Docker Desktop在Windows上通过虚拟机运行Linux容器,因此需要确保挂载的目录在虚拟机内具有适当权限。在Windows上,可以尝试将项目目录添加到DockerDesktop的“File sharing”设置中(Docker Desktop设置 ->Resources ->File Sharing)。总结:1.使用特权模式和root用户(开发环境快速解决)。2.调整宿主机目录的权限,使其对容器内用户(UID=101)可写。3.使用Docker卷来避免权限问题。4.检查SELinux设置(Linux宿主机)。5.尝试更换ClickHouse镜像版本。请根据实际情况选择一种或多种方法组合尝试。相关问题:1.如何查看Docker容器内用户的UID?2.在Linux宿主机上如何永久修改目录的权限和所有权?3.Docker卷与宿主机目录挂载有何区别?4.如何配置SELinux以允许容器访问宿主机目录?5.ClickHouse不同版本之间在文件操作上有哪些差异?</think>### 解决 Docker 中 ClickHouse 的 `Permission denied` 错误 根据错误信息 `filesystem error: in rename: Permission denied` 和引用[1]的解决方案,以下是完整的解决步骤: #### 根本原因分析 1. **权限不匹配** Docker 容器内 ClickHouse 默认以 `clickhouse` 用户(UID=101)运行,而挂载的宿主机目录(如 `./data`)所有者通常是当前用户(UID=1000),导致容器内用户无权重命名文件。 2. **Windows Docker 特殊限制** Windows 的 Docker Desktop 使用虚拟机运行 Linux 容器,挂载的本地目录需通过 SMB 协议映射,权限控制更严格(引用[1])。 3. **临时文件操作机制** ClickHouse 写入数据时会先创建 `tmp_insert_*` 临时文件,验证后重命名为正式文件,重命名操作需要目录的 **写+执行** 权限。 --- #### 解决方案(按推荐顺序) ##### ✅ 方案1:调整宿主机目录权限(最佳实践) ```bash # 创建数据目录(Windows/Linux均适用) mkdir ./data # 修改目录所有者为 ClickHouse 容器用户(UID=101) docker run --rm -v "$(pwd)/data:/target" alpine:latest \ chown -R 101:101 /target ``` 在 `docker-compose.yml` 中正常挂载: ```yaml volumes: - ./data:/var/lib/clickhouse ``` ##### ⚠️ 方案2:容器内使用 root 用户(开发环境临时方案) ```yaml services: clickhouse: image: clickhouse/clickhouse-server:23 user: root # 强制以root运行 privileged: true # 授予特权模式 volumes: - ./data:/var/lib/clickhouse:rw ``` > **注意**:此方案降低安全性,仅建议测试环境使用(引用[1]) ##### 🔧 方案3:修改 ClickHouse 配置 创建自定义配置文件 `./conf/config.d/permissions.xml`: ```xml <!-- 允许低权限用户操作文件 --> <yandex> <storage_configuration> <disks> <default> <skip_access_check>true</skip_access_check> </default> </disks> </storage_configuration> </yandex> ``` 挂载配置目录: ```yaml volumes: - ./conf:/etc/clickhouse-server # 包含自定义配置 - ./data:/var/lib/clickhouse ``` ##### 🌐 方案4:Windows Docker 专用设置 1. 右键 Docker Desktop 图标 → Settings → Resources → File Sharing 2. 添加项目所在盘符(如 `C:\` 或 `D:\`) 3. 在 `docker-compose.yml` 中明确声明读写权限: ```yaml volumes: - ./data:/var/lib/clickhouse:rw # 显式声明读写 ``` --- #### 验证步骤 1. 启动容器后检查目录权限: ```bash docker exec clickhouse ls -ld /var/lib/clickhouse # 应显示 drwxr-xr-x 且所有者是 clickhouse 或 root ``` 2. 模拟写入测试: ```bash docker exec -u 101 clickhouse touch /var/lib/clickhouse/test.txt docker exec -u 101 clickhouse mv /var/lib/clickhouse/test.txt /var/lib/clickhouse/test_final.txt ``` --- #### 版本注意事项 如引用[2]所述,某些版本(如 21.3.20.1)可能行为不同。若上述方案无效,可尝试: ```yaml image: clickhouse/clickhouse-server:21.3.20.1 # 回退到兼容版本 ``` 同时确保配置监听地址: ```xml <!-- ./conf/config.d/listen.xml --> <listen_host>0.0.0.0</listen_host> ``` > **关键点**:权限问题本质是容器内外用户 UID 不匹配。通过预配置目录权限或调整容器用户身份可彻底解决[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ysksolution

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值