Hadoop Azure Data Lake 지원
Hadoop Azure Data Lake 지원
hadoop-azure-datalake 모듈은 Azure Data Lake Store와의 통합을 지원해요. 이 지원은 azure-datalake-store.jar JAR 파일로 제공돼요.
출처: 문서
본문
소개 (Introduction)
hadoop-azure-datalake 모듈은 Azure Data Lake Store와의 통합을 지원해요. 이 지원은 azure-datalake-store.jar JAR 파일을 통해 제공돼요.
관련 문서: Troubleshooting.
기능 (Features)
- Azure Data Lake Storage 계정에 저장된 데이터를 읽고 씀.
- Secure Webhdfs 즉 SSL 암호화 접근을 위해
adl스킴을 사용하는 URL로 파일시스템 경로를 참조. - MapReduce 작업의 데이터 소스(source) 또는 싱크(sink) 역할을 할 수 있음.
- Linux와 Windows 모두에서 테스트됨. 규모(scale)에 대해 테스트됨.
- API
setOwner(),setAcl,removeAclEntries(),modifyAclEntries()는 사용자·그룹 이름으로 UPN 또는 OID (Object ID)를 받음. - 계정별 구성(per-account configuration)을 지원.
제한 사항 (Limitations)
다음 연산에 대한 부분적이거나 없는 지원:
- 기호 링크(Symbolic Links) 연산
- 프록시 사용자 (Proxy Users)
- 파일 잘라내기 (File Truncate)
- 파일 체크섬 (File Checksum)
- 파일 복제 계수 (File replication factor)
- Hadoop 클러스터의 활성 사용자의 홈 디렉터리 (Home directory)
- 확장 속성(XAttrs) 연산
- 스냅샷 연산
- 위임 토큰(Delegation Token) 연산
listStatus()와getFileStatus()로 반환되는 사용자·그룹 정보는 Azure Active Directory와 연관된 GUID 형태.
사용법 (Usage)
Azure Data Lake Storage 접근 경로 구문은 다음과 같아요:
adl://<Account Name>.azuredatalakestore.net/
스토어 사용에 대한 자세한 내용은 Azure Portal로 Azure Data Lake Store 시작하기 를 참고하세요.
OAuth2 지원 (OAuth2 Support)
Azure Data Lake Storage를 사용하려면 OAuth2 사양에 따라 HTTPS 헤더의 일부로 OAuth2 베어러(bearer) 토큰이 있어야 해요. Azure Data Lake Storage Account에 접근 권한이 있는 유효한 사용자를 위해 Azure Active Directory 서비스에서 유효한 OAuth2 베어러 토큰을 얻어야 해요. Azure Active Directory(Azure AD)는 Microsoft의 멀티테넌트 클라우드 기반 디렉터리·ID 관리 서비스예요. What is ActiveDirectory 를 참고하세요.
다음 섹션들은 core-site.xml의 OAuth2 구성을 설명해요.
자격 증명과 FileSystem 구성 (Configuring Credentials and FileSystem)
자격 증명은 사용자와 연관된 갱신 토큰(refresh token) 또는 클라이언트 자격 증명(서비스 주체와 유사)으로 구성할 수 있어요.
갱신 토큰 사용 (Using Refresh Tokens)
클러스터의 core-site.xml에 다음 속성을 추가해요:
<property>
<name>fs.adl.oauth2.access.token.provider.type</name>
<value>RefreshToken</value>
</property>
애플리케이션은 클라이언트 ID와, 해당 클라이언트 ID와 연관된 Azure Active Directory 서비스의 OAuth2 갱신 토큰을 설정해야 해요. Active Directory Library For Java 를 참고하세요. 클라이언트 ID와 갱신 토큰은 공유하지 말고 비밀로 유지해야 해요.
<property>
<name>fs.adl.oauth2.client.id</name>
<value></value>
</property>
<property>
<name>fs.adl.oauth2.refresh.token</name>
<value></value>
</property>
클라이언트 키 사용 (Using Client Keys)
서비스 주체 생성 (Generating the Service Principal)
- 포털로 이동해 왼쪽 내비게이션의 서비스에서 Azure Active Directory를 찾아 클릭해요.
- 메뉴의 "App Registrations"를 사용해 "Web Application"을 만들어요. 여기서 만든 이름을 기억해 두세요 — 그 이름이 ADL 계정에 승인된 사용자로 추가할 것예요.
- 마법사를 진행해요.
- 앱이 만들어지면 앱의 "settings" 아래 "keys"로 이동해요.
- 키 기간을 선택하고 저장(save)을 누르세요. 생성된 키를 저장해요.
- App Registrations 페이지로 돌아가 상단의 "Endpoints" 버튼을 클릭해요.
- "Token Endpoint" URL을 적어 두세요.
- 인증에 필요한 속성을 적어 두세요: 위에서 만든 Web App의 "Application ID", 방금 생성한 키, 토큰 엔드포인트.
- ADL 계정에 서비스 주체 추가 (Adding the service principal to your ADL Account): 다시 포털로 가서 ADL 계정을 엽니다. Access control (IAM)를 선택하고 6단계에서 만든 사용자 이름을 추가해요 (목록에는 표시되지 않지만 이름으로 검색하면 찾을 수 있어요). "Owner" 역할을 추가해요.
core-site.xml 구성 (Configure core-site.xml)
core-site.xml에 다음 속성을 추가해요:
<property>
<name>fs.adl.oauth2.access.token.provider.type</name>
<value>ClientCredential</value>
</property>
<property>
<name>fs.adl.oauth2.refresh.url</name>
<value>TOKEN ENDPOINT FROM STEP 7 ABOVE</value>
</property>
<property>
<name>fs.adl.oauth2.client.id</name>
<value>CLIENT ID FROM STEP 7 ABOVE</value>
</property>
<property>
<name>fs.adl.oauth2.credential</name>
<value>PASSWORD FROM STEP 7 ABOVE</value>
</property>
MSI 사용 (Using MSI (Managed Service Identity))
Azure VM은 VM 내의 Identity 확장이 관리하는 "서비스 ID"로 프로비저닝할 수 있어요. 이점은 자격 증명이 확장에 의해 관리되므로 core-site.xml에 넣지 않아도 된다는 것이에요. MSI를 사용하려면 VM 배포 템플릿을 수정해 identity 확장을 사용해요. 템플릿에 지정한 포트 번호를 기록해 두세요: 이것은 VM의 identity 확장이 localhost에 노출하는 토큰 서비스의 REST 엔드포인트 포트 번호예요. 기본 권장 포트는 50342예요 — 권장 포트를 사용한다면 아래의 msi.port 설정은 구성에서 생략할 수 있어요.
core-site.xml 구성 (Configure core-site.xml)
core-site.xml에 다음 속성을 추가해요:
<property>
<name>fs.adl.oauth2.access.token.provider.type</name>
<value>Msi</value>
</property>
<property>
<name>fs.adl.oauth2.msi.port</name>
<value>PORT NUMBER FROM ABOVE (if different from the default of 50342)</value>
</property>
대화형 로그인을 위한 Device Code 인증 (Using Device Code Auth for interactive login)
참고: 이 인증 방식은 대화형 도구를 실행하는 데 적합하지만, 클러스터에 제출된 작업에는 동작하지 않아요.
사용자 기반 로그인을 위해 Azure Active Directory는 device code 로그인 흐름을 제공해요. device code 흐름을 사용하려면 사용자가 먼저 Azure 포털에서 Native app 등록을 만들고, 앱의 클라이언트 ID를 구성으로 제공해야 해요. 단계는 다음과 같아요:
- 포털로 이동해 왼쪽 내비게이션의 서비스에서 Azure Active Directory를 찾아 클릭해요.
- 메뉴의 "App Registrations"를 사용해 "Native Application"을 만들어요.
- 마법사를 진행해요.
- 앱이 만들어지면 앱의 "Application ID"를 적어 두세요.
- 앱에 권한을 부여해요: 앱의 "Permissions"를 클릭하고 "Azure Data Lake"와 "Windows Azure Service Management API" 권한을 추가해요. "Grant Permissions"를 클릭해 앱에 권한을 추가해요.
core-site.xml에 다음 속성을 추가해요:
<property>
<name>fs.adl.oauth2.devicecode.clientappid</name>
<value>APP ID FROM STEP 5 ABOVE</value>
</property>
DeviceCode를 기본 토큰 제공자 유형으로 추가하는 것은 보통 바람직하지 않아요. 하지만 로컬 명령에서 사용할 수 있어요:
hadoop fs -Dfs.adl.oauth2.access.token.provider.type=DeviceCode -ls ...
이를 실행하면 어떤 브라우저에서든(ssh 세션 밖의 다른 머신에서도) 로그인에 사용할 수 있는 URL과 device code가 출력돼요. 로그인이 완료되면 명령이 계속됩니다.
자격 증명 제공자로 자격 증명 보호하기 (Protecting the Credentials with Credential Providers)
많은 Hadoop 클러스터에서 core-site.xml 파일은 전 세계가 읽을 수 있어요. 이 자격 증명을 보호하려면 자격 증명 제공자(credential provider) 프레임워크를 사용해 안전하게 저장하고 접근하는 것을 권장해요. 모든 ADLS 자격 증명 속성을 자격 증명 제공자로 보호할 수 있어요. 자격 증명 제공자 API에 대한 추가 정보는 Credential Provider API 를 참고하세요.
프로비저닝 (Provisioning)
hadoop credential create fs.adl.oauth2.client.id -value 123
-provider localjceks://file/home/foo/adls.jceks
hadoop credential create fs.adl.oauth2.refresh.token -value 123
-provider localjceks://file/home/foo/adls.jceks
core-site.xml 또는 명령줄 속성 구성 (Configuring core-site.xml or command line property)
<property>
<name>fs.adl.oauth2.access.token.provider.type</name>
<value>RefreshToken</value>
</property>
<property>
<name>hadoop.security.credential.provider.path</name>
<value>localjceks://file/home/foo/adls.jceks</value>
<description>Path to interrogate for protected credentials.</description>
</property>
DistCp 실행 (Running DistCp)
hadoop distcp
[-D fs.adl.oauth2.access.token.provider.type=RefreshToken
-D hadoop.security.credential.provider.path=localjceks://file/home/user/adls.jceks]
hdfs://<NameNode Hostname>:9001/user/foo/srcDir
adl://<Account Name>.azuredatalakestore.net/tgtDir/
참고: 일반적인 core-site.xml에 작업별 구성을 추가하는 대신, distcp 명령줄에 제공자 경로 속성을 선택적으로 추가할 수 있어요. 위의 대괄호는 이 기능을 보여줘요.
adl URL 접근 (Accessing adl URLs)
core-site.xml에 자격 증명이 구성된 후, 어떤 Hadoop 컴포넌트든 다음 형식의 URL로 그 Azure Data Lake Storage 계정의 파일을 참조할 수 있어요:
adl://<Account Name>.azuredatalakestore.net/<path>
adl 스킴은 Azure Data Lake Storage가 지원하는 Hadoop 호환 파일시스템의 URL을 식별해요. adl은 Azure Data Lake Storage API와의 모든 상호작용에 암호화된 HTTPS 접근을 활용해요.
예를 들어 youraccount라는 스토리지 계정에 대한 접근을 보여주는 다음 FileSystem Shell 명령들이 있어요:
hadoop fs -mkdir adl://yourcontainer.azuredatalakestore.net/testDir
hadoop fs -put testFile adl://yourcontainer.azuredatalakestore.net/testDir/testFile
hadoop fs -cat adl://yourcontainer.azuredatalakestore.net/testDir/testFile
test file content
사용자/그룹 표현 (User/Group Representation)
hadoop-azure-datalake 모듈은 getFileStatus(), listStatus(), getAclStatus() 호출 중에 사용자/그룹 정보가 어떻게 표현되는지 구성하는 지원을 제공해요. core-site.xml에 다음 속성을 추가해요:
<property>
<name>adl.feature.ownerandgroup.enableupn</name>
<value>true</value>
<description>
When true : User and Group in FileStatus/AclStatus response is
represented as user friendly name as per Azure AD profile.
When false (default) : User and Group in FileStatus/AclStatus
response is represented by the unique identifier from Azure AD
profile (Object ID as GUID).
For performance optimization, Recommended default value.
</description>
</property>
서로 다른 ADL 계정에 대한 구성 (Configurations for different ADL accounts)
서로 다른 ADL 계정을 서로 다른 ADL 클라이언트 구성으로 접근할 수 있어요. 이것은 서로 다른 로그인 세부 정보도 허용해요. 모든 fs.adl 옵션은 계정별로 설정할 수 있어요. 계정별 옵션은 옵션의 fs.adl. 접두사를 fs.adl.account.ACCOUNTNAME.로 대체해 설정하며, ACCOUNTNAME은 계정 이름이에요. 계정에 연결할 때 명시적으로 설정된 모든 옵션은 기본 fs.adl. 값을 덮어써요.
예를 들어 구성은 공용 계정 adl://<some-public-account>.azuredatalakestore.net/을 사용하는 기본 구성과, 일부 개인 계정 adl://myprivateaccount.azuredatalakestore.net/을 사용하는 계정별 구성을 가질 수 있어요:
<property>
<name>fs.adl.oauth2.client.id</name>
<value>CLIENTID</value>
</property>
<property>
<name>fs.adl.oauth2.credential</name>
<value>CREDENTIAL</value>
</property>
<property>
<name>fs.adl.account.myprivateaccount.oauth2.client.id</name>
<value>CLIENTID1</value>
</property>
<property>
<name>fs.adl.account.myprivateaccount.oauth2.credential</name>
<value>CREDENTIAL1</value>
</property>
azure-datalake-store 모듈 테스트 (Testing the azure-datalake-store Module)
hadoop-azure 모듈은 전체 단위 테스트 제품군을 포함해요. 대부분의 테스트는 mvn test를 실행해 추가 구성 없이 실행돼요. 여기에는 Azure Data Lake Storage의 인메모리 에뮬레이션인 mock 스토리지에 대한 테스트가 포함돼요.
Azure Data Lake Storage에 대해 실행할 수 있는 일부 테스트도 있어요. 이 테스트를 실행하려면 위 섹션에 언급된 Adl 계정 정보와 다음 속성으로 src/test/resources/auth-keys.xml을 만들어요:
<property>
<name>fs.adl.test.contract.enable</name>
<value>true</value>
</property>
<property>
<name>test.fs.adl.name</name>
<value>adl://yourcontainer.azuredatalakestore.net</value>
</property>
더 알아보기 (Learn more)
- 원문: 문서