#apache-spark #pyspark #hive #amazon-emr #aws-glue
#apache-spark #pyspark #улей #amazon-emr #aws-glue
Вопрос:
Я записываю фрейм данных во внешнюю таблицу улья из pyspark, работающего на EMR. Работа включает в себя удаление / усечение данных из внешней таблицы hive, запись содержимого фрейма данных в вышеупомянутую таблицу, а затем запись данных из hive в DynamoDB. Я хочу записать во внутреннюю таблицу в кластере EMR, но пока я хотел бы, чтобы данные улья были доступны для последующих кластеров. Я мог бы напрямую записать в каталог клея и принудительно зарегистрировать его, но это на шаг дальше, чем мне нужно.
Все компоненты отлично работают индивидуально для данного кластера EMR: я могу создать внешнюю таблицу hive на EMR, используя скрипт или ssh и оболочку hive. Эта таблица может быть запрошена Athena и может быть прочитана pyspark. Я могу создать фрейм данных и ВСТАВИТЬ ПЕРЕЗАПИСАТЬ данные в вышеупомянутую таблицу в pyspark. Затем я могу использовать оболочку hive для копирования данных из таблицы hive в таблицу DynamoDB.
Я бы хотел перенести всю работу в один скрипт pyspark вместо того, чтобы отправлять несколько отдельных шагов. Я могу удалять таблицы с помощью sqlContext.sql("drop table if exists default.my_table")
Когда я пытаюсь создать таблицу с помощью sqlContext.sql("create table default.mytable(id string,val string) STORED AS ORC")
, я получаю следующую ошибку:
org.apache.hadoop.net.ConnectTimeoutException: вызов с ip-xx-xxx-xx-xxx / xx.xxx.xx.xx на ip-xxx-xx-xx-xx: ошибка 8020 при тайм-ауте сокета исключение: org.apache.hadoop.net.ConnectTimeoutException: тайм-аут 20000 миллисв ожидании готовности канала к подключению. ch: java.nio.channels.SocketChannel [ожидающий подключения удаленный = ip-xxx-xx-xx-xx: 8020]; Для получения более подробной информации см.: http://wiki.apache.org/hadoop/SocketTimeout
Я не могу понять, почему я могу создать внешнюю таблицу улья в Glue, используя оболочку улья в кластере, удалить таблицу с помощью оболочки улья или pyspark sqlcontext, но я не могу создать таблицу с помощью sqlcontext. Я проверил, и предлагаемые решения не имеют смысла в этом контексте (копирование hive-site.xml ) поскольку я могу четко писать по нужным адресам без каких-либо проблем, только не в pyspark. И вдвойне странно, что я могу удалять таблицы, при этом они определенно удаляются при регистрации в Athena.
Работает на: emr-5.28.0, дистрибутив Hadoop Amazon 2.8.5 Spark 2.4.4 Hive 2.3.6 Livy 0.6.0 (для ноутбуков, но мои эксперименты проводятся через ssh и pyspark shell)
Ответ №1:
Оказывается, я мог создавать таблицы с помощью вызова spark.sql(), если я указал местоположение для таблиц. Похоже, что оболочка улья не требует этого, но spark.sql() делает. Не ожидалось, но не совсем неудивительно.
Ответ №2:
Дополняя ответ @Zeathor. После настройки подключения и разрешения EMR и клея (вы можете проверить больше здесь: https://www.youtube.com/watch?v=w20tapeW1ME ), вам просто нужно будет написать команды SparkSQL:
spark = SparkSession.builder.appName('TestSession').getOrCreate()
spark.sql("create database if not exists test")
Затем вы можете создавать свои таблицы из фреймов данных:
df.createOrReplaceTempView("first_table");
spark.sql("create table test.table_name as select * from first_table");
Затем все метаданные баз данных и таблиц будут сохранены в каталоге AWS Glue.