일반 Apache Arrow 리뷰

코난(김대우) 2021.10.05 17:22 Views : 2046

Apache Arrow 리뷰

Spark을 보면서 몇번 나온 Apache Arrow를 잠시 시간 내어 정리.

 

- Apache Arrow란 무엇인가?

- Arrow를 어떤 용도로 사용하는가?

- Arrow가 저장되는 구조

- Python으로 Arrow 적용

 

Apache Arrow란 무엇인가?

Apache Arrow는 프로그래밍 언어 독립적인 컬럼기반(Columnar) 메모리 포맷으로, 테이블 구조 데이터와 계층형 데이터를 정의하며, CPU나 GPU 등 현대적인 하드웨어에서 효율적인 분석 작업을 목표.

Apache Arrow defines a language-independent columnar memory format for flat and hierarchical data, organized for efficient analytic operations on modern hardware like CPUs and GPUs.

Apache Arrow | Apache Arrow

 

주의 깊게 볼 부분으로 columnar 메모리 포맷 부분이다. 일반적으로 우리가 사용하는 columnar 데이터베이스와 구조와 마찬가지로, 통계적인 집계나 대규모 컬럼의 데이터에 대한 처리에 적합한 메모리 구조로, 태생부터 대용량 데이터 처리를 목표로 생긴 녀석이라고 보면 이후 과정이 쉽게 이해되었다.

 

Introduction-to-Apache-Arrow.png

출처 : Apache Arrow Tutorial for Beginners - Tutorial And Example

 

추가적으로, "프로그래밍 언어 독립적"에서 보는 것처럼, C나C++부터 JAVA, Python, 등의 거의 대부분 언어를 지원해 Client SDK를 이용해 손쉬운 개발이 가능하고, Columnar 유관 여러 플랫폼이나 서비스에서 거의 모두 호환된다.

바꿔 말하자면, Arrow 포맷만 지원하면, 데이터 변환을 할 필요가 없다. 특히 대규모 데이터 분석 작업에서 변환 문제만 해결되어도 많은 시간을 절약할 수 있다.

 

Arrow를 어떤 용도로 사용하는가?

위의 포맷에서 유추할 수 있는 것처럼 대부분의 분석 서비스나 Columnar 기반 서비스, 플랫폼에서 이용 가능하다.

조금 더 use case를 살펴보면, 아래와 같다.

- SQL execution engines (like Drill and Impala)
- Data analysis systems (as such Pandas and Spark)
- Streaming and queuing systems (like as Kafka and Storm)
- Storage systems (like Parquet, Kudu, Cassandra, and HBase).

 

특히, Apache Spark의 성장과 함께, Arrow 역시 많은 성장을 했으며, Spark의 데이터셋으로 in-memory 대규모 데이터 처리에서 사용된다.

 

Arrow가 저장되는 구조

Arrow에 대해서 어느정도 사용성에 대해서 이해되었다.

그렇다면, Arrow는 어떤 구조로 "in-memory columnar" 구조를 가지고 사용되는 것일까?

아래의 Arrow memory buffer 구조 이미지를 참고하면 도움이 될 것이다.

arrow-memory.png

 

Memory의 IO를 줄이고 분석 처리시 높은 성능을 끌어낼 수 있다.

대부분의 OLTP 시스템과 같이 row 기반 작업이 아닌, OLAP이나 분석 서비스는 fact 테이블 등에 대해서 full scan하여 집계된 결과를 BI로 이용하게 된다. 예를 들어, "지난 5년간 전체 매출을 지역별, 지점별로 grouping 해서 결과를 보여줘" 라는 처리이다. 이러한 대규모 데이터 분석 과정에서 좋은 효과를 얻을 수 있다.

 

참고링크 : Arrow Columnar Format — Apache Arrow v5.0.0

 

Python으로 Arrow 적용

간략히, Python으로 처리 예제 코드

# install pyarrow
# conda install -c conda-forge pyarrow
# or pip install pyarrow

