Spark пишет dataframe к vertica, давая ошибку - PullRequest
1 голос
/ 26 апреля 2020

Я попытался записать фрейм данных в vertica, используя следующую документацию: https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/SparkConnector/WritingtoVerticaUsingDefaultSource.htm?tocpath=Integrating%20with%20Apache%20Spark%7CSaving%20an%20Apache%20Spark%20DataFrame%20to%20a%20Vertica%20Table%7C_____1, предоставленный vertica, и это сработало. Фрейм данных записывается в таблицу после загрузки с необходимыми библиотеками.


Теперь, когда я пытался сделать точно такой же код в Intellij или без написания кода непосредственно из оболочки spark, возникают некоторые ошибки с ним:

Код:

val rows: RDD[Row] = sc.parallelize(Array(
      Row(1,"hello", true),
      Row(2,"goodbye", false)
    ))

    val schema = StructType(Array(
      StructField("id",IntegerType, false),
      StructField("sings",StringType,true),
      StructField("still_here",BooleanType,true)
    ))

    val spark = SparkSession.builder().config(conf).getOrCreate()

    val df = spark.createDataFrame(rows, schema) // Spark 2.0// View the sample data and schema
    df.show

    df.schema// Setup the user options, defaults are shown where applicable for optional values.


    // Replace the values in italics with the settings for your Vertica instance.
    val opts: Map[String, String] = Map(
      "table" -> "signs",
      "db" -> "dbadmin",
      "user" -> "dbadmin",
      "password" -> "password",
      "host" -> "localhost",
      "hdfs_url" -> "hdfs://localhost:9000/user",
      "web_hdfs_url" -> "webhdfs://localhost:9870/user",
      // "failed_rows_percent_tolerance"-> "0.00"   // OPTIONAL (default val shown)
      "dbschema" -> "public"                     // OPTIONAL (default val shown)
      // "port" -> "5433"                           // OPTIONAL (default val shown)
      // "strlen" -> "1024"                         // OPTIONAL (default val shown)
      // "fileformat" -> "orc"                      // OPTIONAL (default val shown)
    )// SaveMode can be either Overwrite, Append, ErrorIfExists, Ignore

    val mode = SaveMode.Append
    df
      .write
      .format("com.vertica.spark.datasource.DefaultSource")
      .options(opts)
      .mode(mode)
      .save()

Это то же самое, что указано в документации. И эта ошибка приходит. Я настроил мои hdfs и vertica.
Вопрос в том, работает ли он должным образом от оболочки искры, почему он не работает снаружи от нее?

