java.io.IOException: Не удалось прочитать нижний колонтитул для файла FileStatus при попытке прочитать файл паркета из кластера Spark из IBM Cloud Object Storage - PullRequest
0 голосов
/ 17 февраля 2019

Я создал кластер Spark с 3 работниками в Kubernetes и развертывание JupyterHub для подключения к нему, чтобы я мог выполнять огромные запросы.

Мои файлы паркета хранятся в IBM Cloud Object Storage (COS) и когдаЯ запускаю простой код для чтения из COS, я получаю следующую ошибку:

Не удалось прочитать нижний колонтитул: java.io.IOException: Не удалось прочитать нижний колонтитул для файла FileStatus {path = file:/path/myfile.parquet/_common_metadata;isDirectory = ложь;длина = 413;Репликация = 0;размер_блок = 0;MODIFICATION_TIME = 0;access_time = 0;владелец =;группа =;разрешение = RW-RW-rw-;isSymlink = false} в parquet.hadoop.ParquetFileReader.readAllFootersInParallel

Я добавил все необходимые библиотеки в каталог /jars в каталоге SPARK_HOME в драйвере.

Этокод, который я использую для подключения:

# Initial Setup - Once
import os

from pyspark import SparkConf, SparkContext
from pyspark.sql import SparkSession

spark_session = SparkSession(sc)


credentials_staging_parquet = {
  'bucket_dm':'mybucket1',
  'bucket_eid':'bucket2',
  'secret_key':'XXXXXXXX',
  'iam_url':'https://iam.ng.bluemix.net/oidc/token',
  'api_key':'XXXXXXXX',
  'resource_instance_id':'crn:v1:bluemix:public:cloud-object-storage:global:a/XXXXX:XXXXX::',
  'access_key':'XXXXX',
  'url':'https://s3-api.us-geo.objectstorage.softlayer.net'
}

conf = {
    'fs.cos.service.access.key': credentials_staging_parquet.get('access_key'),
    'fs.cos.service.endpoint': credentials_staging_parquet.get('url'),
    'fs.cos.service.secret.key': credentials_staging_parquet.get('secret_key'),
    'fs.cos.service.iam.endpoint': credentials_staging_parquet.get('iam_url'),
    'fs.cos.service.iam.service.id': credentials_staging_parquet.get('resource_instance_id'),
    'fs.stocator.scheme.list': 'cos',
    'fs.cos.impl': 'com.ibm.stocator.fs.ObjectStoreFileSystem',
    'fs.stocator.cos.impl': 'com.ibm.stocator.fs.cos.COSAPIClient',
    'fs.stocator.cos.scheme': 'cos',
    'fs.cos.client.execution.timeout': '18000000',
    'fs.stocator.glob.bracket.support': 'true'
}

hadoop_conf = sc._jsc.hadoopConfiguration()
for key in conf:
    hadoop_conf.set(key, conf.get(key))

parquet_path = 'store/MY_FILE/*'
cos_url = 'cos://{bucket}.service/{parquet_path}'.format(bucket=credentials_staging_parquet.get('bucket_eid'), parquet_path=parquet_path)

df2 = spark_session.read.parquet(cos_url)

1 Ответ

0 голосов
/ 25 февраля 2019

Обнаружил проблему в моей проблеме, необходимые библиотеки были недоступны для всех работников кластера.

Существует два способа исправить это:

  • Убедитесь, что вы добавилизависимости от команды spark-submit, чтобы она распространялась на весь кластер, в этом случае это должно быть сделано в файле kernel.json на Jupyterhub, расположенном в /usr/local/share/jupyter/kernels/pyspark/kernel.json (предполагается, что вы его создали).

ИЛИ

  • Добавьте зависимости в каталоге /jars в SPARK_HOME для каждого работника в кластере и драйвера (если вы этого не сделали).

Я использовал второй подход.Во время создания образа Docker я добавил библиотеки, чтобы при запуске кластера во всех контейнерах уже были необходимые библиотеки.

...