我已经编写了以下代码,用于通过php创建/写入文件到hdfs。使用以下API作为参考https://github.com/Yujiro3/WebHDFS
但代码会出现以下错误,无法在所需目录中上传文件:
{"RemoteException":{"exception":"IOException","javaClassName":"java.io.IOException","message":"Failed to find datanode, suggest to check cluster health."}
HTTP/1.1 403 Forbidden
Cache-Control: no-cache
Expires: Mon, 07 Mar 2016 21:28:39 GMT
Date: Mon, 07 Mar 2016 21:28:39 GMT
Pragma: no-cache
Expires: Mon, 07 Mar 2016 21:28:39 GMT
Date: Mon, 07 Mar 2016 21:28:39 GMT
Pragma: no-cache
Content-Type: application/json
Transfer-Encoding: chunked
Server: Jetty(6.1.26)
这是我的代码:
<?php
require 'WebHDFS.php';
$hdfs = new WebHDFS ();
$hdfs -> put('/user/webuser/sample.txt', "sample \ n test \ n");
?>
我应该做出哪些更正?
答案 0 :(得分:0)
您的hdfs datanode似乎无法访问,与您的php无关。
从您的控制台尝试创建没有PHP的文件夹,如下所示:
hdfs dfs -mkdir hdfs:///demofolder
我猜这会因为数据节点关闭而失败。
检查hdfs-site.xml文件以查看dfs.datanode.data.dir指向的位置并确保该位置存在。然后在同一个文件中查找dfs.datanode.address。我是0.0.0.0:50010
尝试telnet到该ip端口:
telnet 0.0.0.0 50010
你应该可以连接。如果不能,则需要启动数据节点。我能够通过运行:
来做到这一点/usr/hdp/2.1.2/hadoop-hdfs/bin/hdfs datanode
“hdfs”的位置可能与我的不同。 假设您已经开始尝试再次创建文件夹。如果有效,那么再试一次你的PHP。
我注意到的最后一件事是在WebHDFS.php中它有hdfs的主机和端口的默认值。
public function __construct($host='localhost', $port='50070') {
$this->_host = $host;
$this->_port = $port;
}
确保您的配置与默认设置对齐,除非您要覆盖它们。 祝你好运。