LLM WikiAccess-protected knowledge portal
← 스터디 홈
145편 · 약 14분

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 패치가 따라왔다.

핵심 변화는 네 가지다.

  1. SVE 동적 디스패치 — ARM64에서 런타임 CPU 감지 후 SVE 최적화 루틴으로 자동 전환한다.
  2. xsimd 통합 — 자체 제작 CPU 감지 코드를 xsimd 라이브러리로 대체, 벡터 코드 이식성이 개선됐다.
  3. Feather V1 완전 폐기 신호 — Feather V1 읽기·쓰기에 DeprecationWarning이 발생한다. V2는 무관.
  4. 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는 특정 데이터베이스 제품이 아니다. 인메모리 컬럼형 포맷의 표준이자, 그 표준을 구현하는 다언어 라이브러리다.

Apache Arrow 생태계 역할 Pandas DataFrame Polars Lazy API DuckDB Zero-copy Spark Arrow-optimized DataFusion / Comet 네이티브 Arrow Apache Arrow 25.0 • 컬럼형 인메모리 포맷 (IPC/Feather V2) • Flight SQL 프로토콜 · ADBC 표준 Parquet 컬럼형 스토리지 ORC Hive 생태계 IPC (Feather V2) 네이티브 Arrow 직렬화 Flight SQL 네트워크 컬럼 전송 ADBC 1.1.0 DB 드라이버 표준 Arrow 25.0은 위 생태계 전체의 공통 기반이다. 어느 한 계층의 개선이 생태계 전체에 파급된다.
Apache 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 V12016년 R+Python 데이터 교환자체 컬럼형 바이너리25.0: DeprecationWarning
Feather V2Arrow IPC 파일 포맷 aliasArrow 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 처리 코드가 단순화된다.
Arrow 24.x 이전: 결과셋 여부 불명
CreatePreparedStatement 요청
핸들 수신 (has_result_set 없음)
Execute 호출
스트림 열기 시도 (DML이어도)
빈 스트림 수신 후 판단
Arrow 25.0 이후: 명시적 분기
CreatePreparedStatement 요청
핸들 + has_result_set 수신
has_result_set?
true → DoGet 스트림 열기
false → DML 완료 응답만 확인
Flight SQL 클라이언트 흐름 변화

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. 전체 변경 요약

C++ 레이어
SVE 동적 디스패치 (ARM64)
xsimd CPU 감지 통합
ChunkedArray.ComputeLogicalNullCount
Table.ToTensor
Python 레이어
hypot 컴퓨트 커널
pa.OSFile(int fd) 지원
Feather V1 DeprecationWarning
Flight SQL 프로토콜
has_result_set 필드 추가
ODBC 드라이버 Flight SQL 진행 중
25.0.1 패치 (2026-08-10)
Feather V2 경고 제거 (과잉 경고 수정)
V1 경고를 FutureWarning → DeprecationWarning으로 완화
Arrow 25.0 변경 요약 맵

운영 체크리스트

업그레이드 전 확인

# 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 구현체들에 그대로 흐른다. 특히 ComputeLogicalNullCountToTensor는 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