各プロセスで1)Oracle dbを接続して特定のテーブルを読み取り、2)データフレームを作成して処理する2つのプロセスがあります。 3)dfをcassandraに保存します。
両方のプロセスを並行して実行している場合、両方がOracleからの読み取りを試行し、2番目のプロセスがデータを読み取るときにエラーが発生します
ERROR ValsProcessor2: org.Apache.spark.sql.catalyst.errors.package$TreeNodeException: execute, tree:
Exchange SinglePartition
+- *(1) HashAggregate(keys=[], functions=[partial_count(1)], output=[count#290L])
+- *(1) Scan JDBCRelation((SELECT * FROM BM_VALS WHERE ROWNUM <= 10) T) [numPartitions=2] [] PushedFilters: [], ReadSchema: struct<>
at org.Apache.spark.sql.catalyst.errors.package$.attachTree(package.scala:56)
at org.Apache.spark.sql.execution.exchange.ShuffleExchangeExec.doExecute(ShuffleExchangeExec.scala:119)
at org.Apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:131)
at org.Apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:127)
at org.Apache.spark.sql.execution.SparkPlan$$anonfun$executeQuery$1.apply(SparkPlan.scala:155)
at org.Apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
at org.Apache.spark.sql.execution.SparkPlan.executeQuery(SparkPlan.scala:152)
at org.Apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:127)
at org.Apache.spark.sql.execution.InputAdapter.inputRDDs(WholeStageCodegenExec.scala:371)
at org.Apache.spark.sql.execution.aggregate.HashAggregateExec.inputRDDs(HashAggregateExec.scala:150)
at org.Apache.spark.sql.execution.WholeStageCodegenExec.doExecute(WholeStageCodegenExec.scala:605)
at org.Apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:131)
at org.Apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:127)
at org.Apache.spark.sql.execution.SparkPlan$$anonfun$executeQuery$1.apply(SparkPlan.scala:155)
at org.Apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)
at org.Apache.spark.sql.execution.SparkPlan.executeQuery(SparkPlan.scala:152)
at org.Apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:127)
at org.Apache.spark.sql.execution.SparkPlan.getByteArrayRdd(SparkPlan.scala:247)
at org.Apache.spark.sql.execution.SparkPlan.executeCollect(SparkPlan.scala:294)
at org.Apache.spark.sql.Dataset$$anonfun$count$1.apply(Dataset.scala:2770)
at org.Apache.spark.sql.Dataset$$anonfun$count$1.apply(Dataset.scala:2769)
at org.Apache.spark.sql.Dataset$$anonfun$52.apply(Dataset.scala:3254)
at org.Apache.spark.sql.execution.SQLExecution$.withNewExecutionId(SQLExecution.scala:77)
at org.Apache.spark.sql.Dataset.withAction(Dataset.scala:3253)
at org.Apache.spark.sql.Dataset.count(Dataset.scala:2769)
at com.snp.processors.BenchmarkModelValsProcessor2.process(BenchmarkModelValsProcessor2.scala:43)
at com.snp.utils.Utils$$anonfun$getAllDefinedProcessors$2.apply(Utils.scala:28)
at com.snp.utils.Utils$$anonfun$getAllDefinedProcessors$2.apply(Utils.scala:28)
at com.sp.MigrationDriver$$anonfun$main$2$$anonfun$apply$1.apply(MigrationDriver.scala:78)
at com.sp.MigrationDriver$$anonfun$main$2$$anonfun$apply$1.apply(MigrationDriver.scala:78)
at scala.Option.map(Option.scala:146)
at com.sp.MigrationDriver$$anonfun$main$2.apply(MigrationDriver.scala:75)
at com.sp.MigrationDriver$$anonfun$main$2.apply(MigrationDriver.scala:74)
at scala.collection.Iterator$class.foreach(Iterator.scala:891)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1334)
at scala.collection.MapLike$DefaultKeySet.foreach(MapLike.scala:174)
at com.sp.MigrationDriver$.main(MigrationDriver.scala:74)
at com.sp.MigrationDriver.main(MigrationDriver.scala)
Caused by: Java.lang.NullPointerException
at org.Apache.spark.sql.execution.exchange.ShuffleExchangeExec$.needToCopyObjectsBeforeShuffle(ShuffleExchangeExec.scala:163)
at org.Apache.spark.sql.execution.exchange.ShuffleExchangeExec$.prepareShuffleDependency(ShuffleExchangeExec.scala:300)
at org.Apache.spark.sql.execution.exchange.ShuffleExchangeExec.prepareShuffleDependency(ShuffleExchangeExec.scala:91)
at org.Apache.spark.sql.execution.exchange.ShuffleExchangeExec$$anonfun$doExecute$1.apply(ShuffleExchangeExec.scala:128)
at org.Apache.spark.sql.execution.exchange.ShuffleExchangeExec$$anonfun$doExecute$1.apply(ShuffleExchangeExec.scala:119)
at org.Apache.spark.sql.catalyst.errors.package$.attachTree(package.scala:52)
... 37 more
ここで何が間違っていますか?これを修正するには?
最初のプロセッサ/呼び出されるクラスの最終ブロックでsparkSessionを閉じていました。私はそれをプロセッサから移動し、問題を解決した呼び出しクラス内に配置しました。
本当の原因についてはわかりませんが、目を引いたのはSQL式に従うことだけです:(SELECT * FROM BM_VALS WHERE ROWNUM <= 10) T
-T
の意味は?
全体的な設計に関しては、まったく異なるアプローチをお勧めします。あなたの場合、Oracleから収集された同じデータを処理する2つのプロセッサがあり、各プロセッサが個別にデータをフェッチします。 Oracleデータの読み取りを、データフレームを返す別の手順に移動することをお勧めします(キャッシュする必要があります)。その後、プロセッサはそのデータフレームで動作し、データをCassandraに保持します。
または、以前に推奨されたように、ジョブを2つの部分に分離できます。1つはOracleからすべてのデータを取得し、データフレームをディスクに保存します(persist
ではなく、write
を使用) 、たとえば、Parquetファイルとして。そして、ディスクからデータを取得し、必要な変換を実行するジョブを分離します。
両方のシナリオで