/ gnu parallel

Brincando com o GNU parallel

Gnu Parallel

O GNU parallel é um ferramenta muito poderosa que pode executar os seus programas (shell script, python, java e etc) em paralelo em varias maquinas. Complicada de ser usada porem, a sua documentação é bem completa e lotada de exemplos: http://www.gnu.org/software/parallel/parallel_tutorial.html

O meu exemplo que vou mostrar que de ler um arquivo com 8080000 e fazer insert no MySQL utilizando Python sem utilizar qualquer habilidade de paralelismo em python, somente na chamada do software feita via o GNU parallel. O código em python é bem simples:

 #!/usr/bin/env python 
# -*- coding: iso-8859-15 -*- 
import sys 
import MySQLdb 
import datetime 
print "Iniciando importação do arquivo ("+ str(sys.argv[1]) +"): " + str(datetime.datetime.now()) 
f = open(sys.argv[1],"r") 
con = MySQLdb.connect(host='127.0.0.1', user='root', passwd='root',db='tmp') 
c = con.cursor() for linha in f: 
  c.execute("INSERT INTO teste VALUES (%s)",linha) 
  #print ("INSERT INTO teste VALUES (%s)",linha) 
con.commit() 
c.close() 
con.close() print "Terminou em : " + str(datetime.datetime.now())

Vamos a execução simples lendo o arquivo:

mac-tadeucruz:~ tadeucruz$ time ./tst.py arquivoGiganteMesmo 
Iniciando importação do arquivo (arquivoGiganteMesmo): 2013-09-07 12:43:13.554324 Terminou em : 2013-09-07 12:57:32.932870 
real 14m19.552s user 3m22.196s sys 1m44.406s 
mac-tadeucruz:~ tadeucruz$

Agora vem o poder do GNU parallel, somente na chamada do programa conseguimos separar os arquivos com o numero de linhas que desejamos (-N100000), informar quantas chamadas de programas podem ser executado em paralelo sem modificar o código em python. Abaixo a execução de modo simples e com os valores chutados para o numero de jobs e do split dos arquivos :D.

