태그 Archives: bigdata

python – apache pyarrow 를 이용한 parquet 생성 및 테스트

apache 재단에서 진행 되는 프로젝트 이다. python, java, R 등등 많은 언어를 지원 한다.

CSV (Comma-Separated Values)의 가로열 방식의 데이터 기록이 아닌 세로열 기록 방식으로 기존 가로열 방식에서 불가능한 영역을 처리가 가능하도록 한다.

2020-12-24_135314

이미지 출처: 훈민정음 나무위키

 

차이점을 그림으로 표현하자면 아래와 같다.

2020-12-28_090730

문서를 모두 읽는다 에서는 큰 차이가 발생하지 않지만 구조적으로 모든 행이 색인(index) 처리가 된 것처럼 파일을 읽을 수 있다.

sql 문으로 가정으로 “(SELECT * FROM 테이블 WHERE 재질 = ‘철’)” 을 찾게 될 경우 index 가 둘다 없다는 가정하에서

CSV 는 9개의 칸을 읽어야 하지만 (재질->무게->산화->나무->가벼워->탄다->철->무거워->안탄다->return)

parquet 의 경우 5개의 칸만 읽으면 된다. (재질->나무->철->무거워->안탄다->return)

압축을 하더라도 컬럼별 압축이 되기 때문에 필요한 내용만 읽어서 압축해제 하여 데이터를 리턴 한다.

 

적당한 TSV (Tab-Separated Values)데이터를 준비 한다.

2020-12-24_145706

 

python 을 이용하여 TSV 파일을 읽고 python 의 pyarrow를 이용하여 parquet 파일을 생성 하고 읽는 테스트를 한다. (pyarrow, pandas 는 pip install pyarrow pandas 으로 설치할 수 있다.)

 

TSV -> parquet 압축률(높을수록 좋음) 및 처리 시간(낮을수록 좋음)

 defextMBcompress ratioprocessing time
python 2.7
processing time
python 3.6
txt.txt58.8 MB
gzip.txt.gz16.3 MB72%3.24 sec
pyarrowwrite_table,
compression='none'
.parquet
40.1 MB32%0.74 sec0.93 sec
write_table,
compression='snappy'
24.8 MB58%1.31 sec 0.95 sec
write_table,
compression='lz4'
24.7 MB58%0.79 sec0.94 sec
write_table,
compression='zstd'
19.3 MB67%1.00 sec0.98 sec
write_table,
compression='gzip'
18.8 MB68%5.07 sec1.18 sec

읽기/쓰기 테스트 모두 AWS – EC2(m5.large-centos7) – gp2(100GB) 에서 진행 하였다.

 

parquet 을 생성한 이유는 파일을 읽을때 모든 컬럼인 index가 걸려있는것과 같이 빠르게 읽기 위함이니 읽기 테스트도 해본다.

 

TSV, parquet 파일 읽기 테스트 (pandas, pyarrow)

 defextMBprocessing time
python 2.7
processing time
python 3.6
pandasread_csv.txt58.8 MB1.39 sec1.56 sec
read_csv,
compression='gzip'
.txt.gz16.3 MB1.68 sec2.06 sec
read_parquet.parquet
(none)
40.1 MB0.72 sec0.93 sec
.parquet
(snappy)
24.8 MB1.03 sec0.95 sec
.parquet
(lz4)
24.7 MB0.73 sec0.94 sec
.parquet
(zstd)
19.3 MB0.76 sec0.95 sec
.parquet
(gzip)
18.8 MB0.96 sec1.18 sec
pyarrowread_csv,
to_pandas
.txt58.8 MB1.01 sec1.30 sec
.txt.gz16.3 MB1.41 sec1.37 sec
read_table,
to_pandas
.parquet
(none)
40.1 MB0.69 sec0.90 sec
.parquet
(snappy)
24.8 MB0.99 sec0.89 sec
.parquet
(lz4)
24.7 MB0.69 sec0.92 sec
.parquet
(zstd)
19.3 MB0.75 sec0.95 sec
.parquet
(gzip)
18.8 MB0.95 sec1.22sec

 

이 문서 처음에 언급 했다 시피 대용량 파일을 처리 하기 위함. 즉 “빅데이터”(HIVE, Presto, Spark, AWS-athena)환경을  위한 포멧이다.

모두 테스트 해보면 좋겠지만 아직 실력이 부족해서 AWS athena 만 테스트를 진행 한다.

구조적으로 S3 버킷에 parquet 파일을 넣어 두고 athena 에서 테이블을(S3 디렉토리 연결) 생성 하여 SQL 문으로 검색을 하는데 사용 한다.

 

TSV, parquet 파일 읽기 테스트 (AWS – athena)

 ROW FORMAT SERDEextSearched
MB
processing time
(select target 2)
processing time
(select target 50)
athenaorg.apache.hadoop.hive.
serde2.lazy.
LazySimpleSerDe
.txt58.8 MB1.17 ~ 3.35 sec1.86 ~ 2.68 sec
.txt.gz16.3 MB1.37 ~ 1.49 sec1.44 ~ 2.69 sec
org.apache.hadoop.hive.
ql.io.parquet.serde.
ParquetHiveSerDe
.txt.parquet10.48 MB1.11 ~ 1.49 sec1.00 ~ 1.38 sec
.snappy.parquet4.71 MB0.90 ~ 2.36 sec0.90 ~ 1.00 sec
지원 불가.lz4.parquet지원 불가
.zstd.parquet
org.apache.hadoop.hive.
ql.io.parquet.serde.
ParquetHiveSerDe
.gzip.parquet2.76 MB0.89 ~ 1.17 sec0.90 ~ 1.85 sec

