U-SQL Python扩展:性能非常慢

时间:2017-09-08 12:02:46

标签: python u-sql

我做的事情似乎微不足道,花费的时间比我预期的要长得多。我正在加载一个70MB的文件,通过一个调用Python脚本的reducer运行它,该脚本不会修改数据,并将数据写回一个新文件。

当我通过Python脚本运行它需要42分钟,如果我不这样做,则需要不到一分钟(包括编译)。

我试图理解:

  • 我做错了什么?

  • 引擎盖下面发生了什么这么长时间?

我将输入和输出文件存储在Azure Data Lake Store上。我使用并行性1,一个大约70MB(2000行,2列)的TSV输入文件。我只是传递数据。工作结束需要42分钟。

我用这个Python脚本生成了测试输入数据:

import base64

# create a roughly 70MB TSV file with 2000 rows and 2 columns: ID (integer) and roughly 30KB data (string)
fo = open('testinput.tsv', 'wb')
for i in range(2000):
    fo.write(str(i).encode() + b'\t' + base64.b85encode(bytearray(os.urandom(30000))) + b'\n')
fo.close()

这是我使用的U-SQL脚本:

REFERENCE ASSEMBLY [ExtPython];

DECLARE @myScript = @"
def usqlml_main(df):
    return df
";

@step1 = 
 EXTRACT 
    col1 string,
    col2 string
 FROM "/test/testinput.tsv" USING Extractors.Tsv();;

@step2 =
 REDUCE @ncsx_files ON col1
 PRODUCE col1 string, col2 string
 USING new Extension.Python.Reducer(pyScript:@myScript);

OUTPUT @step2
 TO "/test/testoutput.csv"
 USING Outputters.Tsv(outputHeader: true);

2 个答案:

答案 0 :(得分:1)

我有同样的问题。

我有一个116 MB的csv文件我想读(然后做东西)。当试图读取文件而在python脚本中什么都不做时它会在5小时后超时,我甚至尝试将文件减少到9,28 mb,它也会在5小时后超时。

然而,当减少到1,32 mb时,工作在16分钟后完成。 (结果如预期的那样)。

REFERENCE ASSEMBLY [ExtPython];

DECLARE @myScript = @"
def usqlml_main(df):
    return df
";

@train = 
    EXTRACT txt string,
            casegroup string
    FROM "/test/t.csv"
    USING Extractors.Csv();
@train =
    SELECT *,
        1 AS Order
    FROM @train
ORDER BY Order
FETCH 10000;

@train =
    SELECT txt,
        casegroup
    FROM @train;  // 1000 rows: 16 mins, 10000 rows: times out at 5 hours.

@m  =
    REDUCE @train ON txt, casegroup
    PRODUCE txt string, casegroup string
    USING new Extension.Python.Reducer(pyScript:@myScript);

OUTPUT @m
TO "/test/t_res.csv"
USING Outputters.Csv();

答案 1 :(得分:1)

REDUCE @ROWSET ALL

如果不减少ALL,它将在每行调用python函数。

如果您要使用并行性,则可以创建临时组以减少并行化。