WiseN

AWS EMR Series - Hive geospatial 데이터 조회

Jan 18,2019   |   AWS

작성자_김명수

페이스북 공유하기 트위터 공유하기
Blog thumbnail

여기서 다루는 내용


· 간단 소개
· 사전 준비
· Hive UDF 등록 및 geospatial 데이터 조회
· 마무리


 

이번 시간에는 EMR 클러스터에서 Hive에서 지리 공간 데이터를 조회하도록 하겠습니다.

Hive에서는 자체적으로 geospatial 을 지원하지 않으므로  ESRI에서 제공하는 spatial-framework-for-hadoop 을 사용하여 Hive UDF 생성 및 활용하는 방식으로 진행합니다.

 




간단 소개









    • AWS EMR

      • 관리형 하둡 클러스터 플랫폼

      • Apache Spark, HBase, Presto, Hive와 같이 널리 사용되는 분산 프레임워크를 실행

      • Amazon S3 및Amazon DynamoDB와 같은 다른 AWS  데이터 스토어의 데이터와 상호 작용

      • 수동 또는 Auto Scaling을 통한 인스턴스 수를 늘리거나 줄일 수 있으며, spot 인스턴스 활용을 통한 비용 절감 가능

      • 제품 세부 정보 : Link






 




사전 준비






:: EMR 생성


Hive가 포함된 EMR 클러스터를 생성합니다.



 

:: Jar 파일 준비


esri에서 제공하는 spatial-framework-for-hadoop을 다운로드 합니다.



maven 빌드를 하는데 이때 EMR release 버전에 맞는 Hadoop 버전과 Hive 버전을 넣고 빌드합니다.

빌드를 완료하면 spatial-sdk-hive-2.1.1.jar, spatial-sdk-json-2.1.1.jar 두개의 jar 파일이 생성됩니다.

 

이어서 esri에서 제공하는 geometry-api-java를 다운로드 합니다.



빌드를 완료하면 esri-geometry-2.2.3.jar  파일이 생성됩니다.

 

위에서 생성했던 jar 파일들을 EMR 마스터에 복사합니다.



 

이제 hive에서 해당 라이브러리를 UDF로 등록하여 사용하면 됩니다.

 

:: 샘플 데이터 준비


지리정보 데이터를 조회해 보도록 하겠습니다.
샘플 데이터로 https://github.com/Esri/gis-tools-for-hadoop 를 참고하여 테스트하겠습니다.

 

먼저 샘플 데이터를 다운로드 받고 압축을 해제 합니다.

wget https://github.com/Esri/gis-tools-for-hadoop/archive/master.zip
unzip master.zip


 

아래 이미지와 같이 압축 해제된 gis-tools-for-hadoop-master 폴더가 생성됩니다.


 

샘플 데이터를 hdfs에 업로드 합니다.

hadoop fs -mkdir /user/hive/demo
hadoop fs -put gis-tools-for-hadoop-master/samples/data/counties-data /user/hive/demo
hadoop fs -put gis-tools-for-hadoop-master/samples/data/earthquake-data /user/hive/demo







Hive UDF 등록 및 geospatial 데이터 조회






:: UDF 등록


hive를 실행합니다.


 

jar 파일들을 읽습니다.

add jar /home/hadoop/esri-geometry-api-2.2.3.jar /home/hadoop/spatial-sdk-hive-2.1.1.jar /home/hadoop/spatial-sdk-json-2.1.1.jar;


 

UDF에 function ST_Point, ST_Contains 를 등록합니다.

CREATE FUNCTION ST_Point AS 'com.esri.hadoop.hive.ST_Point';


CREATE FUNCTION ST_Point AS 'com.esri.hadoop.hive.ST_Contains';



 

earthquakes, counties 테이블을 생성합니다.
CREATE TABLE earthquakes (earthquake_date STRING, latitude DOUBLE, longitude DOUBLE, depth DOUBLE, magnitude DOUBLE,
magtype string, mbstations string, gap string, distance string, rms string, source string, eventid string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

CREATE TABLE counties (Area string, Perimeter string, State string, County string, Name string, BoundaryShape binary)                  
ROW FORMAT SERDE 'com.esri.hadoop.hive.serde.EsriJsonSerDe'
STORED AS INPUTFORMAT 'com.esri.json.hadoop.EnclosedEsriJsonInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';


 

준비했던 hdfs에 업로드된 샘플 데이터를 로드합니다.
LOAD DATA INPATH '/user/hive/demo/earthquake-data/earthquakes.csv' OVERWRITE INTO TABLE earthquakes;
LOAD DATA INPATH '/user/hive/demo/counties-data/california-counties.json' OVERWRITE INTO TABLE counties;



 

:: geospatial 데이터 조회


아래와 같이 UDF로 등록한 ST_Contains와 ST_Point를 사용한 쿼리를 실행하여 Los Angeles 지역에 발생한 지진 위치를 출력 합니다.

SELECT earthquakes.earthquake_date, earthquakes.longitude, earthquakes.latitude FROM counties
JOIN earthquakes
WHERE ST_Contains(counties.boundaryshape, ST_Point(earthquakes.longitude, earthquakes.latitude))
AND counties.name='Los Angeles'
ORDER BY earthquakes.earthquake_date desc;




 

위의 쿼리를 Hue에서도 동일하게 hive 조회하면 아래와 같이 간단하게 차트로도 보실 수 있습니다.



 

 




마무리






이상으로 EMR의 hive에서 geospatial 데이터를 조회해 보았습니다.