9.8.2 WebHDFS命令
上一小节讲了如何配置WebHDFS,这一小节我们将详细介绍WebHDFS命令的组织方式和具体的命令。
1.WebHDFS命令一般形式
在这一部分的开始就讲了WebHDFS实际上是用curl命令来发送管理的命令,所以WebHDFS的命令组织和curl命令组织类似。一般为下面的格式:
curl[-i/-X/-u/-T][PUT]"http://<HOST>:<PORT>/webhdfs/v1/<PATH>?[user.name=<user>&]&op=<operation>&[doas=<user>]……"
在这个命令里面,引号前面的部分是curl自己的参数,需要大家自行了解;后面网页形式的内容代表着操作的指令、参数和路径。其中http://<HOST>:<PORT>。代表需要将命令发送的地址和端口,也就是Hadoop集群服务器的IP地址和HDFS端口(默认是50070)。在这个地址之后的部分/webhdfs/v1/<PATH>代表着需要操作的远程HDFS集群上的路径,比如/webhdfs/v1/user/ubuntu/input,就代表着HDFS上/user/ubuntu/input这个目录。引号中再往后的内容就是操作的指令和参数了,其中最重要的是op参数,代表着具体的操作指令,接下来的内容我们会详细讲解。
2.文件和路径操作
创建文件并写入内容:
c u r l-i-X P U T"h t t p://<H O S T>:<P O R T>/w e b h d f s/v 1/<P A T H>?o p=C R E A T E overwrite=<true|false>][&blocksize=<LONG>][&replication=<SHORT>]
[&permission=<OCTAL>][&buffersize=<INT>]"
使用上述命令之后,会返回一个location,它包括了已创建文件所在的DataNode地址及创建路径。下面就可以将文件内容发送到所显示DataNode对应路径下的文件内,命令如下:
curl-i-X PUT-T<LOCAL_FILE>"http://<DAtANODE>:<PORT>/webhdfs/v1/<PATH>?op=CREATE……"
文件追加内容,首先使用下面的命令获取待追加内容文件所在的地址:
curl-i-X POST"http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=APPEND[&buffersize=<INT>]"
再结合返回内容的location信息,追加内容,命令如下:
curl-i-X POST-T<LOCAL_FILE>"http://<DAtANODE>:<PORT>/webhdfs/v1/<PATH>?op=APPEND……"
打开并读取文件内容,使用下面的命令打开远程HDFS上的文件并读取内容:
curl-i-L"http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=OPEN
[&offset=<LONG>][&length=<LONG>][&buffersize=<INT>]"
需要注意的是,这个命令首先会返回文件所在的location信息,然后打印文件的具体内容。
创建文件夹:
curl-i-X PUT"http://<HOST>:<PORT>/<PATH>?op=MKDIRS[&permission=<OCTAL>]"
重命名文件夹或文件:
curl-i-X PUT"<HOST>:<PORT>/webhdfs/v1/<PATH>?op=RENAME&destination=<PATH>"
删除文件夹或者文件:
curl-i-X DELETE"http://<host>:<port>/webhdfs/v1/<path>?op=DELETE
[&recursive=<true|false>]"
查看文件夹或文件信息:
curl-i"http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=GETFILESTATUS"
列举文件夹内容:
curl-i"http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=LISTSTATUS"
3.其他文件系统操作
获取文件夹统计信息:
curl-i"http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=GETCONTENTSUMMARY"
这个命令主要返回一下文件夹信息:文件夹个数、文件个数、总字长和总大小等。
获取文件校验和:
curl-i"http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=GETFILECHECKSUM"
主要返回校验算法、校验字符串和字符串长度。
获取当前web用户的主目录:
curl-i"http://<HOST>:<PORT>/webhdfs/v1/?op=GETHOMEDIRECTORY"
设置权限:
curl-i-X PUT"http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=SETPERMISSION
[&permission=<OCTAL>]"
设置文件夹或文件属主属性:
curl-i-X PUT"http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=SETOWNER
[&owner=<USER>][&group=<GROUP>]"
设置备份数量:
curl-i-X PUT"http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=SETREPLICATION
[&replication=<SHORT>]"
4.常见错误
在使用WebHDFS时经常会抛出一些异常,但是从异常的信息大体都能分析出问题所在,下面介绍几种常见的异常和分析。
(1)Illegal Argument Exception
这种异常出现的返回信息如下:
HTTP/1.1 400 Bad Request
Content-Type:application/json
Transfer-Encoding:chunked
{
"RemoteException":
{
"exception":"IllegalArgumentException",
"javaClassName":"java.lang.IllegalArgumentException",
"message":"Invalid value for webhdfs parameter\"permission\":……"
}
}
从异常信息可以很明显看出是命令的参数不对,这就需要用户仔细检查自己的参数是否有输入错误或拼写错误。
(2)Security Exception
这种异常出现的返回信息如下:
HTTP/1.1 401 Unauthorized
Content-Type:application/json
Transfer-Encoding:chunked
{
"RemoteException":
{
"exception":"SecurityException",
"javaClassName":"java.lang.SecurityException",
"message":"Failed to obtain user group information:……"
}
}
出现这种异常的原因是提交命令的用户应通过认证,这就需要用户先提交认证信息。
(3)File Not Found Exception
这种异常出现的返回信息如下:
HTTP/1.1 404 Not Found
Content-Type:application/json
Transfer-Encoding:chunked
{
"RemoteException":
{
"exception":"FileNotFoundException",
"javaClassName":"java.io.FileNotFoundException",
"message":"File does not exist:/foo/a.patch"
}
}
出现这种异常的原因是找不到指定的目录或者文件,这需要用户确认自己命令中的路径和文件。