[ 
https://issues.apache.org/jira/browse/BAHIR-261?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Abdul-Raheman MouhamadSultane updated BAHIR-261:
------------------------------------------------
    Priority: Minor  (was: Major)

> Integration of streaming-pubsub in Pyspark
> ------------------------------------------
>
>                 Key: BAHIR-261
>                 URL: https://issues.apache.org/jira/browse/BAHIR-261
>             Project: Bahir
>          Issue Type: Bug
>          Components: Spark Structured Streaming Connectors
>    Affects Versions: Spark-2.4.0
>         Environment: MacOS Big Sur 11.2.1
> PySpark cmd (./spark-2.4.7-bin-hadoop2.7/bin/pyspark --packages 
> org.apache.bahir:spark-streaming-pubsub_2.11:2.4.0)
>            Reporter: Abdul-Raheman MouhamadSultane
>            Priority: Minor
>              Labels: GCP, pubsub, pyspark, question, stream
>
> Hello folks 👋
>  
> I was wondering if there is a possible update that will allow to use pub/sub 
> DStream in PySpark, it does not seems to exist with the current version 
> (2.4.0).
>  
> I tried to manually instantiate the pub/sub stream from Pyspark as follow:
>  
> {code:java}
> import pyspark
> from pyspark.streaming import DStream, StreamingContext
> from pyspark.serializers import UTF8Deserializer
> ssc = StreamingContext(sc, 1)
> jlevel = ssc._sc._getJavaStorageLevel(pyspark.StorageLevel.MEMORY_AND_DISK_2)
> creds = 
> sc._jvm.org.apache.spark.streaming.pubsub.SparkGCPCredentials.Builder().jsonServiceAccount("GDCP_CREDS.json").build()
> jstream = 
> sc._jvm.org.apache.spark.streaming.pubsub.PubsubUtils.createStream(ssc._jssc, 
> "PROJECT_NAME", None, "SUB_NAME", creds, jlevel)
> dstream = DStream(jstream, ssc, UTF8Deserializer())
> ssc.start()ssc.awaitTermination()
> df.writeStream.foreachBatch(batch_processor).start().awaitTermination(){code}
>  
>  
> But I run into the following issue (*org.apache.spark.SparkException: 
> Unexpected element type class 
> org.apache.spark.streaming.pubsub.SparkPubsubMessage*)
> {code:java}
> 21/02/25 10:48:59 ERROR TaskSetManager: Task 0 in stage 2.0 failed 1 times; 
> aborting job
> 21/02/25 10:48:59 ERROR JobScheduler: Error running job streaming job 
> 1614246539000 ms.0
> org.apache.spark.SparkException: An exception was raised by Python:
> Traceback (most recent call last):
>   File 
> "/PATH/test_streaming_call/spark-2.4.7-bin-hadoop2.7/python/pyspark/streaming/util.py",
>  line 68, in call
>     r = self.func(t, *rdds)
>   File 
> "/PATH/test_streaming_call/spark-2.4.7-bin-hadoop2.7/python/pyspark/streaming/dstream.py",
>  line 173, in takeAndPrint
>     taken = rdd.take(num + 1)
>   File 
> "/PATH/test_streaming_call/spark-2.4.7-bin-hadoop2.7/python/pyspark/rdd.py", 
> line 1360, in take
>     res = self.context.runJob(self, takeUpToNumLeft, p)
>   File 
> "/PATH/test_streaming_call/spark-2.4.7-bin-hadoop2.7/python/pyspark/context.py",
>  line 1069, in runJob
>     sock_info = self._jvm.PythonRDD.runJob(self._jsc.sc(), mappedRDD._jrdd, 
> partitions)
>   File 
> "/PATH/test_streaming_call/spark-2.4.7-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py",
>  line 1257, in __call__
>     answer, self.gateway_client, self.target_id, self.name)
>   File 
> "/PATH/test_streaming_call/spark-2.4.7-bin-hadoop2.7/python/pyspark/sql/utils.py",
>  line 63, in deco
>     return f(*a, **kw)
>   File 
> "/PATH/test_streaming_call/spark-2.4.7-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py",
>  line 328, in get_return_value
>     format(target_id, ".", name), value)
> Py4JJavaError: An error occurred while calling 
> z:org.apache.spark.api.python.PythonRDD.runJob.
> : org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 
> in stage 2.0 failed 1 times, most recent failure: Lost task 0.0 in stage 2.0 
> (TID 2, localhost, executor driver): org.apache.spark.SparkException: 
> Unexpected element type class 
> org.apache.spark.streaming.pubsub.SparkPubsubMessage
>         at 
> org.apache.spark.api.python.PythonRDD$.org$apache$spark$api$python$PythonRDD$$write$1(PythonRDD.scala:221)
>         at 
> org.apache.spark.api.python.PythonRDD$$anonfun$writeIteratorToStream$1.apply(PythonRDD.scala:224)
>         at 
> org.apache.spark.api.python.PythonRDD$$anonfun$writeIteratorToStream$1.apply(PythonRDD.scala:224)
>         at scala.collection.Iterator$class.foreach(Iterator.scala:891)
>         at 
> org.apache.spark.util.CompletionIterator.foreach(CompletionIterator.scala:25)
>         at 
> org.apache.spark.api.python.PythonRDD$.writeIteratorToStream(PythonRDD.scala:224)
>         at 
> org.apache.spark.api.python.PythonRunner$$anon$2.writeIteratorToStream(PythonRunner.scala:561)
>         at 
> org.apache.spark.api.python.BasePythonRunner$WriterThread$$anonfun$run$1.apply(PythonRunner.scala:346)
>         at 
> org.apache.spark.util.Utils$.logUncaughtExceptions(Utils.scala:1945)
>         at 
> org.apache.spark.api.python.BasePythonRunner$WriterThread.run(PythonRunner.scala:195)Driver
>  stacktrace:
>         at 
> org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1925)
>         at 
> org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1913)
>         at 
> org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1912)
>         at 
> scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
>         at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
>         at 
> org.apache.spark.scheduler.DAGScheduler.abortStage(DAGScheduler.scala:1912)
>         at 
> org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:948)
>         at 
> org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:948)
>         at scala.Option.foreach(Option.scala:257)
>         at 
> org.apache.spark.scheduler.DAGScheduler.handleTaskSetFailed(DAGScheduler.scala:948)
>         at 
> org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.doOnReceive(DAGScheduler.scala:2146)
>         at 
> org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:2095)
>         at 
> org.apache.spark.scheduler.DAGSchedulerEventProcessLoop.onReceive(DAGScheduler.scala:2084)
>         at org.apache.spark.util.EventLoop$$anon$1.run(EventLoop.scala:49)
>         at 
> org.apache.spark.scheduler.DAGScheduler.runJob(DAGScheduler.scala:759)
>         at org.apache.spark.SparkContext.runJob(SparkContext.scala:2061)
>         at org.apache.spark.SparkContext.runJob(SparkContext.scala:2082)
>         at org.apache.spark.SparkContext.runJob(SparkContext.scala:2101)
>         at org.apache.spark.api.python.PythonRDD$.runJob(PythonRDD.scala:153)
>         at org.apache.spark.api.python.PythonRDD.runJob(PythonRDD.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 py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
>         at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
>         at py4j.Gateway.invoke(Gateway.java:282)
>         at 
> py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
>         at py4j.commands.CallCommand.execute(CallCommand.java:79)
>         at py4j.GatewayConnection.run(GatewayConnection.java:238)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: org.apache.spark.SparkException: Unexpected element type class 
> org.apache.spark.streaming.pubsub.SparkPubsubMessage
>         at 
> org.apache.spark.api.python.PythonRDD$.org$apache$spark$api$python$PythonRDD$$write$1(PythonRDD.scala:221)
>         at 
> org.apache.spark.api.python.PythonRDD$$anonfun$writeIteratorToStream$1.apply(PythonRDD.scala:224)
>         at 
> org.apache.spark.api.python.PythonRDD$$anonfun$writeIteratorToStream$1.apply(PythonRDD.scala:224)
>         at scala.collection.Iterator$class.foreach(Iterator.scala:891)
>         at 
> org.apache.spark.util.CompletionIterator.foreach(CompletionIterator.scala:25)
>         at 
> org.apache.spark.api.python.PythonRDD$.writeIteratorToStream(PythonRDD.scala:224)
>         at 
> org.apache.spark.api.python.PythonRunner$$anon$2.writeIteratorToStream(PythonRunner.scala:561)
>         at 
> org.apache.spark.api.python.BasePythonRunner$WriterThread$$anonfun$run$1.apply(PythonRunner.scala:346)
>         at 
> org.apache.spark.util.Utils$.logUncaughtExceptions(Utils.scala:1945)
>         at 
> org.apache.spark.api.python.BasePythonRunner$WriterThread.run(PythonRunner.scala:195)
>         at 
> org.apache.spark.streaming.api.python.TransformFunction.callPythonTransformFunction(PythonDStream.scala:95)
>         at 
> org.apache.spark.streaming.api.python.TransformFunction.apply(PythonDStream.scala:78)
>         at 
> org.apache.spark.streaming.api.python.PythonDStream$$anonfun$callForeachRDD$1.apply(PythonDStream.scala:179)
>         at 
> org.apache.spark.streaming.api.python.PythonDStream$$anonfun$callForeachRDD$1.apply(PythonDStream.scala:179)
>         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)
> {code}
> Seems that the receiver *store* data in internal format called 
> *SparkPubsubMessage* format 
> ([https://github.com/apache/bahir/blob/62df1108145ee0305c5c7416a7dadeae5930aab8/streaming-pubsub/src/main/scala/org/apache/spark/streaming/pubsub/PubsubInputDStream.scala#L68)]
>  
> Is there a way to make RDD in python interpret the *SparkPubsubMessage* 
> object ?
>  
> Thanks a lot, feel free to ask details if needed :D !
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to