JavaClient With HDFS

序言

在使用Java创建连接HDFS的客户端时,可以设置很多参数,具体有哪些参数呢,只要是在部署HDFS服务中可以设置的参数,都是可以在连接的时候设置.即在Configuration中设置属性,来设置备份数,每个Block到小的设置[email protected]

依据 

创建HDFS的构造函数如下所示:

 网上比较常用的是get() 方式.,  同时还提供了3种,无论哪种 Configuration都是必须要填写的,

根据它们的实现其实只传递一个Configuration就可以了,像HDFS的路径URI 和操作用户的Name 都可以放置在Configuration中

首先要知道

在搭建HDFS服务中使用dfs.replication来配置 每个block的备份数量.

这里主要是想说的是想上传文件的备份数量其实也是可以设置放进Configuration中的[email protected]. 我们打个断点查看创建后的Configuration中的参数就可以明白.

首先我们看updatingResource是我们在初始化Configuration中会初始化的Map.里面记录了HDFS的配置信息默认从哪里去取 如果我们没有设置的话.

 但是当我们使用configuration.set(key,value) 修改过后,则不会显示源文件的名称,而是显示programatically 表示连接程序做了修改,以连接程序的设置为主,不再从服务器上的文件中读取[email protected]

比如我们修改了fs.defaultFS的值,则变为如下所示:

 原来是

那当我们如果设置了fs.defaultFS则会在如下属性中体现.

如上的定义如下所示

private Properties properties;


/**
 * Stores the mapping of key to the resource which modifies or loads 
 * the key most recently
 */
private Map<String, String[]> updatingResource;

Kerberos

Kerberos是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。这个词又指麻省理工学院为这个协议开发的一套计算机软件。

Kerberos 是一种网络认证协议,其设计目标是通过密钥系统客户机 / 服务器应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。

  1. 假设你要在一台电脑上访问另一个服务器(你可以发送telnet或类似的登录请求)。你知道服务器要接受你的请求必须要有一张Kerberos的“入场券”。

  2. 要得到这张入场券,你首先要向验证服务器(AS)请求验证。验证服务器会创建基于你的密码(从你的用户名而来)的一个“会话密钥”(就是一个加密密钥),并产生一个代表请求的服务的随机值。这个会话密钥就是“允许入场的入场券”。

  3. 然后,你把这张允许入场的入场券发到授权服务器(TGS)。TGS物理上可以和验证服务器是同一个服务器,只不过它现在执行的是另一个服务。TGS返回一张可以发送给请求服务的服务器的票据。

  4. 服务器或者拒绝这张票据,或者接受这张票据并执行服务。

  5. 因为你从TGS收到的这张票据是打上时间戳的,所以它允许你在某个特定时期内(一般是八小时)不用再验证就可以使用同一张票来发出附加的请求。使这张票拥有一个有限的有效期使其以后不太可能被其他人使用。

UserGroupInformation

只有用户登录的设置有点区别,但是不耽误我们使用,具体实现可以了解如下的源码.

如下HDFS的客户端可以使用UserGroupInformation来设置Kerberos的安全登录验证,这里的关键点就是我们要提前获取Kerberos的票据和用户名.因为Kerberos都是根据用户名来创建票据的[email protected]

  /**
   * Get a filesystem instance based on the uri, the passed
   * configuration and the user
   * @param uri of the filesystem
   * @param conf the configuration to use
   * @param user to perform the get as
   * @return the filesystem instance
   * @throws IOException
   * @throws InterruptedException
   */
  public static FileSystem get(final URI uri, final Configuration conf,
        final String user) throws IOException, InterruptedException {
    String ticketCachePath =
      conf.get(CommonConfigurationKeys.KERBEROS_TICKET_CACHE_PATH);
    UserGroupInformation ugi =
        UserGroupInformation.getBestUGI(ticketCachePath, user);
    return ugi.doAs(new PrivilegedExceptionAction<FileSystem>() {
      @Override
      public FileSystem run() throws IOException {
        return get(uri, conf);
      }
    });
  }

UserGroupInformation官网的API地址:https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/security/UserGroupInformation.html

猜你喜欢

转载自blog.csdn.net/cuiyaonan2000/article/details/130198061