在 webhdfs rest api 的帮助下, apache hadoop 公开用于访问和操作 hdfs 内容的服务。要查看此正式文档, 请点击此处。
可提供的服务
以下是可用的服务集:
1) 文件和目录操作
1.1 创建和写入文件: 创建 (http put)
1.2 追加到文件: 追加 (http 开机自检)
1.3 打开和读取文件: 打开 (http 获取)
1.4 制作目录: mkdirs (http put)
1.5 重命名文件目录: rename (http put)
1.6 删除文件目录: 删除 (http 删除)
1.7 file/目录的状态: getfilestatus (http get)
1.8 列出目录: 状态 (http get)
2) 其他文件系统操作
2.1 获取目录的内容摘要: 获取时间摘要 (http 获取)
2.2 获取文件校验和: getfilechecksum (http 获取)
2.3 获取主目录: gotomirecor度 (http get)
2.4 设置权限: setpersion (http put)
2.5 设置所有者: setowner (http put)
2.6 集复制因子: 分离 (http put)
2.7 设置访问或修改时间: 时间 (http put)
启用网络 hdfs api
确保在 hdfs-site. xml 文件中将配置参数 dfs.webhdfs.enabled设置为true (在文件中可以找到此配置文件 {your_hadoop_home_dir}/etc/hadoop
。
<configuration>
<property>
.....
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
从 node. js 连接到 webhdfs
我希望你熟悉 node. js 和软件包安装。如果你不是, 请仔细看这件事。有一个 npm 模块, “节点 web dfs”, 带有一个包装器, 允许您访问 hadoop webhdfs api。您可以使用 npm 安装节点 web hdfs 包:
npm install webhdfs
完成上述步骤后, 您可以编写 node. js 程序来访问此 api。下面是帮助你的几个步骤。
导入相关模块
以下是要导入的外部模块:
const WebHDFS = require("webhdfs");
var request = require("request");
准备连接 url
让我们准备连接 url:
let url = "http://<<your hdfs host name here>>";
let port = 50070; //change here if you are using different port
let dir_path = "<<path to hdfs folder>>";
let path = "/webhdfs/v1/" + dir_path + "?op=LISTSTATUS&user.name=hdfs";
let full_url = url+':'+port+path;
列出一个目录
获取 api 并获得结果:
request(full_url, function(error, response, body) {
if (!error && response.statusCode == 200) {
console.log(".. response body..", body);
let jsonStr = JSON.parse(body);
let myObj = jsonStr
文件状态;
让 objlength = 对象. 条目 (myobj). 长度;
控制台. 日志 (“.。文件夹中的文件数: “, objlength);
} 否则 {控制台. log (“.。发生错误!.. “);}
以下是 api 的请求和响应 LISTSTATUS
示例:
https://hadoop.apache.org/docs/r1.0.4/webhdfs.html#LISTSTATUS
获取和显示hdfs文件的内容
为 hdfs 文件名分配路径:
let hdfs_file_name = '<<HDFS file path>>' ;
下面的代码将使用客户端连接到 hdfs WebHDFS
, 而不是我们在上述部分中使用的请求模块:
let hdfs = WebHDFS.createClient({
user: "<<user> >",
host: "<<host/IP >>",
port: 50070, //change here if you are using different port
path: "webhdfs/v1/"
});
下面的代码将读取和显示 hdfs 文件的内容,
let remoteFileStream = hdfs.createReadStream( hdfs_file_name );
remoteFileStream.on("error", function onError(err) { //handles error while read
// Do something with the error
console.log("...error: ", err);
});
let dataStream = [];
remoteFileStream.on("data", function onChunk(chunk) { //on read success
// Do something with the data chunk
dataStream.push(chunk);
console.log('..chunk..',chunk);
});
remoteFileStream.on("finish", function onFinish() { //on read finish
console.log('..on finish..');
console.log('..file data..',dataStream);
});
下面是 open api 的请求和响应示例:
https://hadoop.apache.org/docs/r1.0.4/webhdfs.html#OPEN
如何读取目录中的所有文件
这不是一件简单的事情, 因为我们没有直接的方法, 但我们可以通过结合上述两个操作来实现它-读取目录, 然后逐一读取该目录中的文件。
结论
我希望您对连接到 hdfs 和使用 node 和 webhdfs 模块执行基本操作有一些想法。一切都好!