데이터 엔지니어링 정복/Spark
[PySpark3] UserWarning: 'PYARROW_IGNORE_TIMEZONE' environment variable was not set. It is required to set this environment variable to '1' in both driver and executor sides if you use pyarrow>=2.0.0. pandas-on-Spark will set it for you but it does not wor
noohhee
2025. 5. 26. 18:41
728x90
반응형
PyArrow는 내부적으로 timestamp를 엄격하게 처리한다.
근데 Spark와 Pandas는 보통 timezone정보가 없는 naive timestamp를 쓴다.
여기서 naive timestamp는 "2025-05-26 14:00:00"이런 값을 의미한다.
pyarrow에서 사용하는 timestamp는 시간대 정보가 포함된 값을 의미한다.
2025-05-26 09:37:07.223083+00:00
그래서 pyarrow와 pandas-on-spark를 같이 사용하면 타임스탬프를 처리하는 과정에서 에러가 발생할 확률이 높다.
따라서 미리 Pyarrow에서 pandas-on-spark 가 사용하는 타임스탬프로 맞춰주기 위해 환경변수를 드라이버와 익스큐터들에게 정의해줘야 한다.
근데 이 설정은 스파크 옵션으로 미리 설정이 안되고 무조건 서버단에서 export로 정의하거나 python 실행후 os.environ으로 설정해줘야 한다.
따라서 아래 파이썬 코드를 실행한다.
import os os.environ["PYARROW_IGNORE_TIMEZONE"] = "1" |
추가로 livy를 사용중이라면 livy-env.sh에 환경변수를 추가해줘야 한다.
그리고 추가로 pandas <-> spark dataframe을 변환하는 작업도 있다면 아래 설정도 추가해준다.
spark.sql.execution.arrow.pyspark.enabled=true --conf spark.sql.execution.arrow.pyspark.enabled=true |
동작 Arrow 미사용 Arrow 사용
toPandas() 20초 3초
createDataFrame() 15초 2초
추가적으로 만약 주피터 커널을 직접 사용중이라면 아래처럼 주피터 커널파일인 kernel.json에 추가해준다.
# cat kernel.json { "argv": [ "/mypython/py38-16/bin/python3", "-m", "ipykernel_launcher", "-f", "{connection_file}" ], "display_name": "Public_Spark3(Python3.8)", "language": "python", "env": { "PYSPARK_PYTHON": " /mypython/py38-16/bin/python3 ", "SPARK_HOME": "/usr/spark3-client", "HADOOP_CONF_DIR":"/etc/hadoop/conf", "PYTHONPATH": "/usr/spark3-client/python/lib/py4j-0.10.9.7-src.zip:/usr/spark3-client/python/:", "PYTHONSTARTUP": "/usr/spark3-client/python/pyspark/shell.py", "PYARROW_IGNORE_TIMEZONE": "1", "PYSPARK_SUBMIT_ARGS": "--master yarn --driver-memory 4g pyspark-shell" } } |
728x90
반응형