20/04/27 01:55:50 INFO S2V: Load by name. Column list: ("name","miles_per_gallon","cylinders","displacement","horsepower","weight_in_lbs","acceleration","year","origin")
20/04/27 01:55:50 INFO S2V: Writing intermediate data files to path: hdfs://localhost:9000/user/S2V_job2509086937642333836
20/04/27 01:55:50 ERROR S2VUtils: Unable to delete the HDFS path: hdfs://localhost:9000/user/S2V_job2509086937642333836
20/04/27 01:55:50 ERROR S2V: Failed to save DataFrame to Vertica table: second0.car with SaveMode: Append
20/04/27 01:55:50 ERROR JobScheduler: Error running job streaming job 1587932740000 ms.2
java.lang.Exception: S2V: FATAL ERROR for job S2V_job2509086937642333836. Job status information is available in the Vertica table second0.S2V_JOB_STATUS_USER_DBADMIN. Unable to create/insert into target table: second0.car with SaveMode: Append.  ERROR MESSAGE:  ERROR: java.lang.Exception: S2V: FATAL ERROR for job S2V_job2509086937642333836. Unable to save intermediate orc files to HDFS path: hdfs://localhost:9000/user/S2V_job2509086937642333836. Error message: The ORC data source must be used with Hive support enabled; 
    at com.vertica.spark.s2v.S2V.do2Stage(S2V.scala:446)
    at com.vertica.spark.s2v.S2V.save(S2V.scala:496)
    at com.vertica.spark.datasource.DefaultSource.createRelation(VerticaSource.scala:100)
    at org.apache.spark.sql.execution.datasources.DataSource.write(DataSource.scala:469)
    at org.apache.spark.sql.execution.datasources.SaveIntoDataSourceCommand.run(SaveIntoDataSourceCommand.scala:50)
    at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:58)
    at org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult(commands.scala:56)
    at org.apache.spark.sql.execution.command.ExecutedCommandExec.doExecute(commands.scala:74)
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:117)
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:117)
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$executeQuery$1.apply(SparkPlan.scala:138)
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
    at org.apache.spark.sql.execution.SparkPlan.executeQuery(SparkPlan.scala:135)
    at org.apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:116)
    at org.apache.spark.sql.execution.QueryExecution.toRdd$lzycompute(QueryExecution.scala:92)
    at org.apache.spark.sql.execution.QueryExecution.toRdd(QueryExecution.scala:92)
    at org.apache.spark.sql.DataFrameWriter.runCommand(DataFrameWriter.scala:609)
    at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:233)
    at replica_nimble_spark.SparkVerticaHelper$$anonfun$applyPipeline$1$$anonfun$apply$3.apply(SparkVerticaHelper.scala:85)
    at replica_nimble_spark.SparkVerticaHelper$$anonfun$applyPipeline$1$$anonfun$apply$3.apply(SparkVerticaHelper.scala:76)
    at org.apache.spark.streaming.dstream.DStream$$anonfun$foreachRDD$1$$anonfun$apply$mcV$sp$3.apply(DStream.scala:628)
    at org.apache.spark.streaming.dstream.DStream$$anonfun$foreachRDD$1$$anonfun$apply$mcV$sp$3.apply(DStream.scala:628)
    at org.apache.spark.streaming.dstream.ForEachDStream$$anonfun$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(ForEachDStream.scala:51)
    at org.apache.spark.streaming.dstream.ForEachDStream$$anonfun$1$$anonfun$apply$mcV$sp$1.apply(ForEachDStream.scala:51)
    at org.apache.spark.streaming.dstream.ForEachDStream$$anonfun$1$$anonfun$apply$mcV$sp$1.apply(ForEachDStream.scala:51)
    at org.apache.spark.streaming.dstream.DStream.createRDDWithLocalProperties(DStream.scala:416)
    at org.apache.spark.streaming.dstream.ForEachDStream$$anonfun$1.apply$mcV$sp(ForEachDStream.scala:50)
    at org.apache.spark.streaming.dstream.ForEachDStream$$anonfun$1.apply(ForEachDStream.scala:50)
    at org.apache.spark.streaming.dstream.ForEachDStream$$anonfun$1.apply(ForEachDStream.scala:50)
    at scala.util.Try$.apply(Try.scala:192)
    at org.apache.spark.streaming.scheduler.Job.run(Job.scala:39)
    at org.apache.spark.streaming.scheduler.JobScheduler$JobHandler$$anonfun$run$1.apply$mcV$sp(JobScheduler.scala:257)
    at org.apache.spark.streaming.scheduler.JobScheduler$JobHandler$$anonfun$run$1.apply(JobScheduler.scala:257)
    at org.apache.spark.streaming.scheduler.JobScheduler$JobHandler$$anonfun$run$1.apply(JobScheduler.scala:257)
    at scala.util.DynamicVariable.withValue(DynamicVariable.scala:58)
    at org.apache.spark.streaming.scheduler.JobScheduler$JobHandler.run(JobScheduler.scala:256)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

1 Ответ

3 голосов
/ 27 апреля 2020

Вопрос в том, работает ли он должным образом от оболочки искры, почему он не работает снаружи от нее?



Ответом является ваше сообщение об ошибке:

Error message: The ORC data source must be used with Hive support enabled; 
    at com.vertica.spark.s2v.S2V.do2Stage(S2V.scala:446)

Означает Вы должны включить поддержку улья, как в этом примере, чтобы исправить эту ошибку .

 val spark = SparkSession
    .builder()
    .appName("Mr potterpod wants to test spark hive support")
    .master("local[*]")
    .config("spark.sql.warehouse.dir", warehouseLocation)
    .enableHiveSupport() // this is what I was talking about
    .getOrCreate()

Почему из spark-shell работает?

Ответ: spark-shell по умолчанию поддерживает поддержку Hive больше или равно Spark 2.0.

Доказательство: Для проверки природы по умолчанию откройте spark-shell без каких-либо параметров, затем сделайте это ...

scala> spark.sparkContext.getConf.get("spark.sql.catalogImplementation")
res3: String = hive

Если вы хотите протестируйте эту функцию, отключив поддержку кустов в spark-shell, используя spark.sql.catalogImplementation

. Опции для этого свойства ( в памяти или куст )

spark-shell --conf spark.sql.catalogImplementation=in-memory

, тогда вы также столкнетесь с той же ошибкой в ​​спарк-оболочке

Дальнейшее чтение Как включить или отключить Hive su pport в Spark-Shell через свойство Spark (Spark 1.6)?

...