읽는 속도가 향상되었고 스캔 크기가 적게 나온다. (parquet 의 강점을 보여주는 테스트)

 

athena 테이블 생성에 사용된 쿼리문 (TSV, parquet)

 

PS. 이건 저도 어려 웠어요…..

graylog 를 통한 syslog 통합 감사(audit)

graylog 는 syslog 처리를 위한 빅데이터 분석 솔루션이다. 기본적으로야 syslog 를 한곳에 적재하여 로그 감사를 하는 목적으로 사용한다.

물론 syslog 뿐만 아니라 웹로그등을 수집하여 분석하는것 역시 가능하다.

Mongodb + elasticsearch + java 를 사용하여 운영 되며 노드를 추가하여 다중 노드에서의 분석 처리가 가능하다.

2018-05-18_111423 위와 같이 대쉬보드를 만들어 한눈에 볼수 있으며 alert 설정을 통해 중요 특정한 이벤트 발생시 손쉬운 확인이 가능 하다.

graylog 의 권장 사항은 4GB의 램을 필요로 하나 구축테스트를 해본 결과 1GB 에 2GB 수준의 swap 으로 정상적인 운영이 가능했다.

오픈소스이기 때문에 유료 프로그램인 kiwi syslog의 라이선스 비용 대비 40% 수준이면 클라우드에 구축하여 운영할 수 있다.
(t2.micro / 1 core – 1GB RAM) CentOS7 에서 graylog 를 설치 하는 방법을 설명한다.

 

1. 가상 서버를 준비하고 기본적인 업데이트 및 hostname 지정 등을 한 뒤에 리부팅 한다.

 

2. 시스템 메모리 및 네트워크 튜닝값을 적용 한다.

 

3.  swap 을 생성한다.(aws-centos7 의경우 swap 설정되어 있지 않다.)

  • 프로그램 초기 설치시 selinux 충돌을 방지 하기 위해 임의 setenforce 0 명령어로 selinux 를 permissive 모드로 변경 후 진행 한다.

  • 재부팅 후에 swap 이 자동 적용 될수 있게 fstab 을 수정한다. ~]# vi /etc/fstab

 

4. elasticsearch 설치

 

5. mongodb 설치

 

6. mongodb 설정

  • mongdb 의 data 파일을 /free/mongo_data 에 적재할 예정 이기 때문에 conf 파일을 수정 하고 selinux 설정을 추가 한다.

 

7. graylog 설치

 

8. graylog 설정

  • conf 파일을 수정하기 전에 pwgen 을 이용하여 secret 값을 생성 하고 shasum 을 이용하여 관리자 패스워드 값을 생성한다.

~]# vi /etc/graylog/server/server.conf     ## 각 값을 찾아서 수정한다.

 

9. graylog 시작 및 systemd 등록

 

10. nginx 설치

  • 여기서는 손쉬운 http/2 구축과 brotli 이미지 압축 등을 위해 codeit – nginx 을 설치 한다.

 

11. nginx 설정

  • DH 파라메터파일을 생성 한다.

  • /etc/nginx/nginx.conf 파일을 수정한다.

  • /etc/nginx/conf.d/default.conf 파일을 수정한다.

 

12. let’s encrypt 를 이용하여 인증서 발급을 진행하였음.  ( https://www.enteroa.com/2016/03/12/lets-encrypt-설치-및-운용centos )

  • nginx 에서 location 으로 let’s encrypt 설정을 /var/www 으로 했기 때문에 아래와 같은 명령어로 인증서 발급이 가능 하다.

 

13. selinux 설정

 

14. graylog 설정

  • graylog 서비스가 모두 정상적이라면 웹접근을 통해서 로그인을 할 수 있다. 2018-05-18_140231
  • 로그인 한 뒤에 먼저 대시보드를 생성한다.
    2018-05-18_142706
  • 이후 input 생성을 하기위해 아래와 같이 설정 진행을 한다. 2018-05-18_140445
  • 기본적으로 아래 다섯 항목을 설정 한다.
    2018-05-18_140416
  • 설정을 하게 되면 input 이 생성되고 곧 running 상태가 된다.2018-05-18_141255

 

15. linux – rsyslog 설정 (UDP 설정)

  • ~]# /etc/rsyslog.conf 파일의 맨밑에 삽입 한다. ( @=UDP / @@=TCP )

  • rsyslog 을 재시작 한다.

 

16.  생성된 input 의 show recived messages 버튼으로 이동하면 아래와 같은 화면을 볼 수 있다. (검색 화면과 같다.)

  • 검색 일자를 선택하고 대쉬보드 추가를 할 수 있다.
    2018-05-18_143141

 

17. L3 – syslog 설정 (cisco)

  • cisco 스위치의 경우 input 생성을 할때 RAW/Plaintest UDP 를 선택해서 진행해야 한다. ( RFC3414 표준이 아님 )
  • 아울러 스위치는 일반적으로 분배의 목적으로 한개의 gateway 밑에 존재하므로 각 스위치마다 별도의 input 을 만든다
  • input 을 만들때 override source 옵션을 통해 특정된 port 에 들어온 메세지의 소스 호스트 네임을 알기 쉽도록 Office-L3 와 같이 설정한다.
  • 일반적인 switch 장비의 log 설정 방법은 아래와 같다.