您的位置:首页 > 大数据 > Hadoop

使用Node.js和WebHDFS REST API访问Hadoop HDFS数据

2019-01-31 16:37 357 查看

可用服务

以下是可用的服务集:

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 >
    < property >
        < name > dfs.webhdfs.enabled </ name >
        < value > true </ value >
    </ property >
</ 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!..”);
    }
}

以下是

LISTSTATUS
API 的示例请求和响应  :

 

https://hadoop.apache.org/docs/r1.0.4/webhdfs.html#LISTSTATUS
 

获取并显示 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的示例请求和响应:

https://hadoop.apache.org/docs/r1.0.4/webhdfs.html#OPEN
 

如何读取目录中的所有文件

这不是直截了当的,因为我们没有直接的方法,但我们可以通过组合上述两个操作来实现它 - 读取目录然后逐个读取该目录中的文件。

结论

我希望您对通过使用Node和WebHDFS模块连接到HDFS并进行基本操作有所了解。祝一切顺利!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  大数据 数据