Intro
얼마전, 회사에서 MLE 분이 HDFS에서 뭔가 다운로드 받고 싶으시다고 WebHDFS 경로를 문의주셨습니다. 그런데 저희 시니어 팀원 분께서 WebHDFS가 아닌 HttpFS를 쓰시도록 권고를 해주시길래, 어떤 차이가 있는걸까.. 생각해보게 되었습니다. 단순한 궁금증이긴 하지만, 이번 기회에 정리해보고자 합니다.
WebHDFS와 HttpFS. 과연 무엇이 다른걸까요?
WebHDFS
WebHDFS는 HDFS 클라이언트가 Hadoop 바이너리를 설치하지 않더라도, 다양한 언어에서 HDFS에 접근할 수 있도록 REST 형태로 개발된 API입니다. Hortonworks에서 개발했으며, Hadoop 에코시스템 외부에서 동작하는 애플리케이션이 HDFS에 무언가 생성하고 쓰고, 변경하는 작업을 허용해줍니다.
WebHDFS는 REST를 기반으로 하기 때문에 GET, PUT, POST, DELETE 등의 HTTP 메서드를 활용합니다. 예를 들어, open
, getfilestatus
, liststatus
같은 작업은 GET
메서드를 활용하고, create
, mkdirs
, rename
등의 작업은 PUT
메서드를 활용합니다.
WebHDFS는 Hadoop 설치 과정에서 hdfs-site.xml
파일 설정에 따라 기본적으로 함께 설치됩니다. 다음처럼 dfs.webhdfs.enabled
옵션이 true
로 설정되어 있다면 함께 설치됩니다.
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
연결하는 방법도 단순합니다. 클라이언트가 액티브 네임노드에 직접 API를 호출하는 형태이기 때문에 다음과 같은 URI를 갖게 됩니다.
참고로 기본 <PORT>
의 값은 네임노드의 경우 50070
, 데이터노드의 경우 50075
가 됩니다.
# <PATH> 디렉토리 내 파일 보기
curl -i "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=LISTSTATUS"
# <PATH> 컨텐츠 요약하기(?)
curl -i "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=GETCONTENTSUMMARY"
# <PATH>에 위치한 파일 읽기
curl -i -L "http://<HOST>:<PORT>/webhdfs/v1/<PATH>?op=OPEN"
HttpFS (HDFS over HTTP)
HttpFS는 Hadoop 바이너리가 없는 외부에서, HTTP 프로토콜을 통해 HDFS에 직접 접근하기 위한 게이트웨이의 역할을 합니다. 즉, WebHDFS처럼 직접 액티브 네임노드에 붙는 형태가 아니라, HttpFS 서버를 띄우고, 클라이언트는 이 서버와 통신하는 구조를 갖습니다. 프록시 같은 역할이라고 볼 수 있겠네요!
따라서 HA 활성화된 클러스터인 경우에도 접근이 가능합니다. 액티브 네임노드가 변경되더라도, 이를 클라이언트가 알고 있을 필요가 없으니까요.
HttpFS를 이용할 때, 모든 데이터는 단일 HttpFS 노드를 통해서 오가게 됩니다. 따라서 성능 면에서는 느릴 수도 있지만, 다른 Hadoop 노드의 방화벽을 오픈할 필요가 없기 때문에 보안을 향상 시키는데 도움이 됩니다.
HttpFS API를 몇 가지 살펴보면 다음과 같습니다. 참고로 <PORT>
의 기본값은 14000
으로 설정되어 있습니다.
# /user/foo/README.txt 파일 읽기
curl 'http://<HTTPFS_HOST>:<PORT>/webhdfs/v1/user/foo/README.txt?op=OPEN&user.name=foo'
# /user/foo 디렉토리 내 파일 리스트를 JSON 형태로 받기
curl 'http://<HTTPFS_HOST>:<PORT>/webhdfs/v1/user/foo?op=LISTSTATUS&user.name=foo' returns the contents of the HDFS /user/foo directory in JSON format.
# /usre/foo/bar 디렉토리를 생성하기
curl -X POST 'http://<HTTPFS_HOST>:<PORT>/webhdfs/v1/user/foo/bar?op=MKDIRS&user.name=foo' creates the HDFS /user/foo/bar directory.
차이점은?
이미 앞선 설명을 읽으시면서 느끼셨겠지만, WebHDFS와 HttpFS는 그리 다르지 않습니다. 둘 다 하는 역할이 비슷하죠. 그렇지만 구조적인 차이로 인해 큼직한 차이점이 있습니다.
WebHDFS의 경우, 클라이언트 <-> [네임노드, 데이터노드]
사이의 방화벽이 모두 열려야 합니다. 그렇다보니 매번 방화벽을 신경 써줘야 한다는 불편함이 있습니다. 또, 저렇게 모든 방화벽을 열게 되면, 당연히 보안도 취약해질 수밖에 없습니다.
반면, HttpFS의 경우, 클라이언트 <-> HttpFS 서버
의 구조가 되기 때문에, HttpFS를 제공하는 서버로의 방화벽만 열리면 되기 때문에, 보안적인 측면에서 훨씬 견고합니다.
게다가, 앞서 말씀드렸듯이 HttpFS는 프록시와 비슷한 역할을 하는 서버를 제공하기 때문에 HA 구성 되어 있는 Hadoop 클러스터도 잘 지원합니다. WebHDFS는 액티브 네임노드의 주소가 변경되면 클라이언트가 이를 인지해야 하기 때문에 HA 구성된 클러스터에서 사용하기 어려움이 있습니다.
그렇지만, WebHDFS는 클라이언트가 데이터를 읽을 때, 각 데이터를 보유하고 있는 데이터노드에서 직접 데이터를 불러오기 때문에, 단일 서버와 통신하는 HttpFS 방식에 비해 작업 성능은 뛰어나다고 볼 수 있습니다. 이런 이유로, 대용량 파일이 전송되는 경우 HttpFS 서버에 부하가 크게 가해질 수 있다는 점은 인지할 필요가 있습니다.
정리하자면, 보안이 중요한 클러스터라면 HttpFS를, 보안은 그리 중요하지 않지만 성능을 챙겨야 하는 클러스터를 사용중이라면 WebHDFS를 선택하면 되겠네요!
마무리
이번 글을 작성하면서 HttpFS와 WebHDFS의 역할과 차이점을 확실하게 이해할 수 있었습니다. 특히, Reference 쪽에 소개한 slideshare 자료를 보면, 두 방식이 어떠한 플로우로 동작하는지 쉽게 이해할 수 있는 차트가 있어서 궁금하시다면 한번 살펴보시는 걸 추천드립니다!
만약 이 글이 도움이 되셨다면 글 좌측 하단의 하트❤를 눌러주시면 감사하겠습니다.
혹시라도 글에 이상이 있거나, 오역, 이상한 번역이 있거나, 이해가 가지 않으시는 부분, 또는 추가적으로 궁금하신 내용이 있다면 주저 마시고 댓글💬을 남겨주세요! 빠른 시간 안에 답변을 드리겠습니다 😊
Reference
- https://stackoverflow.com/questions/31580832/hdfs-put-vs-webhdfs
- https://community.cloudera.com/t5/Community-Articles/Comparison-of-HttpFs-and-WebHDFS/ta-p/245562
- https://hadoop.apache.org/docs/stable/hadoop-hdfs-httpfs/index.html
- https://hadoop.apache.org/docs/r1.0.4/webhdfs.html
- https://www.linkedin.com/pulse/20140717115238-176301000-accessing-hdfs-using-the-webhdfs-rest-api-vs-httpfs/
- https://www.slideshare.net/wchevreuil/web-hdfs-and-httpfs