Apache Sqoop

[Apache Sqoop] Sqoop이란?

binary-kim 2025. 1. 11. 14:53

Sqoop이란?

Apache Sqoop이란 RDBMS (MySQL, Oracle, ...)에서 Apache Hadoop 간 대용량 데이터 전송을 위해 설계된 도구이며, SQL-On-Hadoop의 약자라고 합니다. ETL / ELT 작업을 수행해야하는 상황에서 수집해야 하는 데이터의 크기가 대용량일 경우 Sqoop의 도입은 효율적인 파이프라인을 구성하는 데 고민해볼 수 있습니다.

 

간단한 예시로 DW (Data WareHouse)를 위한 파이프라인을 구성한다고 가정해보면...

 

DW 아키텍쳐 (https://parksuseong.blogspot.com/2019/08/data-warehouse.html)

 

위 그림과 같이, 다양한 형태의 운영계 DB가 존재하는 상황에서 ETL을 통해 STG / ODS / DW / DM을 구성할 수 있습니다. 여기서  STG 영역은 운영계의 데이터를 그대로 복사하여 저장 / 관리를 진행하는 영역이며, 해당 작업을 진행할 때 대용량의 데이터를 가져와서 적재해야 할 수 있습니다. 이런 경우, Sqoop이라는 도구를 활용하게 되면 데이터를 효과적으로 수집할 수 있게 됩니다.

 

Sqoop은 아래와 같은 특징 및 장점을 가지고 있습니다.

  • CLI (Command Line Interface)를 통한 간단한 사용
  • 다양한 RDBMS와 연동 가능
  • MapReduce를 활용한 병렬 처리
  • Hive / HBase 등 Hadoop Eco System과의 연동 편리

Sqoop에는 크게 Import / Export 작업으로 나뉘게 됩니다. 두 Task에 대해서 한 번 알아가보겠습니다.

 

Sqoop Import 

Import 작업은 RDBMS에서 Hadoop으로 데이터를 가져올 때의 작업을 의미합니다. 즉, 원천 데이터 (Oracle, Postgres, ...)에서 Hadoop으로 데이터를 가져오고자 할 때, Sqoop Import 명령어를 통해 작업을 수행할 수 있습니다. 대략적인 Import 작업 개요는 아래 사진과 같습니다. 

 

 

Sqoop Import (http://hochul.net/blog/apache-sqoop-sql-to-hadoop/)

 

우선, 작업을 수행하면 작업할 테이블의 Metadata를 수집하는 과정을 수행합니다. Metadata는 다양한 저장소에서 관리될 수 있으며, Hadoop Eco System 중 Apache Hive가 대표적입니다. 그 후로, Map-Only Job을 Submit하게 되어 MapReduce 중 Map 작업만 수행하게 됩니다. 왜 Map 작업만 수행할까요? 이는 Sqoop이라는 도구의 역할을 생각해보면 쉽게 해답을 얻을 수 있습니다.

 

Sqoop이라는 도구는 "대용량 데이터를 가져옴 / 내보냄"이 주 기능이며, ETL에서 주로 Extract 영역에 속합니다. 데이터를 가공하는 Transform이 아닌 데이터 추출 / 전달에 좀 더 특화된 도구이기에, Map-Only 작업을 수행한다고 보시면 좋습니다.

 

Sqoop Export 

Export 작업은 Import 작업 반대로, Hadoop에서 RDBMS로 데이터를 내보낼 때의 작업을 의미합니다. Hadoop에서 다양한 DB로 대용량 데이터를 전송할 때, Sqoop Export 작업을 수행할 수 있습니다. Export 작업 개요는 아래와 같습니다. Import 작업과 비슷한 듯 보이지만, 어디서 어디로 데이터를 보내는지에 따라 Import / Export가 나뉜다고 이해하시면 좋습니다.

 

Sqoop Export (http://hochul.net/blog/apache-sqoop-sql-to-hadoop/)

 

병렬 처리

 

Sqoop Import / Export에는 기본적으로 "-m / --num-mappers"라는 옵션이 존재합니다. 해당 옵션의 의미는 Sqoop 작업에서 활용할 mapper의 수를 지정하는 옵션이며, 설정한 값 만큼의 mapper가 실제 Map-Only Job을 수행하게 됩니다. MapReduce 작업을 수행할 때 mapper가 1이면 데이터를 Count하는 사람이 한 명임을 의미하며, mapper가 8이면 사람이 8명임을 의미합니다. 이런 관점에서 보면, mapper를 높이는 것이 대용량 데이터를 처리하는 데 큰 효율을 가져다줄 수 있을 것으로 예상됩니다. 여기서, 한 가지 생각해보겠습니다. 

 

"단순히 mapper를 크게하면, 작업의 효율성이 늘어날까?"

 

제 생각에는 해당 문장은 옳지 못한 표현이라 생각합니다. mapper를 늘린다는 것은 결국엔 "하나의 Task를 수행하는 데 투입되는 리소스의 양이 늘어난다"라는 것과 동일한 의미입니다. 리소스를 많이 투입한 상황인데,  그에 준하는 효과를 보지 못한다면 비효율적인 상황이 아닐까 생각합니다. 이러한 상황을 한 문장으로 정리해본다면, "컨테이너 간 수집하는 데이터 건 수가 비슷한 경우 mapper 증가에 따른 이상적인 효과를 예상할 수 있으며, 그 반대로 컨테이너 간 Data Skew 현상이 존재하는 경우 리소스 투입 대비 비효율적인 작업을 수행할 수 있습니다." 인 것 같습니다. 그렇다면 어떻게 이런 상황을 해결할 수 있을까요?

 

num-mappers 옵션을 2 이상으로 설정하게 되면, "split-by" 옵션을 함께 사용해야 합니다. split-by는 DB 내 어떤 컬럼을 기준으로 분할하여 Map 작업을 수행할지 기준 컬럼을 설정하는 옵션입니다. 해당 기준 컬럼의 데이터 분포를 바탕으로 여러 개의 컨테이너에 데이터를 분포시켜 병렬 처리를 수행하게 됩니다. Sqoop 에서는 MIN / MAX 값을 통해 설정한 mapper 수 만큼 구간을 분할하게 됩니다. 만약, 데이터가 1~8까지 존재하고 mapper가 4로 설정되어 있는 상황이면, 1번 컨테이너부터 4번 컨테이너까지 차례대로 (1~2, 3~4, 5~6, 7~8) 의 데이터 값을 갖는 row들을 각각의 컨테이너에서 처리하는 작업을 수행할 것입니다.

 

우리에게 남은 숙제는 결국에는 ...

 

"Data Skew를 줄일 수 있는 적절한 컬럼을 추출하고, 이를 split-by에 활용하자" 인 것 같습니다. split-by에 어떤 컬럼의 값을 설정하는지에 따라, 작업 시간의 효율성을 결정할 수 있을 것으로 예상됩니다.

 

주의할 점

 

RDBMS와 Hadoop간 데이터가 전송되는 작업이다보니, 쉽게 적용가능하다는 장점이 존재합니다. 그렇지만, 모든 도구가 그렇듯이, 사용에 있어 주의해야 할 점이 존재합니다. 팀에서 겪었던 문제 중 하나는 "데이터 타입 변환"입니다.

 

"-1"이라는 숫자 데이터를 parquet(파케이) 테이블 내 Bigint 컬럼에 적재할 때, 음수 데이터 값이 BigInt가 아닌 String으로 인식되어 에러가 발생했었고, 이를 해결하고자 데이터를 받아올 때 String으로 변환하여 적재를 했던 경험이 있습니다. 이 외에도, 다양한 에러가 존재할 것이며, DW/DM 개발에 영향을 미치지 않도록 적절한 해결책을 찾는 것이 중요합니다.

 

 

마무리하며

이번 게시글에선 Sqoop에 대하여 간단하게 확인해보는 시간을 가져봤습니다. Sqoop이 2021년에 Apache Attic으로 이관되어, 현재는 개발이 멈춘 상태입니다. 이를 대체할 수 있는 여러가지 도구들 (Apache Gobblin / NiFi)도 존재하니, 이를 알아두시면 나중에 어떤 기술을 도입할 지에 대한 고민에서 해답을 얻을 수 있을 것이라 생각합니다.

 

감사합니다.