在for循环中使用python的子进程模块批量创建配置单元表

时间:2017-03-06 17:57:23

标签: python hive subprocess

我有一个inputList,它有要创建的表名,这个列表可能有2000个名字。

例如:

inputList = ['model_0001', 'model_0002', 'model_0003', ..., 'model_1000']

我使用以下涉及子进程模块的python代码创建了很多hive表,现在我必须小心处理并更改传递给for-loop的列表参数(参见0,20 in代码) 。将hive表创建过程提交给hive集群,并且它并行运行这些进程。我想使用参数控制它,可以提交多少个并行表创建过程。然后代码可以在没有任何干预的情况下运行。

我还想要,如果提交了20个工作并且1个工作完成,那么下一个工作就会开始,基本上在任何时候只有20个工作正在运行。

createTablecmd2 = "CREATE TABLE {tableName}_modified AS SELECT k.{tableName}, col2  FROM  {tableName} as d  left outer join table3 as k on d.col4 = k.col4 "


## Creating tables from 1 to 20, inputList[0] corresponds to model_0001 and inputList[19] corresponds to model_0020

for currTable in inputList[0:20]:    
    sqlstmt = createTablecmd2.format(tableName = currTable)
    cmd3 = "hive -e '{stmt}'".format(stmt = sqlstmt)
    print "submitting command", cmd3
    %time result = subprocess.Popen(cmd3, shell = True , stdout=subprocess.PIPE, stdin=subprocess.PIPE)

2 个答案:

答案 0 :(得分:1)

关键问题是你是在纱线上运行还是独立运行。如果您使用Yarn运行,请查看群集管理器。您的群集可能超额订阅。 添加有关环境的更多详细信息。如果在纱线上查看作业历史记录服务器以查看作业的详细信息。它会告诉你发生了什么。添加有关您环境的更多详细信息。

答案 1 :(得分:0)

这就是我在子进程中使用.wait()对象解决95%问题的方法。

inputList = ['model_0001', 'model_0002', 'model_0003', ..., 'model_1000']

import subprocess
batchsize = 20

createTablecmd2 = "CREATE TABLE {tableName}_modified AS SELECT k.{tableName}, col2  FROM  {tableName} as d  left outer join table3 as k on d.col4 = k.col4 "

for currTable in xrange(0, len(inputList),batchsize):
    batch = inputList[currTable:currTable+batchsize]
    for i in batch:
        sqlstmt = createTablecmd2.format(tableName = i)
        cmd3 = "hive -e 'use dbname2; {stmt}'".format(stmt = sqlstmt)
        print "submitting command", cmd3
        %time result = subprocess.Popen(cmd3, shell = True,stdout=subprocess.PIPE, stdin=subprocess.PIPE)
    result.wait()

内部for循环完成后,进程等待子进程完成,然后启动另一批hive作业。这不是我想要的100%,但它目前符合我的目的。它是同步解决方案。对于例如如果批处理包含model_id_0020 .to ... model_id_0040,它将等待最后一个进程,即在开始下一批hadoop / hive作业之前完成model_id_0040。但是,假设model_id_0040(当前批次中的最后一个)在3-4个其他作业之前完成,它将启动另一个批次。所以在这种情况下它可以是异步的。

我们都知道Hadoop / hive作业可以在不同的时间完成,即使它是完全相同的过程,在我的特定情况下复制相同的表结构。