Ich verwende Spark lokal auf einem Windows-Computer. Ich konnte die Spark-Shell erfolgreich starten und auch Textdateien als RDDs einlesen. Ich konnte auch die verschiedenen Online-Tutorials zu diesem Thema mitverfolgen und verschiedene Operationen an den RDDs durchführen.
Wenn ich jedoch versuche, eine RDD in einen DataFrame zu konvertieren, erhalte ich eine Fehlermeldung. Das mache ich:
val sqlContext = new org.Apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._
//convert rdd to df
val df = rddFile.toDF()
Dieser Code generiert eine lange Reihe von Fehlermeldungen, die sich auf die folgenden beziehen:
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
Die gesamte Stapelverfolgung folgt.
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
Es handelt sich hierbei um das Problem " SPARK-15565" in Spark 2.0 unter Windows mit einer einfachen Lösung (die scheinbar Teil der Codebase von Spark ist die möglicherweise bald als 2.0.2 oder 2.1.0 veröffentlicht wird).
Die Lösung in Spark 2.0.0 besteht darin, spark.sql.warehouse.dir
auf ein ordnungsgemäß referenziertes Verzeichnis zu setzen, beispielsweise file:///c:/Spark/spark-2.0.0-bin-hadoop2.7/spark-warehouse
, das ///
(dreifache Schrägstriche) verwendet.
Starten Sie spark-Shell
mit dem --conf
-Argument wie folgt:
spark-Shell --conf spark.sql.warehouse.dir=file:///c:/tmp/spark-warehouse
Oder erstellen Sie eine SparkSession
in Ihrer Spark-Anwendung unter Verwendung des neuen Builder-Musters wie folgt:
import org.Apache.spark.sql.SparkSession
SparkSession spark = SparkSession
.builder()
.config("spark.sql.warehouse.dir", "file:///c:/tmp/spark-warehouse")
.getOrCreate()
Oder erstellen Sie conf/spark-defaults.conf
mit folgendem Inhalt:
spark.sql.warehouse.dir file:///c:/tmp/spark-warehouse
Wenn Sie den Code zwar korrigieren möchten, den vorhandenen Code jedoch nicht berühren, können Sie ihn auch von den Systemeigenschaften aus übergeben, sodass sich die nachfolgenden Funkeninitialisierungen nicht ändern.
System.setProperty(
"spark.sql.warehouse.dir",
s"file:///${System.getProperty("user.dir")}/spark-warehouse"
.replaceAll("\\\\", "/")
)
Beachten Sie, dass dies auch das aktuelle Arbeitsverzeichnis ist, das durch "c:/tmp /" ersetzt werden kann, oder an einem beliebigen Ort, an dem Sie das Spark-Warehouse-Verzeichnis haben möchten.
Ich habe die Eigenschaft spark.sql.warehouse.dir gesetzt, um den Fehler in meinem vorhandenen Code zu beheben
System.setProperty("spark.sql.warehouse.dir", "file:///C:/spark-warehouse");
Hier ist das Code-Snippet
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")
Setzen Sie einfach config ("spark.sql.warehouse.dir", "file: /// tmp/spark-warehouse") .
Es ist nicht nötig, "C: /" einzugeben.
Der Spark-Treiber erstellt automatisch einen Ordner im Verzeichnis/tmp/spark-warehouse. Wenn es Windows ist, wird es unter "C: /" liegen. Das "C:" Laufwerk funktioniert nicht, wenn der Master unter Windows nicht lokal ist.