web-dev-qa-db-fra.com

Pourquoi Spark signale-t-il "Java.net.URISyntaxException: chemin relatif dans l'URI absolu" lors de l'utilisation de DataFrames?

J'exécute Spark localement sur une machine Windows. J'ai réussi à lancer l'étincelle Shell et à lire des fichiers texte en tant que RDD. J'ai également pu suivre les différents didacticiels en ligne sur ce sujet et effectuer diverses opérations sur les RDD.

Cependant, lorsque j'essaie de convertir un RDD en un DataFrame, j'obtiens une erreur. Voici ce que je fais:

val sqlContext = new org.Apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._

//convert rdd to df
val df = rddFile.toDF()

Ce code génère une longue série de messages d'erreur qui semblent se rapporter au suivant:

Caused by: Java.lang.IllegalArgumentException: Java.net.URISyntaxException: Relative path in absolute URI: file:C:/Users/spark/spark-warehouse
        at org.Apache.hadoop.fs.Path.initialize(Path.Java:205)
        at org.Apache.hadoop.fs.Path.<init>(Path.Java:171)
        at org.Apache.hadoop.Hive.metastore.Warehouse.getWhRoot(Warehouse.Java:159)
        at org.Apache.hadoop.Hive.metastore.Warehouse.getDefaultDatabasePath(Warehouse.Java:177)
        at org.Apache.hadoop.Hive.metastore.HiveMetaStore$HMSHandler.createDefaultDB_core(HiveMetaStore.Java:600)
        at org.Apache.hadoop.Hive.metastore.HiveMetaStore$HMSHandler.createDefaultDB(HiveMetaStore.Java:620)
        at org.Apache.hadoop.Hive.metastore.HiveMetaStore$HMSHandler.init(HiveMetaStore.Java:461)
        at org.Apache.hadoop.Hive.metastore.RetryingHMSHandler.<init>(RetryingHMSHandler.Java:66)
        at org.Apache.hadoop.Hive.metastore.RetryingHMSHandler.getProxy(RetryingHMSHandler.Java:72)
        at org.Apache.hadoop.Hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.Java:5762)
        at org.Apache.hadoop.Hive.metastore.HiveMetaStoreClient.<init>(HiveMetaStoreClient.Java:199)
        at org.Apache.hadoop.Hive.ql.metadata.SessionHiveMetaStoreClient.<init>(SessionHiveMetaStoreClient.Java:74)
        ... 85 more
Caused by: Java.net.URISyntaxException: Relative path in absolute URI: file:C:/Users/spark/spark-warehouse
        at Java.net.URI.checkPath(URI.Java:1823)
        at Java.net.URI.<init>(URI.Java:745)
        at org.Apache.hadoop.fs.Path.initialize(Path.Java:202)
        ... 96 more

La trace de la pile complète suit.

