Hadoop 은 기본적으로 하나의 계정을 이용해서 작업하는 것이 매우 편한 구조이지만, 저장공간 및 병렬처리 Application을 Platform의 형태로 다양한 사용자에게 서비스를 제공하기 위해서는 반드시 Multi tenant가 지원되어야 하며 이를 위해서 스터디를 진행했던 내용으로 정리합니다.
Hadoop은 별도의 group정보를 가지고 있지 않습니다. 따라서 GroupMapping을 위해서 다음과 같은 방법들이 권장되고 있는데 이 중에서 추천되고 있는 LDAP - SSSD 연계방안을 테스트해보았습니다.
1. OpenLDAP
사용자가 늘어날 때 마다 매번 OS에 사용자를 만드는 작업은 부담이 될 수 있으며 portal, OS, HDFS등 여러 곳에 사용자 정보가 있을경우 관리Point가 늘어나기 때문에 LDAP으로 저장소를 통일합니다.
- 기본환경 설정
yum update;
|
- OpenLDAP설치
yum install openldap-clients |
- OpenLDAP설정 및 실행
service slapd start |
- 환경변수 설정 OpenLDAP설정
LDAP 설정 참조 |
- 사용자/그룹 추가
LDAP 설정 참조 |
- Config 및 Entry 조회
ldapsearch -Q -LLL -Y EXTERNAL -H ldapi: /// -b cn=config dn ldapsearch -x -D "cn=Manager,dc=company,dc=com " -w admin123 -b dc =company, dc =com |
* OS와 연동을 위해서 posixGroup 생성을 추천
2. SSSD 설치 및 LDAP 연동
- 참고사이트
passwd: files sss group: files sss |
- SSSD 설치 및 설정(/etc/sssd/sssd.conf)
yum install sssd
[sssd]
services = nss, pam
sbus_timeout = 30
domains = LDAP
[nss]
filter_users = root
filter_groups = root
[domain
/LDAP
]
enumerate =
true
cache_credentials = TRUE
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
ldap_uri = ldap:
//
ldap_user_search_base =
dc
=company,
dc
=com
tls_reqcert = demand
ldap_tls_cacert =
/etc/pki/tls/certs/ca-bundle
.crt
service sssd start |
public static void main(String[] args){ try { String username = "john" ; UserGroupInformation ugi = UserGroupInformation.createRemoteUser(username); ugi.doAs( new PrivilegedExceptionAction<Void>() { public Void run() throws Exception { Configuration conf = new Configuration(); conf.set( "fs.defaultFS" , "hdfs://host01:8020" ); conf.set( "hadoop.job.ugi" , username); FileSystem fs = FileSystem.get(conf); fs.createNewFile( new Path( "/user/john/test" )); FileStatus[] status = fs.listStatus( new Path( "/user/john" )); for ( int i= 0 ;i<status.length;i++){ System.out.println(status[i].getPath()); } return null ; } }); } catch (Exception e) { e.printStackTrace(); } } } |
- UGI 조회 테스트 코드
public
class
UGIRead {
public
static
void
main(String[] args){
try
{
String username =
"john"
;
UserGroupInformation ugi
= UserGroupInformation.createRemoteUser(username);
ugi.doAs(
new
PrivilegedExceptionAction<Void>() {
public
Void run()
throws
Exception {
Configuration conf =
new
Configuration();
conf.set(
"fs.defaultFS"
,
"hdfs://host01:8020"
);
conf.set(
"hadoop.job.ugi"
, username);
FileSystem fs = FileSystem.get(conf);
InputStream stream = fs.open(
new
Path(
"/user/john/test"
));
BufferedReader reader =
new
BufferedReader(
new
InputStreamReader(stream));
System.out.println(reader.readLine());
reader.close();
stream.close();
fs.close();
return
null
;
}
});
}
catch
(Exception e) {
e.printStackTrace();
}
}
}
hadoop fs -ls /user/john hadoop fs -cat /user/john/test |
yum install oddjob-mkhomedir oddjob chkconfig oddjobd on
service oddjobd start
authconfig --enablemkhomedir --update |
A. createRemoteUser
1. OS에 없는 계정으로 시도 : 오류발생
2. OS에 있는 계정으로 하면 성공 : createRemoteUser API의 인자를 user 로 인식함
B. ugi.doAs
- createRemoteUser와 Configuration의 hadoop.job.ugi 가 다를 경우 : 별도 오류는 발생하지 않음
- FileSystem.createNewFile 시도시 권한없으면 오류 발생
ex) jane 계정으로 /user/hdfs/test22파일생성 시도
Permission denied: user=jane, access=EXECUTE, inode="/user/hdfs/test22":hdfs:hdfs:drwx------
- FileSystem.listStatus 시도시 권한 없으면 오류 발생
ex) jane 계정으로 /user/hdfs 조회시도
Permission denied: user=jane, access=READ_EXECUTE, inode="/user/hdfs":hdfs:hdfs:drwx------
- 적합한 계정으로 작업할 경우 모두 성공
'BigData' 카테고리의 다른 글
Hadoop Security for Multi tenant #3 (0) | 2017.03.24 |
---|---|
Hadoop Securiy for Multi tenant #2 (0) | 2017.01.20 |
Flume-Kafka-Elasticsearch 테스트 (0) | 2016.03.14 |
Storm특징 및 Spark와의 차이점 (0) | 2014.12.12 |
CAP 정리 (0) | 2014.11.28 |