【问题标题】:WebHDFS FileNotFoundException rest apiWebHDFS FileNotFoundException rest api
【发布时间】:2020-07-17 23:19:50
【问题描述】:

我将这个问题作为webhdfs rest api throwing file not found exception 帖子的延续发布

我有一个图像文件想通过 WebHDFS rest api 打开。

  1. 该文件存在于 hdfs 中并具有相应的权限
  2. 我可以 LISTSTATUS该文件并获得答案:

curl -i "http://namenode:50070/webhdfs/v1/tmp/file.png?op=LISTSTATUS"

HTTP/1.1 200 OK
Date: Fri, 17 Jul 2020 22:47:29 GMT
Cache-Control: no-cache
Expires: Fri, 17 Jul 2020 22:47:29 GMT
Date: Fri, 17 Jul 2020 22:47:29 GMT
Pragma: no-cache
X-FRAME-OPTIONS: SAMEORIGIN
Content-Type: application/json
Transfer-Encoding: chunked

{"FileStatuses":{"FileStatus":[
{"accessTime":1594828591740,"blockSize":134217728,"childrenNum":0,"fileId":11393739,"group":"hdfs","length":104811,"modificationTime":1594828592000,"owner":"XXXX","pathSuffix":"XXXX","permission":"644","replication":3,"storagePolicy":0,"type":"FILE"}
]}}

Content-Type: application/octet-stream
Content-Length: 0
  1. 所以 api 可以正确读取元数据,但我无法打开该文件:

curl -i "http://namenode:50070/webhdfs/v1/tmp/file.png?op=OPEN"

HTTP/1.1 307 Temporary Redirect
Date: Fri, 17 Jul 2020 22:23:17 GMT
Cache-Control: no-cache
Expires: Fri, 17 Jul 2020 22:23:17 GMT
Date: Fri, 17 Jul 2020 22:23:17 GMT
Pragma: no-cache
X-FRAME-OPTIONS: SAMEORIGIN
Location: http://datanode1:50075/webhdfs/v1/tmp/file.png?op=OPEN&namenoderpcaddress=namenode:8020&offset=0
Content-Type: application/octet-stream
Content-Length: 0

{"RemoteException":{"exception":"FileNotFoundException","javaClassName":"java.io.FileNotFoundException","message":"Path is not a file: /tmp/file.png......
  1. 所以,根据webhdfs rest api throwing file not found exception,我可以看到请求是从namenode传递到datanode1的。 Datanode1 在我的 hosts 文件中,我可以连接到它并从那里检查 webhdfs 的状态:
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
<final>true</final>
</property>

允许,在namenode上也一样。

  1. 我还查看了/var/log/hadoop/hdfs/*.{log,out} 上的 hdfs 日志,看看我是否可以找到 curl 时触发的错误,但似乎什么也没发生。我没有看到与我的文件或 webhdfs 查询相关的条目。我在namenode和datanode1上试过了。

  2. 作为最后的努力,我尝试将权限(不理想)从 644(见第 2 点)增加到 666

hdfs dfs -chmod 666 /tmp/file.png

curl -i "http://namenode:50070/webhdfs/v1/tmp/file.png?op=LISTSTATUS"

HTTP/1.1 403 Forbidden
Date: Fri, 17 Jul 2020 23:06:18 GMT
Cache-Control: no-cache
Expires: Fri, 17 Jul 2020 23:06:18 GMT
Date: Fri, 17 Jul 2020 23:06:18 GMT
Pragma: no-cache
X-FRAME-OPTIONS: SAMEORIGIN
Content-Type: application/json
Transfer-Encoding: chunked

{"RemoteException":{"exception":"AccessControlException","javaClassName":"org.apache.hadoop.security.AccessControlException","message":"Permission denied: user=XXXX, access=READ_EXECUTE, inode=\"/tmp/file.png\":XXXX:hdfs:drw-rw-rw-"}}

所以它似乎进行了切换,但是在放宽我以前没有获得的当前权限时不知何故我遇到了权限问题?这不像我删除了 X 标志,它一开始就不存在。 access=READ_EXECUTE 是否需要 R 和 X?

现在我不知道为什么我可以看到但不能用 HDFS 读取这个文件。有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: hadoop filenotfoundexception webhdfs httpfs


    【解决方案1】:

    仔细查看您的最后一个错误, ... inode=\"/tmp/file.png\":XXXX:hdfs:drw-rw-rw-"} ,似乎表明file.png 实际上是一个目录(前导d 符号)而不是文件。这与您在第 3 步中遇到的错误一致 *..."message":"Path is not a file: /tmp/file.png....

    您可以通过 $ hdfs dfs -ls /tmp/file.png/ 进行仔细检查。

    回到您的访问错误,您确实需要“执行”(x) 权限才能列出目录中的文件。

    【讨论】:

    • 确实,我错过了。谢谢你的外部观点。它发生在我 hdfs dfs -将我的图像从本地到 hdfs 时,实际路径是 hdfs dfs -ls /tmp/file.png/file.png。我正在通过 ssh 进行隧道传输并且没有着色。那会有所帮助。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2016-09-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多