본문 바로가기

소프트웨어 이야기/데이터 저장소 + 시각화

[DB] 갈레라 클러스터의 특이한 점들 갈레라 클러스터를 사용하다가, 특이한 점을 발견했다.auto increment로 설정된 레코드의 ID값이 1씩 순차적으로 증가하는게 아니라,1, 3, 4, 6 이런식으로 불규칙하게 ID값이 증분하고 있었다.왜냐하면 갈레라 클러스터에 묶여있는 데이터베이스 서버들이 각각 다른 ID값을 생성하게 하기 위하여AUTO INCREMENT의 증분값이 클러스터의 노드마다 각각 다르다고 한다.이렇게 하는 이유는 모든 노드의 ID가 1씩 값이 증가한다면, ID가 컨플..
[DB] 갈레라 클러스터 주의사항 - 테이블 변경하기 갈레라 클러스터를 쓰고 있으면, 테이블 변경할때 마음의 준비를 좀 하고 DDL 명령문을 날려야한다.  경건하게 ALTER QUERY를 날려야한다 내가 지금 사용하고 있는 DDL 방식이 뭔지 확인해보고, 어떤 테이블들을 변경할건지, 서비스의 특성이 뭔지 등을 고려하여 테이블 변경 플랜을 짜야한다.갈레라 클러스터에서 DDL 을 처리하는 방법은 두가지가 있다. TOI 와 RSU 방식이다.Default  방식은 TOI 이..
[SPARK] 클러스터 환경 클러스터환경스파크는 여러 컴퓨터에 설치해놓고, 데이터 분석을 분산처리할 수 있게 해준다.스파크 클러스터 모델은 마스터 역할을 하는 드라이버 프로그램과 실제로 데이터 처리 역할을 하는 익스큐터로 구성되어있다. 마스터 서버에 설치되어있는 드라이버 프로그램이 여러 워커 노드 서버에 설치되있는 익스큐터들에게 데이터 연산 작업을 시키는 구조인거다.드라이버 프로그램은 스파크 컨텍스트를 생성하고 관리한다. 드라이버 프로그램에서 메인 함수를 실행하면, 워커 노드들..
[리서치]람다 아키텍처 람다 아키텍처람다 아키텍처란 실시간성 데이터를 처리하는 스피드레이어와 지난 데이터를 다루는 배치레이어를 별도로 두어서 실시간으로 대용량 데이터를 안정적으로 관리하는 방법론이다. 람다 아키텍처 공식 사이트 람다 아키텍처의 특성 - 시스템에 문제가 있어도, 전체적인 기능은 정상적으로 작동된다.- 다양한 종류의 작업에서도 잘 작동한다.- ​처리해야하는 양이 많아도 잘 버텨낸다.- 레이턴시가 짧다.- 확장성이 높..
[Spark]User Define Function spark에서 sql을 날릴 때, 사용자가 커스텀하게 만든 함수를 사용할 수 있게 하는 방법이 있다.SPARK의 UDFs ( User-Defined Functions ) 개념을 사용하면 된다.UDF는 우리가 피요한 새로운 컬럼 기반의 함수를 만들어준다. User Define Functions는 데이터셋을 가공해주는 Spark SQL DSL의 함수들을 확장시켜준다.아래처럼 쓰면 된다고 한다. udf 함수에 내가 정의한 함수의 파라미터..
[Spark]DataFrame을 S3에 CSV으로 저장하기 S3에 Dataframe을 CSV으로 저장하는 방법val peopleDfFile = spark.read.json("people.json") peopleDfFile.createOrReplaceTempView("people") val teenagersDf = spark.sql("SELECT name, age, address.city FROM people WHERE age >= 13 AND age <= 19") teenagersDf.coale..
[Spark] 여러개의 로그 파일 한번에 읽어오기 제플린 노트북에서 데이터 소스를 가져올 때, DataFrameReader Class를 주로 사용한다.아래의 코드 처럼, DataFrameReader의 함수들을 사용해서 구조화되어있는 파일을 읽어들이면 DataFrame을 리턴된다.spark.read.json("s3n://jimin-bucket/a/*") spark.read.parquet("s3n://jimin-bucket/a/*")그런데 파일을 하나하나 가져오기 보다는 여러 파일리스트를 한번에 가져오..
[Spark] S3에 파일이 존재하는지 확인하기 Zeppelin 노트북에서 데이터소스를 불러올 때, AWS S3에 올려둔 파일들을 가져다가 사용한다.그런데 만약 없는 파일을 읽어들이려고 하는 경우, 에러가 발생한다.만약 일자별로 쌓인 로그 파일을 한번에 가져와서 읽을 필요성이 있다고 생각해보자.val fileList = MutableList("s3n://jimin-bucket/folder1/20170202/*", "s3n://jimin-bucket/folder1..