首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.io.IOException:当尝试从IBM从Spark集群读取parquet文件时,无法读取文件FileStatus的页脚

java.io.IOException:当尝试从IBM从Spark集群读取parquet文件时,无法读取文件FileStatus的页脚
EN

Stack Overflow用户
提问于 2019-02-17 16:59:57
回答 3查看 7.9K关注 0票数 4

我已经在Kubernetes上创建了一个包含3名工作人员的星火集群,以及一个JupyterHub部署来附加到它,这样我就可以运行巨大的查询了。

我的拼板文件存储在( COS )中,当我运行一个简单的代码从COS读取时,我得到以下错误:

无法读取页脚: FileStatus{path=file:/path/myfile.parquet/_common_metadata;isDirectory=false;length=413;replication=0;blocksize=0;modification_time=0;access_time=0;owner=;group=;java.io.IOException=rw-;isSymlink=false} at parquet.hadoop.ParquetFileReader.readAllFootersInParallel的页脚。

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

这是我用来连接的代码:

代码语言:javascript
复制
# 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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-25 13:50:31

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

有两种方法可以解决这个问题:

  • 确保添加了星火提交命令的依赖项,以便将其分发到整个集群,在本例中,它应该在位于kernel.json/usr/local/share/jupyter/kernels/pyspark/kernel.json上的朱庇特中心文件中完成(假设是您创建的)。

  • 为集群中的每个工作人员和驱动程序添加/jars目录上的依赖项(如果没有的话)。

我用了第二种方法。在我的坞映像创建过程中,我添加了库,所以当我启动集群时,所有容器都已经具备了所需的库。

票数 1
EN

Stack Overflow用户

发布于 2020-04-30 22:47:47

我也发现了类似的错误&谷歌发现了这篇文章。接下来,我意识到我有一个文件格式问题,保存的文件是Avro,文件读取器是Orc。所以..。检查保存的文件格式和读取器格式是否对齐。

票数 4
EN

Stack Overflow用户

发布于 2019-11-09 06:14:27

尝试重新启动您的系统或服务器,然后它就可以工作了。

我也面临着同样的问题。通常在升级Java版本时会发生这种情况,但是spark仍然指向旧的java版本。重新启动服务器/系统解决了这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54735499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档