Apache Arrow 25.0: SVE 동적 디스패치·Feather V1 정리·Flight SQL 결과셋 시그널·IPC 단일화로 컬럼형 생태계를 정비하는 방법
요약
Apache Arrow 25.0.0이 2026년 7월 10일에 출시됐다. 66명 기여자의 268개 커밋으로 완성된 이 릴리스는 3개월이 넘는 개발 기간 동안 222개 이슈를 해결했다. 8월 10일에는 25.0.1 패치가 따라왔다.
핵심 변화는 네 가지다.
- SVE 동적 디스패치 — ARM64에서 런타임 CPU 감지 후 SVE 최적화 루틴으로 자동 전환한다.
- xsimd 통합 — 자체 제작 CPU 감지 코드를 xsimd 라이브러리로 대체, 벡터 코드 이식성이 개선됐다.
- Feather V1 완전 폐기 신호 — Feather V1 읽기·쓰기에
DeprecationWarning이 발생한다. V2는 무관. - Flight SQL 결과셋 시그널 — 준비된 SQL 구문이 결과셋을 반환하는지 서버가 명시적으로 클라이언트에 알릴 수 있다.
이 릴리스는 화려한 신기능보다 생태계 정합성에 초점을 맞춘다. Arrow 형식이 데이터 인프라의 공통 언어로 굳어지면서, 기존 임시방편들을 정리하고 표준 경로를 단일화하는 작업이 중요해졌다.
- 공식 블로그: https://arrow.apache.org/blog/2026/07/10/25.0.0-release/
- 25.0.1 패치 블로그: https://arrow.apache.org/blog/2026/08/10/25.0.1-release/
Apache Arrow의 역할: 왜 이 릴리스가 의미 있나
Arrow는 특정 데이터베이스 제품이 아니다. 인메모리 컬럼형 포맷의 표준이자, 그 표준을 구현하는 다언어 라이브러리다.
Arrow 릴리스는 Spark나 DuckDB 릴리스와 다르다. 사용자가 직접 느끼는 API 변화는 적지만, 아래에 흐르는 데이터 이동 비용, 벡터 연산 성능, 드라이버 인터페이스의 정확성이 달라진다.
1. C++: SVE 동적 디스패치와 xsimd
ARM64 SVE 동적 디스패치
ARM64 SIMD의 발전 경로는 NEON → SVE → SVE2다. 기존 Arrow C++는 컴파일 타임에 NEON 최적화 루틴을 선택했다. SVE를 지원하는 ARM CPU(AWS Graviton 3+, Apple M-시리즈 일부, Ampere Altra Max)가 늘었지만, SVE 루틴을 쓰려면 SVE 전용으로 빌드해야 했다.
Arrow 25.0은 런타임 CPU 기능 감지 후 SVE 루틴으로 자동 전환하는 동적 디스패치를 추가했다.
컴파일 결과물에 두 경로가 공존
┌─ NEON 루틴 (모든 ARM64 실행 가능)
└─ SVE 루틴 (SVE 지원 CPU에서 선택)
런타임:
if (cpu_has_sve()) → SVE 루틴
else → NEON 루틴운영 영향: 동일한 Arrow 바이너리가 Graviton 2와 Graviton 3에서 다른 루틴을 사용한다. 컨테이너 이미지를 CPU 세대별로 분리할 필요가 없다.
xsimd로 CPU 감지 통일
Arrow C++는 내부적으로 자체 제작 CPU 기능 감지 코드를 사용해 왔다. 이를 xsimd 라이브러리로 대체했다. xsimd는 x86(SSE/AVX/AVX-512), ARM(NEON/SVE), WASM SIMD를 모두 커버하는 C++ 헤더 라이브러리다.
결과적으로:
- CPU 감지 코드의 버그 수정과 새 플랫폼 지원이 xsimd upstream으로 집중된다.
- Arrow 내부 벡터 컴퓨트 코드가 xsimd 추상화를 재사용할 수 있다.
2. Feather V1 폐기: 이제는 IPC 하나로
Feather 형식의 역사
| 버전 | 시기 | 내부 포맷 | 상태 |
|---|---|---|---|
| Feather V1 | 2016년 R+Python 데이터 교환 | 자체 컬럼형 바이너리 | 25.0: DeprecationWarning |
| Feather V2 | Arrow IPC 파일 포맷 alias | Arrow IPC 완전 동일 | 현재·권장·경고 없음 |
Feather V2는 실질적으로 pa.ipc.write_feather() = pa.ipc.new_file() 래퍼다. 두 함수가 동일한 Arrow IPC 파일을 생성한다. 반면 V1은 Arrow 이전 시대의 별도 포맷이었다.
25.0 변경 사항
# Feather V1 쓰기 → DeprecationWarning (25.0)
pyarrow.feather.write_feather(table, "data.feather", version=1)
# DeprecationWarning: Feather V1 write support is deprecated...
# Feather V2 쓰기 → 경고 없음 (계속 권장)
pyarrow.feather.write_feather(table, "data.feather", version=2)
# IPC로 직접 쓰기 (가장 명확한 경로)
with pyarrow.ipc.new_file("data.arrow", schema) as writer:
writer.write_table(table)25.0.1 수정: 경고 범위 좁힘
25.0.0에서는 V2 쓰기에도 FutureWarning이 발생하는 과잉 경고가 있었다. 25.0.1에서 V2는 경고에서 제외됐고, V1에만 DeprecationWarning(FutureWarning보다 낮은 심각도)이 남았다.
Polars 등 Arrow 기반 라이브러리들이 PyArrow 25가 V2 Feather API에도 경고를 뿌린다는 이슈를 빠르게 제기했고, 25.0.1이 한 달 안에 수정했다.
마이그레이션 기준:
- V1 파일을 읽기·쓰기하는 코드가 있다면 Arrow IPC API로 이전해야 한다.
- V2 기반 코드는 변경 없이 사용 가능하다.
3. Flight SQL: 결과셋 존재 여부 명시적 시그널
기존 문제
SQL 준비 구문(prepared statement)은 두 종류로 나뉜다.
- 결과셋 반환:
SELECT * FROM orders WHERE … - 결과셋 없음:
INSERT INTO logs (…) VALUES (…)
Flight SQL 클라이언트는 CreatePreparedStatement 요청을 보낸 뒤 서버 응답을 받을 때, 이 구문이 결과셋을 반환하는지 확신할 수 없었다. 실행해 봐야 알 수 있었다.
Arrow 25.0의 변경
ActionCreatePreparedStatementResult 메시지에 has_result_set 부울 필드가 추가됐다.
PreparedStatement 생성 응답 (Arrow 25.0 이후)
{
prepared_statement_handle: <바이트열>,
dataset_schema: <Arrow 스키마>, # 결과셋 있을 때
parameter_schema: <Arrow 스키마>, # 파라미터 있을 때
has_result_set: true | false ← 새로 추가
}운영 영향:
- 클라이언트가
has_result_set: false를 보면Execute단계에서 결과 스트림을 기다리지 않아도 된다. - DML 구문과 DDL 구문의 처리 경로를 클라이언트가 사전에 분기할 수 있다.
- Flight SQL을 DB 쿼리 레이어로 사용하는 DataFusion, Ballista, InfluxDB IOx 등에서 DML 처리 코드가 단순화된다.
4. Python: hypot 컴퓨트 커널과 OSFile 개선
hypot 컴퓨트 커널
C++ 컴퓨트 레이어에 hypot 함수가 추가됐고 PyArrow에서 직접 사용할 수 있다.
import pyarrow.compute as pc
import pyarrow as pa
x = pa.array([3.0, 5.0, 8.0])
y = pa.array([4.0, 12.0, 15.0])
result = pc.hypot(x, y)
# [5.0, 13.0, 17.0]벡터화된 유클리드 거리 계산의 기초 연산이다. 공간 데이터 처리나 ML 피처 엔지니어링 파이프라인에서 Pandas UDF 없이 Arrow 네이티브 계산이 가능해진다.
pa.OSFile 정수 파일 디스크립터 수용
import pyarrow as pa
# 기존: 문자열 경로만 가능
f = pa.OSFile("/path/to/file.arrow", "r")
# Arrow 25.0: 이미 열린 fd(int)도 가능
import os
fd = os.open("/path/to/file.arrow", os.O_RDONLY)
f = pa.OSFile(fd) # ← 새로 지원유닉스 파이프, 소켓 FD, 시스템에서 전달받은 FD를 Arrow IPC 리더에 직접 연결할 수 있다. 시스템 프로그래밍 맥락에서 Arrow를 사용하는 코드가 단순해진다.
5. ChunkedArray와 Table API 정비
ChunkedArray.ComputeLogicalNullCount
Array와 ArrayData에는 이미 ComputeLogicalNullCount() 메서드가 있었다. ChunkedArray에는 없어서 각 청크를 순회해 합산해야 했다. Arrow 25.0에서 통일됐다.
# Arrow 24.x
null_count = sum(chunk.null_count for chunk in chunked.chunks)
# Arrow 25.0
null_count = chunked.ComputeLogicalNullCount()Parquet 파일에서 읽은 데이터는 청크 단위로 ChunkedArray가 되는 경우가 많다. 데이터 품질 파이프라인에서 null 비율 계산이 한 줄로 줄어든다.
Table.ToTensor
RecordBatch에 있던 ToTensor() 메서드가 Table로 확장됐다.
# Arrow 25.0: Table → NumPy/ML 텐서 변환
table = pa.table({"x": [1.0, 2.0], "y": [3.0, 4.0]})
tensor = table.ToTensor()
# type(tensor) → pyarrow.Tensor (C-contiguous 2D float64)테이블 전체를 수치 텐서로 변환하는 공식 경로가 생겼다. PyTorch/JAX/TensorFlow로 넘기기 전 중간 단계 Pandas 변환을 생략할 수 있다.
6. 전체 변경 요약
운영 체크리스트
업그레이드 전 확인
# 1. Feather V1 사용 여부 점검
# 코드베이스에서 version=1 검색
import subprocess
result = subprocess.run(
["grep", "-r", "version=1", "--include=*.py", "."],
capture_output=True, text=True
)
print(result.stdout)
# 2. ChunkedArray null 집계 패턴 교체 검토
# 기존: sum(c.null_count for c in chunked.chunks)
# 신규: chunked.ComputeLogicalNullCount()
# 3. ARM64 배포 시 SVE 활성화 확인
# Graviton 3 (g.metal, r7g.metal)는 SVE 지원
# Arrow 25.0에서 별도 빌드 없이 자동 사용됨Feather V1 마이그레이션 스크립트
import pyarrow as pa
import pyarrow.feather as feather
import pyarrow.ipc as ipc
from pathlib import Path
def migrate_feather_v1_to_ipc(input_path: str, output_path: str) -> None:
"""Feather V1 파일을 Arrow IPC 파일로 변환"""
# V1도 pyarrow.feather.read_feather로 읽히지만 경고 발생
table = feather.read_feather(input_path)
with ipc.new_file(output_path, table.schema) as writer:
writer.write_table(table)
# 디렉터리 일괄 변환
for v1_file in Path("data/").glob("*.feather"):
ipc_file = v1_file.with_suffix(".arrow")
migrate_feather_v1_to_ipc(str(v1_file), str(ipc_file))
print(f"변환 완료: {v1_file} → {ipc_file}")Flight SQL has_result_set 활용 (Python 클라이언트)
from pyarrow import flight
client = flight.FlightClient("grpc://db-server:31337")
# Prepared Statement 생성
action = flight.Action(
"CreatePreparedStatement",
b'{"query": "INSERT INTO events VALUES (?, ?)"}',
)
results = client.do_action(action)
for result in results:
response = parse_prepared_statement_result(result.body)
if not response.has_result_set:
# DML: 스트림 불필요, 완료만 확인
execute_dml(client, response.handle, params)
else:
# SELECT: 결과 스트림 처리
for batch in execute_select(client, response.handle, params):
process_batch(batch)ADBC 1.1.0 현황
ADBC(Arrow Database Connectivity)는 Arrow를 네이티브로 전달하는 DB 드라이버 표준이다. 현재 스펙 버전은 1.1.0이며, 1.2 마일스톤은 더 풍부한 메타데이터와 카탈로그 기능에 집중한다.
Arrow 25.0 자체에 ADBC 스펙 변경은 없지만, Arrow C++와 Python 계층의 개선이 ADBC 구현체들에 그대로 흐른다. 특히 ComputeLogicalNullCount와 ToTensor는 ADBC 드라이버 계층의 데이터 검증 코드를 단순화하는 데 활용된다.
정리
Arrow 25.0은 기능 리스트로 보면 작은 릴리스다. 하지만 그 의미는 다르다.
SVE 동적 디스패치는 ARM64 인프라(Graviton, Ampere)에서 Arrow를 사용하는 데이터 파이프라인이 별도 빌드 없이 최신 SIMD 경로를 탈 수 있음을 뜻한다. Feather V1 폐기는 2016년에 만들어진 임시 교환 포맷의 역할이 끝났음을 공식화한다. Flight SQL의 has_result_set은 작은 필드지만, DML과 SELECT가 섞이는 분산 쿼리 레이어에서 클라이언트가 더 정확하게 동작하게 한다.
Arrow가 데이터 생태계의 공통어가 될수록, 이런 작은 정합성 개선의 파급 효과는 커진다. 하나의 Arrow 릴리스가 Polars, DuckDB, DataFusion, Spark, Flight SQL 클라이언트 전부에 영향을 미친다는 사실이 그 파급력을 보여준다.
References
- Apache Arrow 25.0.0 릴리스 블로그: https://arrow.apache.org/blog/2026/07/10/25.0.0-release/
- Apache Arrow 25.0.1 패치 블로그: https://arrow.apache.org/blog/2026/08/10/25.0.1-release/
- Apache Arrow 릴리스 목록: https://arrow.apache.org/release/
- Polars PyArrow 25 Feather 경고 이슈: https://github.com/pola-rs/polars/issues/28331
- Apache Arrow ADBC 문서: https://arrow.apache.org/docs/format/ADBC.html
- Flight SQL 프로토콜 스펙: https://arrow.apache.org/docs/format/FlightSql.html
- xsimd 라이브러리: https://github.com/xtensor-stack/xsimd
- Feather 파일 포맷 문서: https://arrow.apache.org/docs/python/feather.html