java.io.IOException:尝试从IBM Cloud Object Storage的Spark集群读取镶木地板文件时,无法读取文件FileStatus的页脚

时间:2019-02-17 16:59:58

标签: java python apache-spark jupyter jupyterhub

我在Kubernetes上创建了一个由3个工作人员组成的Spark集群,并附加了一个JupyterHub部署,以便我可以运行大量查询。

我的实木复合地板文件存储在IBM Cloud Object Storage(COS)中,当我运行一个简单的代码以从COS读取时,出现以下错误:

  

无法读取页脚:java.io.IOException:无法读取文件FileStatus {path = file:/path/myfile.parquet/_common_metadata; isDirectory = false;长度= 413;复制= 0;块大小= 0; modify_time = 0; access_time = 0;所有者=;组=;权限= rw-rw-rw-; isSymlink = false},位于parquet.hadoop.ParquetFileReader.readAllFootersInParallel

我已将所有必需的库添加到驱动程序中SPARK_HOME目录的/jars目录中。

这是我用来连接的代码:

# 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)

3 个答案:

答案 0 :(得分:2)

我遇到了类似的错误,并且Googled找到了该帖子。接下来,我意识到我遇到了一个文件格式问题,其中保存的文件是Avro,文件阅读器是Orc。所以...检查您保存的文件格式和阅读器格式是否对齐。

答案 1 :(得分:0)

发现问题所在,不是集群中的所有工作人员都可以使用所需的库。

有2种解决方法:

  • 确保在spark-submit命令上添加依赖项,以便将其分发到整个集群,在这种情况下,应在Jupyterhub上kernel.json的{​​{1}}文件中进行设置(假设您创建的)。

OR

  • 在SPARK_HOME上的/usr/local/share/jupyter/kernels/pyspark/kernel.json目录上为集群中的每个工作程序和驱动程序添加依赖项(如果没有这样做)。

我使用了第二种方法。在创建docker映像期间,我添加了库,因此在启动集群时,所有容器都已具有所需的库。

答案 2 :(得分:0)

尝试重新启动系统或服务器,它将在它之后运行。

我遇到了同样的问题。通常在升级Java版本时发生,但是spark lib仍然指向旧的Java版本。重新启动服务器/系统即可解决问题。