본문 바로가기

[Apache Hudi] 2. 파일 구조 Apache hudi는 DFS에 파일 형태로 저장된다. 테이블 타입에 따라 parquet 파일로만 저장이 되기도하고, parquet + avro로 저장이 되기도 하는데, 먼저 DFS에 어떠한 구조로 저장이 되는지, 각 파일은 어떠한 형태를 띄는지 정리해보도록 하자. BasePath Hudi Table의 데이터가 저장되는 root path이다. 해당 경로 하위로 각종 메타 디렉토리, 파티션 디렉토리등이 생성이 된다. public class InsertDataApp { private static final String tableName= "hudi_trips_cow"; private static final String basePath = "file:///tmp/hudi_trips_cow"; //테스트로 로컬..
[Apache hudi] 1. hudi란 무엇일까? Apache Huid에 대해 POC할 기회가 생겨 잊어버리지 않도록 블로그에 정리해보고자 한다. 1. Hudi란 무엇일까? Apache Hudi는 DFS(hadoop hdfs 또는 Cloud Storage)를 기반으로 대량의 분석데이터를 저장하고, 관리할수 있는 스토리지이다. Hudi는 스트림을 통해서 실시간 데이터를 가져올수도 있고, 전통적인 batch 프로세싱으로 데이터를 저장할 수도 있다. Hudi가 처음이라면 위의 글이 잘 와닿지 않을것이다. 스트리밍으로 데이터를 가져와서 저장하는게 특이한것도 아니고, 배치로 데이터를 저장하는것 또한 마찬가지이기 때문이다. 다만 인입되는 데이터의 사이즈가 아주 크고, Daily가 아닌 더 짧은 주기로 데이터를 분석하기 위해 스트리밍으로 데이터를 싱크해야한다면,그리..
[Spring] Hadoop Kerberos 티켓 갱신 실패 시 해결방법(javax.security.sasl.SaslException: GSS initiate failed) 스프링 프로젝트에서 커버로스 인증을 통한 hdfs에 접근하려면 org.apache.hadoop.security.UserGroupInformation.loginUserFromKeytab 을 이용하여 커버로스 티켓을 생성할 수 있다. @Configuration class HadoopConfig { @Bean public org.apache.hadoop.conf.Configuration hadoopConfig() { Configuration conf = new Configuration(); UserGroupInformation.setConfiguration(conf); UserGroupInformation.loginUserFromKeytab(kerberosUser, keytabPath); return conf..
[Kafka] 자주사용하는 Kafka 커맨드 1. __consumer_offsets 토픽에서 offset 정보 읽기 $ echo "exclude.internal.topics=false" > /tmp/consumer.config $ kafka-console-consumer \ --consumer.config /tmp/consumer.config \ --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" \ --bootstrap-server localhost:9092 \ --topic __consumer_offsets \ --from-beginning 2. 카프카 데이터 읽기(console-kafka-consumer) : ' --topic: 토픽명 --boo..
[Spark] SparkContext.addFile 과 --files 의 차이점 (Spark on YARN) Spark 에서 외부데이터를 불러와 처리할 때 코드 상에 SparkContext.addFile 메소드를 호출하거나, spark-submit시 --files 파라미터를 이용하여 외부데이터를 읽어와 처리할 수 있다. 이때 두가지 방법이 서로 동작하는 방식이 달라 YARN에 cluster 모드로 실행시 파일을 읽는 방법이 달라지는데, 이에 대해 정리해보고자 한다. SparkContext.addFile 공식 문서에 따르면 local file, HDFS 뿐 아니라 HTTP, HTTPS, FTP까지 지정하여 사용할 수 있다고 한다. //add file SparkSession spark = SparkSession.builder().getOrCreate(); spark.sparkContext().addFile("htt..
[Kudu] pyspark with kudu python 3.8 kudu 1.10.0 1. pyspark Installation $ pip install pyspark==2.3.3 //https://mvnrepository.com/artifact/org.apache.kudu/kudu-spark2 에서 kudu버전에 맞는 jar 다운로드 후 로컬에 저장 $ wget https://repo1.maven.org/maven2/org/apache/kudu/kudu-spark2_2.11/1.10.0/kudu-spark2_2.11-1.10.0.jar 2. read & write with spark from pyspark.sql import * spark = SparkSession.builder.appName("KuduExample").getOrCreate() ..
[암/복호화] AES128을 이용한 Java와 Python 간 암/복호화 같은 언어끼리 암/복호화를 하는 경우는 몇번 경험을 해보았지만, 언어가 다른 환경에서 암/복호화 하는것은 많은 경험이 없어 이것에 대해 글을 남겨보려고 한다. 0. 환경 Java 1.8 Python 3.7 pycrypto==2.6.1 암호화방식: AES128 1. Python에서의 암/복호화 ## aes128_crypto.py import base64 from Crypto import Random from Crypto.Cipher import AES class AES128Crypto: def __init__(self, encrypt_key): self.BS = AES.block_size ##암호화 키중 16자리만 잘라서 쓴다. self.encrypt_key = encrypt_key[:16].encode(..
[Airflow] Trouble Shooting 1. webserver에서 "Some workers seem to have died and gunicorn did not restart them as expected" 에러 발생하며 웹페이지가 보여지지 않을때 원인: webserver에 메모리 부족으로 인하여 gunicorn worker가 kill 됨 해결책: airflow.cfg 의 [webserver] 섹션에 workers 의 갯수를 줄인다(default 4). 혹은 도커 컨테이너 생성시 environment에 AIRFLOW__WEBSERVER__WORKERS를 지정한다. webserver의 사용 메모리를 키운다. 필자는 docker-compose를 이용하여 airflow 환경을 구성중이다. 이때 mem_limit을 이용하여 메모리를 조절할 수 있다...