16/08/16 12:36:20 WARN ObjectStore: Failed to get database default, returning NoSuchObjectException
16/08/16 12:36:20 WARN Hive: Failed to access metastore. This class should not accessed in runtime.
org.Apache.hadoop.Hive.ql.metadata.HiveException: Java.lang.RuntimeException: Unable to instantiate org.Apache.hadoop.Hive.ql.metadata.SessionHiveMetaStoreClient
        at org.Apache.hadoop.Hive.ql.metadata.Hive.getAllDatabases(Hive.Java:1236)
        at org.Apache.hadoop.Hive.ql.metadata.Hive.reloadFunctions(Hive.Java:174)
        at org.Apache.hadoop.Hive.ql.metadata.Hive.<clinit>(Hive.Java:166)
        at org.Apache.hadoop.Hive.ql.session.SessionState.start(SessionState.Java:503)
        at org.Apache.spark.sql.Hive.client.HiveClientImpl.<init>(HiveClientImpl.scala:171)
        at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:62)
        at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:45)
        at Java.lang.reflect.Constructor.newInstance(Constructor.Java:423)
        at org.Apache.spark.sql.Hive.client.IsolatedClientLoader.createClient(IsolatedClientLoader.scala:258)
        at org.Apache.spark.sql.Hive.HiveUtils$.newClientForMetadata(HiveUtils.scala:359)
        at org.Apache.spark.sql.Hive.HiveUtils$.newClientForMetadata(HiveUtils.scala:263)
        at org.Apache.spark.sql.Hive.HiveSharedState.metadataHive$lzycompute(HiveSharedState.scala:39)
        at org.Apache.spark.sql.Hive.HiveSharedState.metadataHive(HiveSharedState.scala:38)
        at org.Apache.spark.sql.Hive.HiveSharedState.externalCatalog$lzycompute(HiveSharedState.scala:46)
        at org.Apache.spark.sql.Hive.HiveSharedState.externalCatalog(HiveSharedState.scala:45)
        at org.Apache.spark.sql.Hive.HiveSessionState.catalog$lzycompute(HiveSessionState.scala:50)
        at org.Apache.spark.sql.Hive.HiveSessionState.catalog(HiveSessionState.scala:48)
        at org.Apache.spark.sql.Hive.HiveSessionState$$anon$1.<init>(HiveSessionState.scala:63)
        at org.Apache.spark.sql.Hive.HiveSessionState.analyzer$lzycompute(HiveSessionState.scala:63)
        at org.Apache.spark.sql.Hive.HiveSessionState.analyzer(HiveSessionState.scala:62)
        at org.Apache.spark.sql.execution.QueryExecution.assertAnalyzed(QueryExecution.scala:49)
        at org.Apache.spark.sql.Dataset$.ofRows(Dataset.scala:64)
        at org.Apache.spark.sql.SparkSession.baseRelationToDataFrame(SparkSession.scala:382)
        at org.Apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:143)
        at org.Apache.spark.sql.DataFrameReader.csv(DataFrameReader.scala:401)
        at org.Apache.spark.sql.DataFrameReader.csv(DataFrameReader.scala:342)
        at $line14.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw.<init>(<console>:24)
        at $line14.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw.<init>(<console>:29)
        at $line14.$read$$iw$$iw$$iw$$iw$$iw$$iw.<init>(<console>:31)
        at $line14.$read$$iw$$iw$$iw$$iw$$iw.<init>(<console>:33)
        at $line14.$read$$iw$$iw$$iw$$iw.<init>(<console>:35)
        at $line14.$read$$iw$$iw$$iw.<init>(<console>:37)
        at $line14.$read$$iw$$iw.<init>(<console>:39)
        at $line14.$read$$iw.<init>(<console>:41)
        at $line14.$read.<init>(<console>:43)
        at $line14.$read$.<init>(<console>:47)
        at $line14.$read$.<clinit>(<console>)
        at $line14.$eval$.$print$lzycompute(<console>:7)
        at $line14.$eval$.$print(<console>:6)
        at $line14.$eval.$print(<console>)
        at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
        at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
        at Java.lang.reflect.Method.invoke(Method.Java:498)
        at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:786)
        at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:1047)
        at scala.tools.nsc.interpreter.IMain$WrappedRequest$$anonfun$loadAndRunReq$1.apply(IMain.scala:638)
        at scala.tools.nsc.interpreter.IMain$WrappedRequest$$anonfun$loadAndRunReq$1.apply(IMain.scala:637)
        at scala.reflect.internal.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:31)
        at scala.reflect.internal.util.AbstractFileClassLoader.asContext(AbstractFileClassLoader.scala:19)
        at scala.tools.nsc.interpreter.IMain$WrappedRequest.loadAndRunReq(IMain.scala:637)
        at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:569)
        at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:565)
        at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:807)
        at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:681)
        at scala.tools.nsc.interpreter.ILoop.processLine(ILoop.scala:395)
        at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:415)
        at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply$mcZ$sp(ILoop.scala:923)
        at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:909)
        at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:909)
        at scala.reflect.internal.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:97)
        at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:909)
        at org.Apache.spark.repl.Main$.doMain(Main.scala:68)
        at org.Apache.spark.repl.Main$.main(Main.scala:51)
        at org.Apache.spark.repl.Main.main(Main.scala)
        at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
        at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
        at Java.lang.reflect.Method.invoke(Method.Java:498)
        at org.Apache.spark.deploy.SparkSubmit$.org$Apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:729)
        at org.Apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:185)
        at org.Apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:210)
        at org.Apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:124)
        at org.Apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: Java.lang.RuntimeException: Unable to instantiate org.Apache.hadoop.Hive.ql.metadata.SessionHiveMetaStoreClient
        at org.Apache.hadoop.Hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.Java:1523)
        at org.Apache.hadoop.Hive.metastore.RetryingMetaStoreClient.<init>(RetryingMetaStoreClient.Java:86)
        at org.Apache.hadoop.Hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.Java:132)
        at org.Apache.hadoop.Hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.Java:104)
        at org.Apache.hadoop.Hive.ql.metadata.Hive.createMetaStoreClient(Hive.Java:3005)
        at org.Apache.hadoop.Hive.ql.metadata.Hive.getMSC(Hive.Java:3024)
        at org.Apache.hadoop.Hive.ql.metadata.Hive.getAllDatabases(Hive.Java:1234)
        ... 74 more
Caused by: Java.lang.reflect.InvocationTargetException
        at Sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at Sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.Java:62)
        at Sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.Java:45)
        at Java.lang.reflect.Constructor.newInstance(Constructor.Java:423)
        at org.Apache.hadoop.Hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.Java:1521)
        ... 80 more
