使用Pyspark并行化HTTP请求

时间:2017-08-31 15:58:45

标签: python apache-spark pyspark

我使用pyspark进行一些数据转换:如下所示:

df_systems_tree_users = sqlContext.read.format("jdbc") \
    .option("dbtable",
            "(select ID as SYSTEMUID,M_EXTERNAL_ID,metric,DATATRANSMISSIONFREQUENCY,MODEL,BRAND,BUILDING FROM SYSTEM  INNER JOIN SENSOR ON SYSTEM.ID=SENSOR.SYSTEMID WHERE LPWANOPERATOR='Objenious' AND M_EXTERNAL_ID!='None' )") \
    .option("url", "jdbc:phoenix:master1:2181:/hbase-unsecure") \
    .option("driver", "org.apache.phoenix.jdbc.PhoenixDriver") \
    .load()
objRDD = df_systems_tree_users.rdd.map(lambda x: getStatesAndUplink(x))

getStatesAndUplink方法使用请求python库来执行对外部api的http get请求。

我在4个执行器上运行这个spark工作,每个执行器有4个核心,但运行30分钟需要很多时间。

我的问题是如何优化我的代码以有效的方式并行化我的http请求?

1 个答案:

答案 0 :(得分:1)

documentation中所述,您必须指定4个参数:

  • partitionColumn
  • lowerBound
  • upperBound
  • numPartitions

只有使用这些选项,Spark才能并行读取 - 在其他情况下,它将在一个线程中完成。

编辑:存在Phoenix Spark plugin。它将并行化读取而不指定这4个参数。

编辑2:如果数据不平衡,方法getStatesAndUplink可能会限制外部服务。它可能只是"卡住"在一个节点上处理