AWS2017. 12. 27. 16:17

AWS Athena의 테이블을 파티션으로 관리 하고 있다면 파티션이 생성될때마다 DDL을 실행해야한다.

구체적으로 아래와 같은 커맨드를 실행할 필요가 있다. (파티션 dt=2017-12-31 을 추가하는 경우)


ALTER TABLE 테이블명ADD IF NOT EXISTS PARTITION (dt='2017-12-31') location 's3://aaa/bbb/dt=2017-12-31'


실제 운영에서는 위의 파티션 추가 커맨드를 정기적으로 실행할 필요가 있으므로 파이썬을 이용해 간단한 스크립트를 작성하여 사용하면 편리하다.


import sys

import boto3

import datetime


# get a batch date and change date format

param_date = sys.argv[1]

dt_tmp = datetime.datetime.strptime(param_date, '%Y%m%d')

dt_folder = dt_tmp.strftime('%Y-%m-%d')

table_name = '테이블명'

s3_path = """s3://aaa/bbb/dt=%s""" % (dt_folder)


client = boto3.client('athena')

sql = """ALTER TABLE %s ADD IF NOT EXISTS PARTITION (dt='%s') location '%s'""" % (table_name, dt_folder, s3_path)


client.start_query_execution(

        QueryString=sql,

        QueryExecutionContext={

            'Database': '디비명'

            },

        ResultConfiguration={

            'OutputLocation': 's3://쿼리결과임시저장경로'

            }

        )


실제 파티션이 제대로 추가 되었는지는 Athena쿼리창에서 아래 커맨드를 실행하여 확인 가능하다.


show partitions 테이블명


[결과]

dt=2017-09-30

dt=2017-10-31

dt=2017-11-30

dt=2017-12-31


파티션은 있으나 파티션내에 데이터가 존재하지 않는다면 아래와 같은 쿼리를 실행했을 경우에는 파티션이
존재하지 않는 것처럼 보일 수 있으니 주의가 필요하다. 

(2017-12-31 파이션은 있으나 실제 데이터는 없을 경우의 예)


select dt from 테이블명 group by dt


[결과]
dt

2017-09-30

2017-10-31

2017-11-30


'AWS' 카테고리의 다른 글

AWS S3 다른 유저에게 공유하기  (0) 2017.11.17
Posted by 유나아빠
AWS2017. 11. 17. 19:12

다른 유저에게 S3 접근권한을 부여하는 방법에 대해 알아보자.


예를 들어 S3로 데이터를 관리하는 다른 부서나 외부 고객으로 부터 데이터 분석의뢰를 받았을 경우

상대방의 S3에 접근권한이 필요하다. 반대로 상대방쪽에서 우리쪽 S3로 접근할 경우도 마찬가지이다.


그럼, 편의를 위해 S3소유자를 UserA, 접근 권한을 부여 받는 쪽을 UserB라고 하자.


권한부여 방법


1. IAM유저 공유

   UserA쪽에서 UserB용도의 IAM유저를 생성해서 S3 ReadOnly권한을 부여

   IAM유저의 AccessKeyID와 SecurityAccessKey를 UserB에게 공유

   UserB는 aws cli로 aws configure설정


   $ aws configure

   AWS Access Key ID [****************]: AAAAAAAAAAAAAAA

   AWS Secret Access Key [****************73vT]: BBBBBBBBBBBBBBBBBBBBBBBBB

   Default region name [ap-northeast-1]:

   Default output format [json]: 


2. 버켓 정책(Bucket Policy) 허가

   UserA의 버켓정책을 아래와 같이 설정


{

    "Version": "2012-10-17",

    "Statement": [

        {

            "Sid": "AAAAAAAAAAA",

            "Effect": "Allow",

            "Principal": {

                "AWS": "arn:aws:iam::[UserB-Role]"

            },

            "Action": "s3:*",

            "Resource": [

                "arn:aws:s3:::bucket-name/*",

                "arn:aws:s3:::bucket-name"

            ]

        }

    ]

}



※ 주의사항

   2번의 버켓 정책 허가로 S3에 권한을 부여할 경우 UserA가 아닌 제삼자가 소유자인 오브젝트에 대해서는 UserB는

   접근권한이 없다. 상세 내용은 아래 참고URL참조



<참고URL>

#버켓정책허가

http://docs.aws.amazon.com/AmazonS3/latest/user-guide/add-bucket-policy.html

#엑세스 정책

http://docs.aws.amazon.com/AmazonS3/latest/dev/access-policy-alternatives-guidelines.html

'AWS' 카테고리의 다른 글

Athena Partition추가 스크립트  (0) 2017.12.27
Posted by 유나아빠
Sqoop2016. 11. 22. 12:57

새로운 하둡 환경을 구축하고 sqoop으로 mysql의 데이터를 하둡으로 옮기는 배치처리중 아래와 같은 에러가 발생


ERROR manager.SqlManager: Error reading from database: java.sql.SQLException: Streaming result set com.mysql.jdbc.RowDataDynamic@689604d9 is still active. No statements may be issued when any streaming result sets are open and in use on a given connection. Ensure that you have called .close() on any active streaming result sets before attempting more queries.

java.sql.SQLException: Streaming result set com.mysql.jdbc.RowDataDynamic@689604d9 is still active. No statements may be issued when any streaming result sets are open and in use on a given connection. Ensure that you have called .close() on any active streaming result sets before attempting more queries.


구글링을 해보니 버그리스트에 들어있었다.

https://issues.apache.org/jira/browse/SQOOP-1400


새로운 하둡환경에 mysql 커넥터를 yum으로 설치했는데 그게 화근이었다.


yum install mysql-connector-java


yum으로 설치하면 디폴트 mysql-connector-java-5.1.17.jar 이 설치되는데

이 놈이 sqoop하고 상성이 잘 안맞는 모양이다.


해결책으로는 아래 링크의 내용을 참고로 sqoop 옵션에 --driver com.mysql.jdbc.Driver를 추가

그리고 mysql-connector-java-5.1.17.jar 이것도 최신 커넥터로 재설치 했다.


http://stackoverflow.com/questions/26375269/sqoop-error-manager-sqlmanager-error-reading-from-database-java-sql-sqlexcept



'Sqoop' 카테고리의 다른 글

unable to create new native thread  (0) 2015.10.29
mysql jdbc 위치  (0) 2015.10.06
Sqoop Import의 delete-target-dir 옵션  (0) 2015.03.19
Posted by 유나아빠