当我从DStream加入PipelinedRDD和RDD时,应用程序挂起

时间:2017-02-17 07:04:29

标签: apache-spark pyspark spark-streaming spark-dataframe flume-ng

我将spark 1.6.0与Spark Streaming一起使用,并且在广泛操作方面存在一个问题。

代码示例: RDD称为“a”,其类型为:class'pyspark.rdd.PipelinedRDD'。

“a”收到:

# Load a text file and convert each line to a Row.
    lines = sc.textFile(filename)
    parts = lines.map(lambda l: l.split(","))
    clients = parts.map(lambda p: Row(client_id=int(p[0]), clientname=p[1] ...))

    # Infer the schema, and register the DataFrame as a table.
    schemaPeople = sqlContext.createDataFrame(clients)
    schemaPeople.registerTempTable("clients")

    client_list = sqlContext.sql("SELECT * FROM clients")

之后:

a = client_list.map(lambda entry: (int(entry[1]), value_from_entry(entry)))

第二部分“b”的类型为“pyspark.streaming.dstream.TransformedDStream”。 我从Flume收到“b”:

DStreamB = flumeStream.map(lambda tup: function_for_map(tup[1].encode('ascii','ignore')))

b = DStreamB.map(lambda event: (int(event[2]), value_from_event(event)))

问题是:当我尝试加入时:

mult = b.transform(lambda rdd: rdd.join(a))

我的应用程序在此阶段挂起(现在我在b.pprint()之后和舞台.join()之前显示屏幕

enter image description here

但是当我添加时:

  1. 声明RDD“test”:

    test = sc.parallelize(range(1, 100000)).map(lambda k: (k, 'value'))
    

    并且做:

    mult0 = a.join(test)
    mult = b.transform(lambda rdd: rdd.join(mult0))`
    

    然后它起作用(!!):

    screen 2

  2. 我也可以这样做:

    mult0 = b.transform(lambda rdd: rdd.join(test))
    
  3. 因此:

    我有RDDs“a”和“test”。 DStream“b”。 我可以倍增:

    • a * test * b
    • b * test

    但我不能做'b * a'。

    任何帮助表示赞赏!谢谢!

1 个答案:

答案 0 :(得分:0)

根据user6910411的建议,我将“a”缓存为

a = client_list.map(lambda entry: (int(entry[1]), value_from_entry(entry))).cache() 

问题解决了。