可用服务
以下是可用的服务集:1)文件和目录操作
1.1创建和写入文件:CREATE(HTTP PUT)1.2附加到文件:APPEND(HTTP POST)1.3打开并读取文件:OPEN(HTTP GET)1.4创建目录:MKDIRS(HTTP PUT)1.5重命名文件/目录:RENAME(HTTP PUT)1.6删除文件/目录:DELETE(HTTP DELETE)1.7文件/目录的状态:GETFILESTATUS(HTTP GET)1.8列出目录:LISTSTATUS(HTTP GET)
2)其他文件系统操作
2.1获取目录的内容摘要:GETCONTENTSUMMARY(HTTP GET)2.2获取文件校验和:GETFILECHECKSUM(HTTP GET)2.3获取主目录:GETHOMEDIRECTORY(HTTP GET)2.4设置权限:SETPERMISSION(HTTP PUT)2.5设置所有者:SETOWNER(HTTP PUT) )2.6设置复制因子:SETREPLICATION(HTTP PUT)2.7设置访问或修改时间:SETTIMES(HTTP PUT)
启用WebHDFS API
确保在hdfs-site.xml文件中将config参数dfs.webhdfs.enabled设置为 true(此配置文件可以在里面找到 {your_hadoop_home_dir}/etc/hadoop。< 配置>
< property > ..... < property > < name > dfs.webhdfs.enabled < value > true
</ configuration >
从Node.js连接到WebHDFS我希望您熟悉Node.js和软件包安装。如果你不是,请详细说明。有一个npm模块,“node-webhdfs”,带有一个包装器,允许您访问Hadoop WebHDFS API。您可以使用npm安装node-webhdfs包:npm install webhdfs
完成上述步骤后,您可以编写Node.js程序来访问此API。以下是帮助您解决的几个步骤。
导入依赖模块
以下是要导入的外部模块:const WebHDFS = require(“webhdfs”);
var request = require(“request”);准备连接URL让我们准备连接URL:让 url = “http:// <<你的hdfs主机名在这里>>” ;
let port = 50070 ; //如果你使用不同的端口,请在这里更改让 dir_path = “<< hdfs文件夹的路径>>” ; 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){
如果(!错误 && 响应。的StatusCode == 200){ 控制台。log(“.. response body ..”,body); 让 jsonStr = JSON。解析(身体); 让 myObj = jsonStr。FileStatuses。FileStatus ; 让 objLength = 对象。条目(myObj)。长度 ; 控制台。log(“..文件夹中的文件数:”,objLength);} else { 控制台。log(“.. errorrorured!..”);}
}
以下是LISTSTATUSAPI 的示例请求和响应 :
获取并显示 HDFS 文件的内容
使用路径分配HDFS文件名:let hdfs_file_name = '<<HDFS file path>>' ;
以下代码将使用WebHDFS 客户端而不是我们在上一节中使用的请求模块连接到HDFS :
让 hdfs = WebHDFS。createClient({
user:“<< user >>”,主持人:“<< host / IP >>”,端口:50070,//如果您使用不同的端口,请在此处更改路径:“webhdfs / v1 /”
});
以下代码将读取并显示HDFS文件的内容,让 remoteFileStream = hdfs。createReadStream(hdfs_file_name);
remoteFileStream。on(“error”,函数 onError(err){ //在读取时处理错误//对错误做点什么控制台。log(“... error:”,err);
});
let dataStream = [];remoteFileStream。on(“data”,函数 onChunk(chunk){ //读取成功//对数据块执行某些操作 dataStream。推(块);控制台。log('.. chunk ..',chunk);
});
remoteFileStream。on(“完成”,函数 onFinish(){ //读取完成控制台。log('..完成..');控制台。log('.. file data ..',dataStream);
});
以下是OPEN API的示例请求和响应:
如何读取目录中的所有文件
这不是直截了当的,因为我们没有直接的方法,但我们可以通过组合上述两个操作来实现它 - 读取目录然后逐个读取该目录中的文件。结论
我希望您对通过使用Node和WebHDFS模块连接到HDFS并进行基本操作有所了解。祝一切顺利!