Доступ к каталогу данных AWS: таблицы Iceberg и не Iceberg из локальной сессии Spark

Вопросы и ответы

Я хочу считывать данные из таблиц AWS Data Catalog (Iceberg и Non-Iceberg) из кода pyspark в локальной среде. Я соответствующим образом настроил SparkSession. Хотя я могу получить доступ к таблицам Iceberg локально, таблицы Non-Iceberg не отображаются.

spark = SparkSession.builder.config("spark.hadoop.fs.s3a.access.key", os.getenv('AWS_ACCESS_KEY_ID')) \
            .config("spark.hadoop.fs.s3a.secret.key", os.getenv('AWS_SECRET_ACCESS_KEY')) \
            .config("spark.hadoop.fs.s3a.session.token", os.getenv('AWS_SESSION_TOKEN')) \
            .config("spark.hadoop.fs.s3a.endpoint", f"s3.{os.getenv('AWS_REGION')}.amazonaws.com") \
            .config("spark.hadoop.fs.s3a.region", os.getenv('AWS_REGION')) \
            .config("spark.jars.packages", "org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.6.0,org.apache.hadoop:hadoop-aws:3.3.4,com.amazonaws:aws-java-sdk-bundle:1.11.874,software.amazon.awssdk:bundle:2.27.2,software.amazon.awssdk:metrics-spi:2.27.2,software.amazon.awssdk:s3:2.27.2,software.amazon.awssdk:glue:2.27.2") \
            .config('spark.sql.catalog.glue_catalog', 'org.apache.iceberg.spark.SparkCatalog') \
            .config('spark.sql.catalog.glue_catalog.catalog-impl', 'org.apache.iceberg.aws.glue.GlueCatalog') \
            .config('spark.sql.iceberg.handle-timestamp-without-timezone', 'true') \
            .config('spark.sql.catalog.glue_catalog.warehouse', 's3://glue/datalake/') \
            .config('spark.sql.extensions','org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions')\
            .config('spark.sql.catalog.glue_catalog.io-impl', 'org.apache.iceberg.aws.s3.S3FileIO') \
            .config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") \
            .config("spark.hadoop.fs.defaultFS", "s3://glue") \
            .enableHiveSupport() \
            .getOrCreate()

Для таблиц Non-Iceberg я получаю следующую ошибку: [TABLE_OR_VIEW_NOT_FOUND].

Если вы могли бы уделить этому внимание и помочь решить проблему.

Я надеюсь иметь возможность получить доступ как к таблицам Iceberg, так и к таблицам Non-Iceberg с использованием одной и той же сессии Spark в моей локальной среде.

Ответ

Для доступа к таблицам AWS Data Catalog (как Iceberg, так и не Iceberg) из локальной сессии PySpark, нужно убедиться, что конфигурация SparkSession правильно настроена для работы с Glue Catalog. Ваш код выглядит хорошо, но есть несколько моментов, которые стоит учесть, чтобы устранить ошибку [TABLE_OR_VIEW_NOT_FOUND] для не Iceberg таблиц.

Проверка конфигурации

  1. Убедитесь, что вы используете правильный Data Catalog: Для доступа к не Iceberg таблицам вам, возможно, потребуется отдельно настроить HiveCatalog или GlueCatalog.

  2. Используйте правильный формат таблиц: Проверьте, что таблицы в Glue Catalog действительно существуют и являются структурированными данными, доступными для Spark.

  3. Проверьте доступ к Glue: Убедитесь, что у вашего пользователя или роли есть необходимые разрешения для доступа к Glue Catalog, включая glue:GetTable и glue:GetTables.

Пример исправленного SparkSession

Попробуйте изменить конфигурацию вашего SparkSession следующим образом:

from pyspark.sql import SparkSession
import os

spark = SparkSession.builder \
    .config("spark.hadoop.fs.s3a.access.key", os.getenv('AWS_ACCESS_KEY_ID')) \
    .config("spark.hadoop.fs.s3a.secret.key", os.getenv('AWS_SECRET_ACCESS_KEY')) \
    .config("spark.hadoop.fs.s3a.session.token", os.getenv('AWS_SESSION_TOKEN')) \
    .config("spark.hadoop.fs.s3a.endpoint", f"s3.{os.getenv('AWS_REGION')}.amazonaws.com") \
    .config("spark.hadoop.fs.s3a.region", os.getenv('AWS_REGION')) \
    .config("spark.jars.packages", 
            "org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.6.0,"
            "org.apache.hadoop:hadoop-aws:3.3.4,"
            "com.amazonaws:aws-java-sdk-bundle:1.11.874,"
            "software.amazon.awssdk:bundle:2.27.2") \
    .config("spark.sql.catalog.glue", "org.apache.iceberg.aws.glue.GlueCatalog") \
    .config("spark.sql.catalog.glue.warehouse", "s3://glue/datalake/") \
    .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
    .config("spark.hadoop.fs.defaultFS", "s3://glue") \
    .enableHiveSupport() \
    .getOrCreate()

Доступ к Non-Iceberg таблицам

Теперь, чтобы прочитать не Iceberg таблицы, используйте:

df_non_iceberg = spark.sql("SELECT * FROM glue.default.your_non_iceberg_table_name")
df_non_iceberg.show()

Дополнительные шаги

  1. Проверка имен таблиц: Убедитесь, что имя таблицы указано правильно, включая правильный префикс схемы (например, glue.default).

  2. Логи и отладка: Изучите логи Spark для получения дополнительных подсказок о том, что может быть не так.

  3. Убедитесь, что сессия активна и данные доступны: Иногда проблемы могут быть связаны с контекстом сессии или доступом к данным. Попробуйте перезапустить сеанс.

Заключение

Следуя вышеуказанным рекомендациям и корректируя конфигурацию SparkSession, вы должны иметь возможность получить доступ к как Iceberg, так и не Iceberg таблицам из AWS Data Catalog. Убедитесь, что все разрешения и конфигурации установлены правильно для избежания ошибок.

Оцените материал
Добавить комментарий

Капча загружается...