1

我试图从IBM数据科学实验连接到IBM的云对象存储:没有文件系统的方案:COS

access_key = 'XXX' 
secret_key = 'XXX' 
bucket = 'mybucket' 
host = 'lon.ibmselect.objstor.com' 
service = 'mycos' 

sqlCxt = SQLContext(sc) 
hconf = sc._jsc.hadoopConfiguration() 
hconf.set('fs.cos.myCos.access.key', access_key) 
hconf.set('fs.cos.myCos.endpoint', 'http://' + host) 
hconf.set('fs.cose.myCos.secret.key', secret_key) 
hconf.set('fs.cos.service.v2.signer.type', 'false') 

obj = 'mydata.tsv.gz' 

rdd = sc.textFile('cos://{0}.{1}/{2}'.format(bucket, service, obj)) 
print(rdd.count()) 

这将返回:

Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe. 
: java.io.IOException: No FileSystem for scheme: cos 

我猜我需要使用基于storator docs的'cos'方案。但是,错误提示stocator不可用或者是旧版本?

任何想法?


更新1:

我也曾尝试以下操作:

sqlCxt = SQLContext(sc) 
hconf = sc._jsc.hadoopConfiguration() 
hconf.set('fs.cos.impl', 'com.ibm.stocator.fs.ObjectStoreFileSystem') 
hconf.set('fs.stocator.scheme.list', 'cos') 
hconf.set('fs.stocator.cos.impl', 'com.ibm.stocator.fs.cos.COSAPIClient') 
hconf.set('fs.stocator.cos.scheme', 'cos') 
hconf.set('fs.cos.mycos.access.key', access_key) 
hconf.set('fs.cos.mycos.endpoint', 'http://' + host) 
hconf.set('fs.cos.mycos.secret.key', secret_key) 
hconf.set('fs.cos.service.v2.signer.type', 'false') 

service = 'mycos' 
obj = 'mydata.tsv.gz'   
rdd = sc.textFile('cos://{0}.{1}/{2}'.format(bucket, service, obj)) 
print(rdd.count()) 

然而,这一次的反应是:

Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe. 
: java.io.IOException: No object store for: cos 
    at com.ibm.stocator.fs.ObjectStoreVisitor.getStoreClient(ObjectStoreVisitor.java:121) 
    ... 
Caused by: java.lang.ClassNotFoundException: com.ibm.stocator.fs.cos.COSAPIClient 

回答

0

它看起来像COS司机未正确初始化。试试这个配置:

hconf.set('fs.cos.impl', 'com.ibm.stocator.fs.ObjectStoreFileSystem') 

hconf.set('fs.stocator.scheme.list', 'cos') 
hconf.set('fs.stocator.cos.impl', 'com.ibm.stocator.fs.cos.COSAPIClient') 
hconf.set('fs.stocator.cos.scheme', 'cos') 

hconf.set('fs.cos.mycos.access.key', access_key) 
hconf.set('fs.cos.mycos.endpoint', 'http://' + host) 
hconf.set('fs.cos.mycos.secret.key', secret_key) 
hconf.set('fs.cos.service.v2.signer.type', 'false') 

更新1:

你还需要确保stocator类是在classpath。您可以通过以下方式exceuting pyspark使用软件包系统:

./bin/pyspark --packages com.ibm.stocator:stocator:1.0.9 

我不知道如何版本1.0.9的作品,previosly我用1.0.8与swift2d方案的蚂蚁,它的工作很大。

+0

不幸的是,这并没有奏效。我已更新我的问题以反映这一点。 –

+0

@ChrisSnow是的,但现在它不是一个配置问题,但库缺失。请参阅最新的答案。 – Mariusz

0

Stocator位于Spark 2.0和2.1内核的类路径中,但cos方案未配置。你可以通过在Python笔记本执行以下访问配置:

!cat $SPARK_CONF_DIR/core-site.xml 

查找财产fs.stocator.scheme.list。我现在看到的是:

<property> 
    <name>fs.stocator.scheme.list</name> 
    <value>swift2d,swift,s3d</value> 
</property> 

我建议你提高对DSX功能请求,支持cos方案。

2

支持fs.cos方案的最新版本的Stocator(v1.0.9)尚未在Spark aaService上部署(即将推出)。请使用stocator方案 “fs.s3d” 连接到您的COS

例:

endpoint = 'endpointXXX' 
access_key = 'XXX' 
secret_key = 'XXX' 

prefix = "fs.s3d.service" 
hconf = sc._jsc.hadoopConfiguration() 
hconf.set(prefix + ".endpoint", endpoint) 
hconf.set(prefix + ".access.key", access_key) 
hconf.set(prefix + ".secret.key", secret_key) 

bucket = 'mybucket' 
obj = 'mydata.tsv.gz' 

rdd = sc.textFile('s3d://{0}.service/{1}'.format(bucket, obj)) 
rdd.count() 

或者,你可以使用ibmos2spark。该lib已经安装在我们的服务上。例如:

import ibmos2spark 

credentials = { 
    'endpoint': 'endpointXXXX', 
    'access_key': 'XXXX', 
    'secret_key': 'XXXX' 
} 

configuration_name = 'os_configs' # any string you want 
cos = ibmos2spark.CloudObjectStorage(sc, credentials, configuration_name) 

bucket = 'mybucket' 
obj = 'mydata.tsv.gz' 
rdd = sc.textFile(cos.url(obj, bucket)) 
rdd.count() 
相关问题