su: cannot set user id: Resource temporarily unavailable

在Hadoop集群中使用start-balancer.sh进行资源平衡时遇到的问题及解决方法,包括进程占用大量资源的分析与优化建议。强调避免所有节点运行该进程,仅在namenode节点执行。

昨天晚上在namenode节点上执行start-balancer.sh,今天早上su - hadoop用户报这样的问题!!!

jps -l 看到start-balancer.sh仍然在执行,直接杀掉该进程即可或是stop-balancer.sh。

这个进程怎么占用这么多资源,没有想到!

同时注意一点就是:不要所有的节点都运行该进程。只要namenode节点运行该进程即可!!!

你看到的错误信息: ``` recv failed: Resource temporarily unavailable errno: 11, Resource temporarily unavailable ``` 这表示你在调用 `recv()` 时返回了 `-1`,并且 `errno == EAGAIN` 或 `errno == EWOULDBLOCK`(值为 `11`)。 --- ## 🧠 这个错误意味着什么? > **这不是一个真正的“错误”**,而是 **非阻塞套接字(non-blocking socket)** 下的一种正常行为。 ### ✅ 具体含义: - 套接字被设置为 **非阻塞模式**; - 当前 **没有数据可读**; - `recv()` 不会阻塞等待数据,而是立即返回 `-1`,并设置 `errno = EAGAIN` 或 `EWOULDBLOCK`。 --- ## 📌 示例代码场景 ```c int flags = fcntl(client_fd, F_GETFL, 0); fcntl(client_fd, F_SETFL, flags | O_NONBLOCK); // 设置为非阻塞 int bytes_read = recv(client_fd, buffer, sizeof(buffer), 0); if (bytes_read == -1) { if (errno == EAGAIN || errno == EWOULDBLOCK) { // 没有数据可读,非阻塞正常现象 printf("No data available yet.\n"); } else { // 真正的错误 perror("recv error"); } } ``` --- ## ✅ 如何处理这个错误? ### 方法一:使用 `select` / `poll` / `epoll` 等待数据到来 在读取前检查套接字是否可读,避免无意义的 `recv()` 调用。 #### 示例(使用 `select`): ```c fd_set read_fds; FD_ZERO(&read_fds); FD_SET(client_fd, &read_fds); struct timeval timeout = {0, 100000}; // 100ms int activity = select(client_fd + 1, &read_fds, NULL, NULL, &timeout); if (activity > 0 && FD_ISSET(client_fd, &read_fds)) { int bytes_read = recv(client_fd, buffer, sizeof(buffer), 0); if (bytes_read > 0) { // 成功读取数据 } } ``` --- ## ✅ 一句话总结: > `recv()` 返回 `-1` 且 `errno == 11 (Resource temporarily unavailable)` 表示当前没有数据可读,**是正常行为**,通常出现在非阻塞套接字中,应结合 `select`、`poll` 或 `epoll` 使用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值