Caused by: Java.lang.IllegalArgumentException: Java.net.URISyntaxException: Relative path in absolute URI: file:C:/Users/spark/spark-warehouse
        at org.Apache.hadoop.fs.Path.initialize(Path.Java:205)
        at org.Apache.hadoop.fs.Path.<init>(Path.Java:171)
        at org.Apache.hadoop.Hive.metastore.Warehouse.getWhRoot(Warehouse.Java:159)
        at org.Apache.hadoop.Hive.metastore.Warehouse.getDefaultDatabasePath(Warehouse.Java:177)
        at org.Apache.hadoop.Hive.metastore.HiveMetaStore$HMSHandler.createDefaultDB_core(HiveMetaStore.Java:600)
        at org.Apache.hadoop.Hive.metastore.HiveMetaStore$HMSHandler.createDefaultDB(HiveMetaStore.Java:620)
        at org.Apache.hadoop.Hive.metastore.HiveMetaStore$HMSHandler.init(HiveMetaStore.Java:461)
        at org.Apache.hadoop.Hive.metastore.RetryingHMSHandler.<init>(RetryingHMSHandler.Java:66)
        at org.Apache.hadoop.Hive.metastore.RetryingHMSHandler.getProxy(RetryingHMSHandler.Java:72)
        at org.Apache.hadoop.Hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.Java:5762)
        at org.Apache.hadoop.Hive.metastore.HiveMetaStoreClient.<init>(HiveMetaStoreClient.Java:199)
        at org.Apache.hadoop.Hive.ql.metadata.SessionHiveMetaStoreClient.<init>(SessionHiveMetaStoreClient.Java:74)
        ... 85 more
Caused by: Java.net.URISyntaxException: Relative path in absolute URI: file:C:/Users/spark/spark-warehouse
        at Java.net.URI.checkPath(URI.Java:1823)
        at Java.net.URI.<init>(URI.Java:745)
        at org.Apache.hadoop.fs.Path.initialize(Path.Java:202)
        ... 96 more
19
Dataminer

C'est le problème SPARK-15565 dans Spark 2.0 sous Windows avec une solution simple (qui semble faire partie de fait partie du code de base de Spark et qui pourrait bientôt être publié en tant que 2.0.2 ou 2.1.0).

Dans Spark 2.0.0, la solution consiste à définir spark.sql.warehouse.dir dans un répertoire correctement référencé, par exemple file:///c:/Spark/spark-2.0.0-bin-hadoop2.7/spark-warehouse qui utilise /// (triple barre oblique).

Démarrez spark-Shell avec l'argument --conf comme suit:

spark-Shell --conf spark.sql.warehouse.dir=file:///c:/tmp/spark-warehouse

Ou bien créez une SparkSession dans votre application Spark en utilisant le nouveau modèle de constructeur Fluent, comme suit:

import org.Apache.spark.sql.SparkSession
SparkSession spark = SparkSession
  .builder()
  .config("spark.sql.warehouse.dir", "file:///c:/tmp/spark-warehouse")
  .getOrCreate()

Ou créez conf/spark-defaults.conf avec le contenu suivant:

spark.sql.warehouse.dir file:///c:/tmp/spark-warehouse
35
Jacek Laskowski

Si vous souhaitez le corriger dans le code sans toucher au code existant, vous pouvez également le transmettre à partir des propriétés du système, de sorte que les initialisations d'étincelle qui suivent ne soient pas modifiées.

System.setProperty(
    "spark.sql.warehouse.dir", 
    s"file:///${System.getProperty("user.dir")}/spark-warehouse"
    .replaceAll("\\\\", "/")
)

Notez également qu’il utilise le répertoire de travail en cours, qui peut être remplacé par "c:/tmp /", ou n’importe quel endroit où vous souhaitez utiliser le répertoire spark-warehouse.

1
arntg

J'ai défini la propriété spark.sql.warehouse.dir pour corriger l'erreur dans mon code existant

System.setProperty("spark.sql.warehouse.dir", "file:///C:/spark-warehouse");

Voici l'extrait de code

System.setProperty("hadoop.home.dir", "c:/winutil/");
System.setProperty("spark.sql.warehouse.dir", "file:///C:/spark-warehouse");
val conf = new SparkConf().setAppName("test").setMaster("local[*]")
val sc = new SparkContext(conf)
val lines = sc.textFile("C:/user.txt")
0
G G

Il suffit de définir config ("spark.sql.warehouse.dir", "fichier: /// tmp/spark-warehouse") .

Pas besoin d'inclure "C: /" .

Le pilote Spark créera automatiquement un dossier dans le répertoire/tmp/spark-warehouse. Si c'est Windows, ce sera sous "C: /" . Le lecteur "C:" ne fonctionnera pas si le maître n’est pas local sous Windows.

0
Feng