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.
주의 깊게 볼 부분으로 columnar 메모리 포맷 부분이다. 일반적으로 우리가 사용하는 columnar 데이터베이스와 구조와 마찬가지로, 통계적인 집계나 대규모 컬럼의 데이터에 대한 처리에 적합한 메모리 구조로, 태생부터 대용량 데이터 처리를 목표로 생긴 녀석이라고 보면 이후 과정이 쉽게 이해되었다.
출처 : 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 구조 이미지를 참고하면 도움이 될 것이다.
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()
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