Sqoop 1.4.7 은 JDBC 드라이버를 함께 배포하지 않는다. MySQL 8 계열(Aurora MySQL 3.x 포함) 에 붙으려면 Connector/J 8 을 직접 넣고, 드라이버 클래스 이름이 바뀐 점을 반영해야 한다.
Connector/J 8 의 JAR 을 Sqoop 의 라이브러리 경로에 둔다.
cp mysql-connector-j-8.4.0.jar "$SQOOP_HOME/lib/"
Cloudera 배포판처럼 parcel 로 깔린 경우에는 /var/lib/sqoop/ 가 표준 위치다. 이 디렉터리는 업그레이드 때 유지된다.
cp mysql-connector-j-8.4.0.jar /var/lib/sqoop/
chmod 644 /var/lib/sqoop/mysql-connector-j-8.4.0.jar
$SQOOP_HOME/lib 에 넣기 어렵다면 실행할 때 HADOOP_CLASSPATH 로 지정해도 된다.
export HADOOP_CLASSPATH=/opt/jdbc/mysql-connector-j-8.4.0.jar:$HADOOP_CLASSPATH
MapReduce 태스크가 도는 노드에서도 드라이버를 찾아야 한다. 노드마다 배포하거나 -libjars 로 함께 올린다. -libjars 는 도구 이름 바로 뒤, 다른 인자보다 앞에 와야 한다.
sqoop import -libjars /opt/jdbc/mysql-connector-j-8.4.0.jar --connect ...
Connector/J 8 에서 클래스 이름이 바뀌었다. 예전 이름을 쓰면 경고가 뜨거나 실패한다.
| 버전 | 클래스 |
|---|---|
| Connector/J 5.1 | com.mysql.jdbc.Driver |
| Connector/J 8 | com.mysql.cj.jdbc.Driver |
Sqoop 은 URL 로 커넥터를 골라내므로 대개 --driver 를 주지 않아도 된다. 오히려 --driver 를 명시하면 MySQL 전용 최적화 경로 대신 범용 JDBC 경로로 떨어지므로, 필요할 때만 쓴다.
sqoop import \
--connect 'jdbc:mysql://aurora-endpoint.example.com:3306/mydb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Seoul' \
--username "$DB_USER" \
--password-file hdfs:///user/sqoop/mysql.password \
--table orders \
--target-dir /raw/orders \
--num-mappers 4 --split-by order_id
URL 파라미터 세 가지를 짚어 둔다.
useSSL=false — TLS 를 쓰지 않을 때. 운영에서는 끄지 말고 useSSL=true 에 truststore 를 붙이는 편이 낫다.allowPublicKeyRetrieval=true — MySQL 8 기본 인증 플러그인 caching_sha2_password 에서 평문 접속 시 필요하다. 없으면 Public Key Retrieval is not allowed 로 실패한다.serverTimezone — 서버 시간대가 모호하면 The server time zone value ... is unrecognized 가 난다. Connector/J 8.0.23 이상에서는 connectionTimeZone 이 권장 이름이다.--password 로 비밀번호를 명령행에 적으면 ps 에 노출된다. --password-file 이나 -P 를 쓴다.
접속만 먼저 검증한다.
sqoop list-databases --connect 'jdbc:mysql://host:3306/?useSSL=false' --username "$DB_USER" -P
sqoop eval --connect 'jdbc:mysql://host:3306/mydb?useSSL=false' --username "$DB_USER" -P \
--query 'SELECT 1'
ClassNotFoundException: com.mysql.cj.jdbc.Driver 가 나면 드라이버 배치를, Access denied 가 나면 계정과 호스트 접근 권한을, Communications link failure 가 나면 보안 그룹·방화벽을 본다.
Aurora 를 쓸 때는 읽기 부하를 위해 리더 엔드포인트를 쓰되, --split-by 대상 컬럼에 인덱스가 있는지 확인한다. 인덱스가 없으면 매퍼마다 풀 스캔이 돈다.