hadoop

套件版本在安全访问层面上开发了Tbds认证,相对于社区版本提供的Simple认证和Kerberos认证,TBDS认证在保证安全的基础下,使用上更加灵活简洁。TBDS认证访问hadoop只需要提供用户认证信息:认证ID,用户名,认证密钥。

    hadoop_security_authentication_tbds_secureid
    hadoop_security_authentication_tbds_username
    hadoop_security_authentication_tbds_securekey

获取认证信息

admin用户可以在portal创建所有用户的securekey密钥。普通用户需要securekey密钥则向管理员申请。

客户端访问Hadoop

客户端访问Hadoop只需要两步:

jar包替换

将客户端相关hadoop jar包替换成套件hadoop ja包,目前是2.7.2-TBDS-4.0.3.1版本。

设置环境环境变量

设置环境变量三种方式 Shell访问 环境变量,给客户端程序加3个环境变量,如:

  export hadoop_security_authentication_tbds_secureid=F3QdVfxbQkNHVkn1OzLA3yK3In0bL6HgX
  export hadoop_security_authentication_tbds_username=hdfs
  export hadoop_security_authentication_tbds_securekey=o8AnGFYQ2lIB0AJ78TIeoJ0Uu1nkph12

配置文件

配置文件,放到客户端程序的hadoop配置文件中,如classpath下的core-site.xml或hdfs-site.xml:

  <property>
    <name>hadoop_security_authentication_tbds_secureid</name>
    <value>F3QdVfxbQkNHVkn1OzLA3yK3In0bL6HgXPmK</value>
  </property>
  <property>
    <name>hadoop_security_authentication_tbds_username</name>
    <value>hdfs</value>
  </property>
  <property>
    <name>hadoop_security_authentication_tbds_securekey</name>
    <value>o8AnGFYQ2lIB0AJ78TIeoJ0Uu1nkph12</value>
  </property>

代码设置

代码设置,在hadoop client代码里加入代码片段

conf.set("hadoop_security_authentication_tbds_secureid","F3QdVfxbQkNHVkn1OzLA3yK3In0bL6Hg");
  conf.set("hadoop_security_authentication_tbds_username","hdfs");
  conf.set("hadoop_security_authentication_tbds_securekey","o8AnGFYQ2lIB0AJ78TIeoJ0Uu1nkph12");

1.3 Webhdfs或HttpFs访问

同客户端访问hadoop原理一样,同样需要导入一些认证信息,但有web访问需要做额外的处理,我们需要手动的生成签名,客户端访问不用只是我们已经在代码里面做好这份工作。

1.3.1 生成签名

生成签名,通过(secureId,currentTimeStamp,randomInt,secureKey)--->signature。其中currentTimeStamp是当前时间戳,randomInt是一个随机数,Signature是我们要的输出

java示例:

private String generateSignature(String secureId, long timestamp, int randomValue, String secureKey){
  Base64 base64 = new Base64();
  byte[] baseStr = base64.encode(HmacUtils.hmacSha1(secureKey, secureId + timestamp + randomValue));
  
  String result = "";
  try {
    result = URLEncoder.encode(new String(baseStr), "UTF-8");
  } catch (UnsupportedEncodingException e) {
    LOG.error("Failed to encode.", e);
  }
  
  return result;
}

Python示例:

  def generateSignature(secureid,securekey):
  from hashlib import sha1
  import hmac
  import base64
  import urllib, urllib2
  import time
  import random
  timestamp=str(long(time.time()*1000))
  nonce=random.randint(0,2147483647)
  seed="{0}{1}{2}".format(secureid,timestamp,nonce)
  my_sign = hmac.new(securekey, seed, sha1).digest()
  my_sign = base64.b64encode(my_sign)
  signature = urllib.quote_plus(str(my_sign))
  return "{0} {1} {2} {3}".format(secureid,timestamp,nonce,signature)

1.3.2 web访问

header名称:tbds-auth header取值:secureId+" " + curTime + " " + random + " " + signature 例子:

curl -i --header "tbds-auth:PxKf1JVUDHzP0ItYSzeMIaq6HSy7STURQbPO 1506411029889 639 xfVforphUwk6MRlGN7gvPmMSRME%3D"
-X GET http://tbds-10-254-100-139:14000/webhdfs/v1/user/abc?op=LISTSTATUS&user.name=httpfs

二.权限控制

三.集群外客户端部署

3.1 客户端安装

(1)在任一安装hadoop客户端的集群内节点,打包hadoop的安装路径:/usr/hdp/2.2.0.0-2041/hadoop /,并拷贝到集群外目标客户端安装节点

(2)如果有套件的yum源,在集群外目标安装节点使用yum install安装

(3)如果有hadoop安装包,在集群外目标安装节点使用rpm -ivh安装

3.2 配置文件

在任一安装hadoop客户端的集群内节点,打包hadoop的配置路径: /etc/hadoop/conf,并拷贝到集群外目标客户端安装节点对应路径。

3.3 编译打包

套件的hadoop是基于社区二次开发,命名规则采用"社区版本号-TBDS-套件版本号"的方式命名.例:我们现在基于社区1.2.1版本的hbase进行开发,套件版本是4.0.3.3,则我们打出的hbase jar版本为1.2.1-TBDS-4.0.3.3,完整的yarn client maven jar文件名为:hadoop-yarn-client-1.2.1-TBDS-4.0.3.3.jar

3.3.1基于套件提供的maven库开发

(1)拷贝或部署套件提供的maven库到开发者可访问的本地仓库或远程仓库 (2)在客户端maven工程pom引入对应的套件版hadoop依赖,以套件4.0.3.3版本为例,需要在pom中加入的依赖片段(其他版本依次类推):

   <dependency>
       <groupId>org.apache.hbase</groupId>
       <artifactId> hadoop-yarn-client</artifactId>
       <version>1.2.1-TBDS-4.0.3.3</version>
   </dependency>

3.4 运行

运行客户端代码与社区方式无区别

Last updated