Hadoop系列——Google Option练手day3-2
Google Option
Google-option是Bazel Project中的命令行参数解析器。option程序包已拆分为一个单独的jar ,可用于通用程序。
我们可以去github进行下载
https://github.com/pcj/google-options
或我们也可以直接导入依赖
<dependency>
<groupId>com.github.pcj</groupId>
<artifactId>google-options</artifactId>
<version>1.0.0</version>
</dependency>
@Option注解参数说明
- name:选项名称
- defaultValue:默认值
- abbrev:选项的单字符缩写
- help:使用信息的帮助字符串
- category:描述此选项所属的类别
- allowMultiple:—个标志,指示是否应允许选项类型在单个选项列表中多次出现。
QuickStart
创建参数实体类
public class ServerOption extends OptionsBase {
@Option(
name = "help",
abbrev = 'h',
help = "Prints usage info",
defaultValue = "true"
)
public boolean help;
@Option(
name = "host",
abbrev = 'o',
help = "The server host",
category = "startup",
defaultValue = ""
)
public String host;
@Option(
name = "port",
abbrev = 'p',
help = "The server port",
category = "startup",
defaultValue = "8080"
)
public int port;
@Option(
name = "dir",
abbrev = 'd',
help = "Name if directory to serve static files",
category = "startup",
allowMultiple = true,
defaultValue = ""
)
public List<String> dirs;
}
参数解析使用类
public class Server {
public static void main(String[] args) {
//创建一个参数Parser解析对象,解析规则为传入的类中定义的参数
final OptionsParser optionsParser = OptionsParser.newOptionsParser(ServerOption.class);
//解析输入参数数组args
optionsParser.parseAndExitUponError(args);
//获得Option
final ServerOption options = optionsParser.getOptions(ServerOption.class);
//若输入参数host为空或port<0或dirs目录为空
if (options.host.isEmpty()||options.port<0||options.dirs.isEmpty()){
//输出usage的使用方法
printUsage(optionsParser);
return;
}
//输出运行的host和port
System.out.println("Starting server at "+ options.host +":"+options.port);
//输出每个dir的名字
for (String dir : options.dirs) {
System.out.println(dir);
}
}
private static void printUsage(OptionsParser optionsParser) {
System.out.println("Usage : java -jar server.jar OPTIONS");
System.out.println(optionsParser.describeOptions(Collections.emptyMap(),OptionsParser.HelpVerbosity.LONG));
}
}
LibHDFS介绍
Libhdfs是用于Hadoop的分布式文件系统(HDFS)的基于.JNI的C API。
它为HDFS API的一个子集提供了C API,以操作HDFS文件和文件系统。
Libhdfs是Hladoop发行版的一部分,并在$Hadoop_HDFS_HOME/lib/本地/libhdfs.so
Libhdfs与Windows兼容,可以通过运行MVN编译在Hadoop-HDFS-project/Hadoop-HDFS源树的目录。
基于Restful的HDFS API
WebHDFS
WebHDFS提供了访问HDFS的RESTful接口,内置组件,默认开启。
WebHDFS使得集群外的客户端可以不用安装HADO0P和JAVA环境就可以对HDFS进行访问,且客户端不受语言限制。
WebHDFS是HortonWorks开发的,后捐给了Apache。
当客户端请求某文件时,WebHDFS会将其重定向到该资源所在的datanode。
FileSystem URIs vs HTTP URLs
WebHDFS的文件系统schema为webhdfs:/l。URL格式为:webhdfs: / /<HOST> :<HTTP_PORT>/<PATH>
效果相当于hdfs://<HOST>:<RPC_PORT>/<PATH>
在RESTful风格的API中,相应的HTTP URL格式︰http://<HOST>:<HTTP_PORT>/webhdfs/v1/<PATH>?op=...
以下是官网说明以及op后参数的可选值:
https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/WebHDFS.html
所有参数如下:
HTTP GET
OPEN (see FileSystem.open)
GETFILESTATUS (see FileSystem.getFileStatus)
LISTSTATUS (see FileSystem.listStatus)
LISTSTATUS_BATCH (see FileSystem.listStatusIterator)
GETCONTENTSUMMARY (see FileSystem.getContentSummary)
GETQUOTAUSAGE (see FileSystem.getQuotaUsage)
GETFILECHECKSUM (see FileSystem.getFileChecksum)
GETHOMEDIRECTORY (see FileSystem.getHomeDirectory)
GETDELEGATIONTOKEN (see FileSystem.getDelegationToken)
GETTRASHROOT (see FileSystem.getTrashRoot)
GETXATTRS (see FileSystem.getXAttr)
GETXATTRS (see FileSystem.getXAttrs)
GETXATTRS (see FileSystem.getXAttrs)
LISTXATTRS (see FileSystem.listXAttrs)
CHECKACCESS (see FileSystem.access)
GETALLSTORAGEPOLICY (see FileSystem.getAllStoragePolicies)
GETSTORAGEPOLICY (see FileSystem.getStoragePolicy)
GETSNAPSHOTDIFF
GETSNAPSHOTTABLEDIRECTORYLIST
GETFILEBLOCKLOCATIONS (see FileSystem.getFileBlockLocations)
GETECPOLICY (see HDFSErasureCoding.getErasureCodingPolicy)
HTTP PUT
CREATE (see FileSystem.create)
MKDIRS (see FileSystem.mkdirs)
CREATESYMLINK (see FileContext.createSymlink)
RENAME (see FileSystem.rename)
SETREPLICATION (see FileSystem.setReplication)
SETOWNER (see FileSystem.setOwner)
SETPERMISSION (see FileSystem.setPermission)
SETTIMES (see FileSystem.setTimes)
RENEWDELEGATIONTOKEN (see DelegationTokenAuthenticator.renewDelegationToken)
CANCELDELEGATIONTOKEN (see DelegationTokenAuthenticator.cancelDelegationToken)
ALLOWSNAPSHOT
DISALLOWSNAPSHOT
CREATESNAPSHOT (see FileSystem.createSnapshot)
RENAMESNAPSHOT (see FileSystem.renameSnapshot)
SETXATTR (see FileSystem.setXAttr)
REMOVEXATTR (see FileSystem.removeXAttr)
SETSTORAGEPOLICY (see FileSystem.setStoragePolicy)
SATISFYSTORAGEPOLICY (see ArchivalStorage.satisfyStoragePolicy)
ENABLEECPOLICY (see HDFSErasureCoding.enablePolicy)
DISABLEECPOLICY (see HDFSErasureCoding.disablePolicy)
SETECPOLICY (see HDFSErasureCoding.setErasureCodingPolicy)
HTTP POST
APPEND (see FileSystem.append)
CONCAT (see FileSystem.concat)
TRUNCATE (see FileSystem.truncate)
UNSETSTORAGEPOLICY (see FileSystem.unsetStoragePolicy)
UNSETECPOLICY (see HDFSErasureCoding.unsetErasureCodingPolicy)
HTTP DELETE
DELETE (see FileSystem.delete)
DELETESNAPSHOT (see FileSystem.deleteSnapshot)
HTTPFS
HttpFS是一个提供RESTful 接口的网关的服务器,该网关支持所有HDFS文件系统操作
对于文件CURD的操作全部提交给HttpFS服务进行中转,然后由HttpFS去跟HDFS集群交互
需要我们手动安装并开启
原理
- HttpFS本身是Java Web应用程序。使用内置的Jetty服务器对外提供服务。
- HttpFS是一个独立于HDFS的服务。本质上是一个代理服务。
- HttpFS API的底层通过是映射到HDFS的HTTP RESTful API调用实现的。
- HttpFS默认端口号为14000。
HttpFS的配置
配置通过代理访问的主机节点,用户所属组
首先我们要知道这个配置文件就是core-site.xml
我们需要在这个文件中添加以下配置
其中:
root用户可以在任意host主机节点上代表任意group组的用户(*通配符表示所有)
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
在我们修改配置之后我们需要重启机器!
这里别忘了,你有几台机器就要修改几次
开启服务
完成重启后,我们就可以开启这个服务了
hdfs -daemon start httpfs
开启服务之后,我们就可以去访问对应的页面了,例如:node1:14000/static/index.html
这个页面就是入口页面
页面显示如下:
使用
在使用方面和前面的WebHDFS是一样的,他们都基于网络的访问方式,因此我们在访问的时候一定要带上我们的身份信息
如:http://node1:14000/webhdfs/v1?user.name=root&op=操作
这里我们以root身份发起请求这也是因为我们之前的配置!
WebHDFS vs HttpFS
- WebHDFS属于内置服务,而HttpFS不是,需要我们手动配置并开启
- WebHDFS是由客户端直接对节点进行连接,而HttpFS则是作为一种代理,对外提供API,底层通过WebHDFS进行业务操作
- 数据先传输到该httpfs server ,再由其传输到client