mac-tadeucruz:~ tadeucruz$ time cat arquivoGiganteMesmo |parallel --pipe -N100000 -j 8 'cat > /tmp/parallel_test_{#}; python tst.py /tmp/parallel_test_{#}' parallel: Warning: A full record was not matched in a block. Increasing to --blocksize 1363150 parallel: Warning: A full record was not matched in a block. Increasing to --blocksize 1772096 parallel: Warning: A full record was not matched in a block. Increasing to --blocksize 2303726 Iniciando importação do arquivo (/tmp/parallel_test_3): 2013-09-07 12:59:04.140435 Terminou em : 2013-09-07 12:59:25.564032 Iniciando importação do arquivo (/tmp/parallel_test_2): 2013-09-07 12:59:04.081028 Terminou em : 2013-09-07 12:59:25.532993 Iniciando importação do arquivo (/tmp/parallel_test_1): 2013-09-07 12:59:04.038172 Terminou em : 2013-09-07 12:59:25.528484 Iniciando importação do arquivo (/tmp/parallel_test_5): 2013-09-07 12:59:04.255318 Terminou em : 2013-09-07 12:59:25.731718 Iniciando importação do arquivo (/tmp/parallel_test_4): 2013-09-07 12:59:04.197139 Terminou em : 2013-09-07 12:59:25.812025 Iniciando importação do arquivo (/tmp/parallel_test_8): 2013-09-07 12:59:04.493999 Terminou em : 2013-09-07 12:59:25.902990 Iniciando importação do arquivo (/tmp/parallel_test_7): 2013-09-07 12:59:04.395691 Terminou em : 2013-09-07 12:59:25.916693 Iniciando importação do arquivo (/tmp/parallel_test_6): 2013-09-07 12:59:04.311710 Terminou em : 2013-09-07 12:59:25.825379 Iniciando importação do arquivo (/tmp/parallel_test_10): 2013-09-07 12:59:25.779596 Terminou em : 2013-09-07 12:59:47.366380 Iniciando importação do arquivo (/tmp/parallel_test_9): 2013-09-07 12:59:25.729972 Terminou em : 2013-09-07 12:59:47.316062 Iniciando importação do arquivo (/tmp/parallel_test_12): 2013-09-07 12:59:25.923218 Terminou em : 2013-09-07 12:59:47.507909 Iniciando importação do arquivo (/tmp/parallel_test_11): 2013-09-07 12:59:25.845911 Terminou em : 2013-09-07 12:59:47.473447 Iniciando importação do arquivo (/tmp/parallel_test_13): 2013-09-07 12:59:25.986016 Terminou em : 2013-09-07 12:59:47.660657 Iniciando importação do arquivo (/tmp/parallel_test_14): 2013-09-07 12:59:26.064241 Terminou em : 2013-09-07 12:59:47.676953 Iniciando importação do arquivo (/tmp/parallel_test_15): 2013-09-07 12:59:26.144381 Terminou em : 2013-09-07 12:59:47.753178 Iniciando importação do arquivo (/tmp/parallel_test_16): 2013-09-07 12:59:26.224373 Terminou em : 2013-09-07 12:59:47.883110 Iniciando importação do arquivo (/tmp/parallel_test_24): 2013-09-07 12:59:48.002237 Terminou em : 2013-09-07 13:00:10.624973 Iniciando importação do arquivo (/tmp/parallel_test_23): 2013-09-07 12:59:47.928754 Terminou em : 2013-09-07 13:00:10.614774 Iniciando importação do arquivo (/tmp/parallel_test_22): 2013-09-07 12:59:47.853943 Terminou em : 2013-09-07 13:00:10.534407 Iniciando importação do arquivo (/tmp/parallel_test_21): 2013-09-07 12:59:47.788513 Terminou em : 2013-09-07 13:00:10.519201 Iniciando importação do arquivo (/tmp/parallel_test_20): 2013-09-07 12:59:47.721100 Terminou em : 2013-09-07 13:00:10.479861 Iniciando importação do arquivo (/tmp/parallel_test_19): 2013-09-07 12:59:47.680146 Terminou em : 2013-09-07 13:00:10.450647 Iniciando importação do arquivo (/tmp/parallel_test_18): 2013-09-07 12:59:47.566300 Terminou em : 2013-09-07 13:00:10.438301 Iniciando importação do arquivo (/tmp/parallel_test_17): 2013-09-07 12:59:47.494297 Terminou em : 2013-09-07 13:00:10.332406 Iniciando importação do arquivo (/tmp/parallel_test_29): 2013-09-07 13:00:11.640717 Terminou em : 2013-09-07 13:00:34.050611 Iniciando importação do arquivo (/tmp/parallel_test_28): 2013-09-07 13:00:11.561615 Terminou em : 2013-09-07 13:00:34.002774 Iniciando importação do arquivo (/tmp/parallel_test_27): 2013-09-07 13:00:11.492844 Terminou em : 2013-09-07 13:00:34.000185 Iniciando importação do arquivo (/tmp/parallel_test_26): 2013-09-07 13:00:11.426481 Terminou em : 2013-09-07 13:00:33.854380 Iniciando importação do arquivo (/tmp/parallel_test_25): 2013-09-07 13:00:11.371262 Terminou em : 2013-09-07 13:00:33.770446 Iniciando importação do arquivo (/tmp/parallel_test_32): 2013-09-07 13:00:11.876941 Terminou em : 2013-09-07 13:00:34.300271 Iniciando importação do arquivo (/tmp/parallel_test_31): 2013-09-07 13:00:11.832811 Terminou em : 2013-09-07 13:00:34.203030 Iniciando importação do arquivo (/tmp/parallel_test_30): 2013-09-07 13:00:11.733957 Terminou em : 2013-09-07 13:00:34.181630 Iniciando importação do arquivo (/tmp/parallel_test_40): 2013-09-07 13:00:34.748505 Terminou em : 2013-09-07 13:00:57.386107 Iniciando importação do arquivo (/tmp/parallel_test_39): 2013-09-07 13:00:34.665373 Terminou em : 2013-09-07 13:00:57.342095 Iniciando importação do arquivo (/tmp/parallel_test_38): 2013-09-07 13:00:34.571066 Terminou em : 2013-09-07 13:00:57.300464 Iniciando importação do arquivo (/tmp/parallel_test_37): 2013-09-07 13:00:34.462575 Terminou em : 2013-09-07 13:00:57.212343 Iniciando importação do arquivo (/tmp/parallel_test_36): 2013-09-07 13:00:34.397192 Terminou em : 2013-09-07 13:00:57.220788 Iniciando importação do arquivo (/tmp/parallel_test_35): 2013-09-07 13:00:34.335466 Terminou em : 2013-09-07 13:00:57.168574 Iniciando importação do arquivo (/tmp/parallel_test_34): 2013-09-07 13:00:34.273930 Terminou em : 2013-09-07 13:00:57.107431 Iniciando importação do arquivo (/tmp/parallel_test_33): 2013-09-07 13:00:34.245024 Terminou em : 2013-09-07 13:00:57.083016 Iniciando importação do arquivo (/tmp/parallel_test_44): 2013-09-07 13:00:58.284316 Terminou em : 2013-09-07 13:01:20.737677 Iniciando importação do arquivo (/tmp/parallel_test_46): 2013-09-07 13:00:58.399885 Terminou em : 2013-09-07 13:01:20.757263 Iniciando importação do arquivo (/tmp/parallel_test_45): 2013-09-07 13:00:58.335097 Terminou em : 2013-09-07 13:01:20.756538 Iniciando importação do arquivo (/tmp/parallel_test_43): 2013-09-07 13:00:58.235875 Terminou em : 2013-09-07 13:01:20.680664 Iniciando importação do arquivo (/tmp/parallel_test_42): 2013-09-07 13:00:58.200798 Terminou em : 2013-09-07 13:01:20.632231 Iniciando importação do arquivo (/tmp/parallel_test_41): 2013-09-07 13:00:58.158214 Terminou em : 2013-09-07 13:01:20.632424 Iniciando importação do arquivo (/tmp/parallel_test_48): 2013-09-07 13:00:58.552426 Terminou em : 2013-09-07 13:01:20.928383 Iniciando importação do arquivo (/tmp/parallel_test_47): 2013-09-07 13:00:58.482741 Terminou em : 2013-09-07 13:01:20.887160 Iniciando importação do arquivo (/tmp/parallel_test_56): 2013-09-07 13:01:21.352022 Terminou em : 2013-09-07 13:01:43.978159 Iniciando importação do arquivo (/tmp/parallel_test_55): 2013-09-07 13:01:21.299097 Terminou em : 2013-09-07 13:01:43.973215 Iniciando importação do arquivo (/tmp/parallel_test_54): 2013-09-07 13:01:21.224712 Terminou em : 2013-09-07 13:01:43.972154 Iniciando importação do arquivo (/tmp/parallel_test_53): 2013-09-07 13:01:21.171747 Terminou em : 2013-09-07 13:01:43.883031 Iniciando importação do arquivo (/tmp/parallel_test_52): 2013-09-07 13:01:21.081758 Terminou em : 2013-09-07 13:01:43.841214 Iniciando importação do arquivo (/tmp/parallel_test_51): 2013-09-07 13:01:21.003631 Terminou em : 2013-09-07 13:01:43.841046 Iniciando importação do arquivo (/tmp/parallel_test_50): 2013-09-07 13:01:20.931655 Terminou em : 2013-09-07 13:01:43.649009 Iniciando importação do arquivo (/tmp/parallel_test_49): 2013-09-07 13:01:20.909307 Terminou em : 2013-09-07 13:01:43.673769 Iniciando importação do arquivo (/tmp/parallel_test_61): 2013-09-07 13:01:45.006056 Terminou em : 2013-09-07 13:02:07.478467 Iniciando importação do arquivo (/tmp/parallel_test_60): 2013-09-07 13:01:44.931471 Terminou em : 2013-09-07 13:02:07.416445 Iniciando importação do arquivo (/tmp/parallel_test_59): 2013-09-07 13:01:44.888272 Terminou em : 2013-09-07 13:02:07.334330 Iniciando importação do arquivo (/tmp/parallel_test_58): 2013-09-07 13:01:44.830278 Terminou em : 2013-09-07 13:02:07.264803 Iniciando importação do arquivo (/tmp/parallel_test_57): 2013-09-07 13:01:44.735322 Terminou em : 2013-09-07 13:02:07.211841 Iniciando importação do arquivo (/tmp/parallel_test_64): 2013-09-07 13:01:45.326177 Terminou em : 2013-09-07 13:02:07.702834 Iniciando importação do arquivo (/tmp/parallel_test_63): 2013-09-07 13:01:45.224707 Terminou em : 2013-09-07 13:02:07.604323 Iniciando importação do arquivo (/tmp/parallel_test_62): 2013-09-07 13:01:45.129806 Terminou em : 2013-09-07 13:02:07.526345 Iniciando importação do arquivo (/tmp/parallel_test_72): 2013-09-07 13:02:08.108142 Terminou em : 2013-09-07 13:02:30.718348 Iniciando importação do arquivo (/tmp/parallel_test_71): 2013-09-07 13:02:08.032702 Terminou em : 2013-09-07 13:02:30.692496 Iniciando importação do arquivo (/tmp/parallel_test_70): 2013-09-07 13:02:07.934592 Terminou em : 2013-09-07 13:02:30.657136 Iniciando importação do arquivo (/tmp/parallel_test_69): 2013-09-07 13:02:07.842209 Terminou em : 2013-09-07 13:02:30.603386 Iniciando importação do arquivo (/tmp/parallel_test_68): 2013-09-07 13:02:07.777486 Terminou em : 2013-09-07 13:02:30.547846 Iniciando importação do arquivo (/tmp/parallel_test_67): 2013-09-07 13:02:07.714291 Terminou em : 2013-09-07 13:02:30.456079 Iniciando importação do arquivo (/tmp/parallel_test_66): 2013-09-07 13:02:07.661779 Terminou em : 2013-09-07 13:02:30.438521 Iniciando importação do arquivo (/tmp/parallel_test_65): 2013-09-07 13:02:07.645986 Terminou em : 2013-09-07 13:02:30.428696 Iniciando importação do arquivo (/tmp/parallel_test_74): 2013-09-07 13:02:31.582967 Terminou em : 2013-09-07 13:02:54.091581 Iniciando importação do arquivo (/tmp/parallel_test_73): 2013-09-07 13:02:31.554669 Terminou em : 2013-09-07 13:02:54.114477 Iniciando importação do arquivo (/tmp/parallel_test_75): 2013-09-07 13:02:31.656460 Terminou em : 2013-09-07 13:02:54.218899 Iniciando importação do arquivo (/tmp/parallel_test_76): 2013-09-07 13:02:31.732328 Terminou em : 2013-09-07 13:02:54.300030 Iniciando importação do arquivo (/tmp/parallel_test_77): 2013-09-07 13:02:31.763734 Terminou em : 2013-09-07 13:02:54.396711 Iniciando importação do arquivo (/tmp/parallel_test_78): 2013-09-07 13:02:31.906018 Terminou em : 2013-09-07 13:02:54.435246 Iniciando importação do arquivo (/tmp/parallel_test_79): 2013-09-07 13:02:31.974130 Terminou em : 2013-09-07 13:02:54.514689 Iniciando importação do arquivo (/tmp/parallel_test_80): 2013-09-07 13:02:32.020529 Terminou em : 2013-09-07 13:02:54.551570 Iniciando importação do arquivo (/tmp/parallel_test_81): 2013-09-07 13:02:54.340778 Terminou em : 2013-09-07 13:03:03.045623 
real 3m59.654s user 7m14.517s sys 3m6.999s mac-tadeucruz:~ tadeucruz$

A diferença de tempo foi de 10 minutos, e com o SpeedUP de 3.5. Acho que esse vai ser somente o primeiro de muitos artigos sobre essa poderosa ferramenta.