如何跨EMR群集中的节点运行python代码

时间:2018-09-09 17:27:38

标签: python pandas pyspark amazon-emr

我有一个Amazon EMR集群-30个节点 我的Python代码看起来像这样-

spark = SparkSession \
        .builder \
        .appName("App") \
        .config(conf=sparkConf) \
        .getOrCreate()

def fetchCatData(cat, tableName):
    df_gl = spark.sql("select * from {} where category = {}".format(tableName, cat))
    df_pandas = df_gl.select("*").toPandas()
    df_pandas.to_csv("/tmp/split/{}_{}.csv".format(tableName, cat))

catList = [14, 15, 63, 65, 74, 21, 23, 60, 79, 86, 107, 147, 196, 199, 200, 201, 229, 263, 265, 267, 328, 421, 468, 469,504]
tableList = ["Table1","Table2"
             ,"Table3",
             "Table4", "Table5", "Table6",
             "Table7"
             ]

def main(args):
    log4jLogger = spark._jvm.org.apache.log4j
    LOGGER = log4jLogger.LogManager.getLogger(__name__)

    for table in tableList:
        LOGGER.info("Starting Split for {}".format(table))
        dataLocation = "s3://test/APP/{}".format( table)
        df = spark.read.parquet(dataLocation)
        df = df.repartition("CATEGORY").cache()
        df.createOrReplaceTempView(table)
        for cat in catList:
            fetchGLData(cat, table)

我要解决以下问题-

  1. 基本上,我想读取我的实木复合地板数据,按类别划分并将其存储为csv中的pandas数据框。
  2. 当前我按顺序运行此程序,我想与EMR节点上运行的每个类别并行运行此程序
  3. 我尝试使用多处理,但对结果不满意。

在最少的时间内解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

不确定为什么要转换为pandas数据框,但使用从spark sql创建的spark数据框,可以直接写入csv。

但是,如果要将csv作为一个文件,则需要重新分区为1,这将不会使用所有节点。如果您不担心它会生成多少个文件,则可以对数据帧重新分区以包括更多分区。然后,每个分区将由节点处理并输出,直到完成所有分区为止。

单个文件未使用所有节点(注意.csv将是包含实际csv的文件夹)

df_gl = spark.sql("select * from {} where category = {}".format(tableName, cat)) df_gl.repartition(1).write.mode("overwrite").csv("/tmp/split/{}_{}.csv".format(tableName, cat))

使用多个节点的并行处理并输出为多个拆分文件(注意.csv将是包含实际csv的文件夹)

df_gl = spark.sql("select * from {} where category = {}".format(tableName, cat)).repartition(10) df_gl.write.mode("overwrite").csv("/tmp/split/{}_{}.csv".format(tableName, cat))