0

J'essaie d'accéder aux données sur IBM COS à partir de Data Science Expérience basée sur ce blog post.java.lang.AbstractMethodError: com/ibm/stocateur/fs/common/IStoreClient.setStocatorPath (Lcom/ibm/stocator/fs/common/StocatorPath;) V

D'abord, je sélectionnez 1.0.8 version de stocator ...

!pip install --user --upgrade pixiedust 
import pixiedust 
pixiedust.installPackage("com.ibm.stocator:stocator:1.0.8") 

noyau redémarrée, puis ...

access_key = 'xxxx' 
secret_key = 'xxxx' 
bucket = 'xxxx' 
host = 'lon.ibmselect.objstor.com' 

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

file = 'mydata_file.tsv.gz' 

inputDataset = "s3d://{}.service/{}".format(bucket, file) 

lines = sc.textFile(inputDataset, 1) 
lines.count() 

Cependant, que les résultats de l'erreur suivante:

Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe. 
: java.lang.AbstractMethodError: com/ibm/stocator/fs/common/IStoreClient.setStocatorPath(Lcom/ibm/stocator/fs/common/StocatorPath;)V 
    at com.ibm.stocator.fs.ObjectStoreFileSystem.initialize(ObjectStoreFileSystem.java:104) 
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2669) 
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94) 
    at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703) 
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685) 
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373) 
    at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295) 
    at org.apache.hadoop.mapred.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:258) 
    at org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:229) 
    at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:315) 
    at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:199) 
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:251) 
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:249) 
    at scala.Option.getOrElse(Option.scala:121) 
    at org.apache.spark.rdd.RDD.partitions(RDD.scala:249) 
    at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35) 
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:251) 
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:249) 
    at scala.Option.getOrElse(Option.scala:121) 
    at org.apache.spark.rdd.RDD.partitions(RDD.scala:249) 
    at org.apache.spark.api.python.PythonRDD.getPartitions(PythonRDD.scala:53) 
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:251) 
    at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:249) 
    at scala.Option.getOrElse(Option.scala:121) 
    at org.apache.spark.rdd.RDD.partitions(RDD.scala:249) 
    at org.apache.spark.SparkContext.runJob(SparkContext.scala:1927) 
    at org.apache.spark.rdd.RDD$$anonfun$collect$1.apply(RDD.scala:932) 
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151) 
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112) 
    at org.apache.spark.rdd.RDD.withScope(RDD.scala:378) 
    at org.apache.spark.rdd.RDD.collect(RDD.scala:931) 
    at org.apache.spark.api.python.PythonRDD$.collectAndServe(PythonRDD.scala:453) 
    at org.apache.spark.api.python.PythonRDD.collectAndServe(PythonRDD.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:95) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:237) 
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357) 
    at py4j.Gateway.invoke(Gateway.java:280) 
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) 
    at py4j.commands.CallCommand.execute(CallCommand.java:79) 
    at py4j.GatewayConnection.run(GatewayConnection.java:214) 
    at java.lang.Thread.run(Thread.java:785) 

Remarque: Ma première tentative de connexion à IBM COS res ulted dans une erreur différente. Cette tentative est capturée ici: No FileSystem for scheme: cos

+0

Remarque: J'ai d'abord exécuté le script dans la question sans utiliser pixiedust pour installer stocator. Il y avait une erreur, mais malheureusement, je n'ai pas capturé l'erreur lors de l'exécution avec le stocator pré-installé. Iirc, l'erreur originale suggéré stocator n'a pas été installé, ce qui explique pourquoi j'ai ensuite utilisé pixiedust pour installer stocator. –

+0

Le problème a été étudié. L'environnement dsx dédié au Royaume-Uni que j'utilisais n'a pas la bonne version de stocator installée. Je vais réessayer lorsque la dépendance a été corrigée. –

Répondre

1

Ne forcez pas l'installation d'un nouveau Stocator sauf si vous avez une très bonne raison.

Je recommande vivement la documentation Spark aaS à:

https://console.bluemix.net/docs/services/AnalyticsforApacheSpark/index-gentopic1.html#genTopProcId2

S'il vous plaît choisir les points de terminaison COS corrects de:

https://ibm-public-cos.github.io/crs-docs/endpoints

et S'IL VOUS PLAÎT utiliser les points d'extrémité privés si vous travaillez à partir de l'IBM Cloud. Ce sera beaucoup plus rapide et moins cher.

Il existe des exemples d'accès aux données COS à l'aide de toutes les bonnes aides. Cela se résume à

import ibmos2spark 

credentials = { 
    'endpoint': 's3-api.us-geo.objectstorage.service.networklayer.com', #just an example. Your url might be different 
    'access_key': 'my access key', 
    'secret_key': 'my secret key' 
} 
bucket_name = 'my bucket name' 
object_name = 'mydata_file.tsv.gz' 

cos = ibmos2spark.CloudObjectStorage(sc, credentials) 
lines = sc.textFile(cos.url(object_name, bucket_name),1) 
lines.count() 
1

Chris, je n'utilise généralement pas le 'http: //' dans le point de terminaison et cela fonctionne pour moi. Je ne sais pas si c'est le problème ici.

Voici comment j'accéder aux objets COS de DSX ordinateurs portables

endpoint = "s3-api.dal-us-geo.objectstorage.softlayer.net" 

hconf = sc._jsc.hadoopConfiguration() 
hconf.set("fs.s3d.service.endpoint",endpoint) 
hconf.set("fs.s3d.service.access.key",Access_Key_ID) 
hconf.set("fs.s3d.service.secret.key",Secret_Access_Key) 

inputObject = "s3d://<bucket>.service/<file>" 
myRDD = sc.textFile(inputObject,1) 
1

DSX a une version de stocator sur le classpath Spark 2.0 et Spark noyaux 2.1. Celui que vous avez installé dans votre instance est susceptible d'entrer en conflit avec la version pré-installée.

2

Pas besoin d'installer le stocator il est déjà là. Comme Roland l'a mentionné, la nouvelle installation risque fort de se heurter à celle déjà installée et de provoquer des conflits.

Essayez ibmos2spark: https://stackoverflow.com/a/46035893/8558372

Laissez-moi savoir si vous rencontrez toujours des problèmes.