# Converting Pandas Dataframe to Apache Arrow Table
import numpy as np
import pandas as pd
import pyarrow as pa

df = pd.DataFrame({'one': [20, np.nan, 2.5],'two': ['january', 'february', 'march'],'three': [True, False, True]},index=list('abc'))
table = pa.Table.from_pandas(df)

# Pyarrow Table to Pandas Data Frame
df_new = table.to_pandas()

 

관련자료 링크 : A gentle introduction to Apache Arrow with Apache Spark and Pandas | by Antonio Cachuan | Towards Data Science

 

PyArrow 관련 추가 리뷰 notebook은 CloudBreadPaPa/pyspark-basic: pyspark basic self-study repo (github.com) 링크에서 확인 가능

 

참고링크

Apache Arrow Tutorial for Beginners - Tutorial And Example

Apache Arrow in PySpark — PySpark 3.1.2 documentation

PySpark Usage Guide for Pandas with Apache Arrow - Spark 3.0.1 Documentation

 

 

 

No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 33590
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 16947
118 오픈소스 소통을 위한 Git 공부하기 | ep6. 내 저장소에 소스를 푸시하기 위한 Fork | 애저 듣고보는 잡학지식 코난(김대우) 2022.11.02 74
117 오픈소스 소통을 위한 Git 공부하기 | ep5. 브랜치 (Branch) 이해하기 | 애저 듣고보는 잡학지식 코난(김대우) 2022.11.01 45
116 오픈소스 소통을 위한 Git 공부하기 | ep4. 변경 단위를 만들기 위한 Commit | 애저 듣고보는 잡학지식 코난(김대우) 2022.10.31 43
115 오픈소스 소통을 위한 Git 공부하기 | ep3. 소스를 가져오기 위한 Clone | 애저 듣고보는 잡학지식 코난(김대우) 2022.10.30 57
114 오픈소스 소통을 위한 Git 공부하기 | ep2. Git를 소개합니다 | 애저 듣고보는 잡학지식 코난(김대우) 2022.10.28 52
113 오픈소스 소통을 위한 Git 공부하기 | ep1. 버전 관리의 중요성 | 애저 듣고보는 잡학지식 코난(김대우) 2022.10.27 55
112 오픈소스 소통을 위한 Git 공부하기 | ep0. 인트로 | 애저 듣고보는 잡학지식 코난(김대우) 2022.10.24 110
111 Azure VM - 오픈소스 ROS Gazebo Web 설치 및 실행 file 코난(김대우) 2022.10.19 153
110 parquet 파일의 meta 정보 추출 코난(김대우) 2021.11.16 1127
109 embedded SQL - GlueSQL, rust 기반 오픈소스 프로젝트 file 코난(김대우) 2021.10.22 453
108 대규모 머신러닝 프로젝트 Serving에 사용되는 Python WAS, ASGI - uvicorn file 코난(김대우) 2021.10.06 1006
» Apache Arrow 리뷰 file 코난(김대우) 2021.10.05 2046
106 autopep8을 이용한 python 린트(linting) 구현 코난(김대우) 2021.09.15 684
105 Python에서 환경변수(environment variable) 처리 코난(김대우) 2021.09.15 252
104 Python에서 random 문자열이나 숫자 가져오는 방법 코난(김대우) 2021.09.15 963
103 Python 중급 강좌 - 9. 비동기 작업(Asynchronous operations): asyncio 코난(김대우) 2021.01.03 760
102 Python 중급 강좌 - 8. 외부 리소스 관리(Managing external resources): with 코난(김대우) 2021.01.03 419
101 Python 중급 강좌 - 7. 파일작업(File read/write) file 코난(김대우) 2021.01.03 1419
100 Python 중급 강좌 - 6. 파일시스템(File system) 관리 코난(김대우) 2021.01.03 667
99 Python 중급 강좌 - 5. 다중상속(Mixins - multiple inheritance) 코난(김대우) 2021.01.03 492





XE Login