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() 
相關問題