2017-10-09 20 views
0

Je cours un assez simple, ou alors je pense, l'exercice, donc je dois faire quelque chose de vraiment stupide. Mais j'ai manqué d'options ... alors voici la question. J'utilise dask distribué pour charger des données à partir d'une table de parquet ruche/snappy/80files, 400M/lignes, 8 colonnes, dont, en désespoir de cause, je ne lis qu'une colonne et en calcule la somme, en vain. J'utilise des contraintes de mémoire pour l'utilisation de la mémoire forcée faible, mais ces limites sont ignorées.dask distribué grabing toute la mémoire disponible + échange

dask-worker tcp://192.168.33.233:8786 --memory-limit 2e9 --local-directory scratch --nprocs 2 --nthreads 4 

en cours d'exécution sur un ordinateur portable

c=Client("192.168.33.233:8786") 

Client 
Scheduler: tcp://192.168.33.233:8787 
Dashboard: http://192.168.33.233:8787 


Cluster 
    Workers: 2 
    Cores: 8 
    Memory: 4.00 GB 

ddf=dd.read_parquet(os.path.join(parquet_dir,"user_logs.parq"),columns=['num_100']) 

%%time 
ddf.num_100.sum().compute() 

A ce stade, les travailleurs vont essayer de prendre toute la mémoire jusqu'à ce que les effondrements d'ordinateur et je reçois une erreur de mémoire

Voici une liste des packages et des versions installée.

paquets dans l'environnement à/home/julian/anaconda3/envs/WSM:

# flèche cpp 0.7.0 py35_2 Conda-Forge bkcharts 0,2 py35_0
eau de javel 1.5.0 py35_0
bokeh 0,12 .7 py35_0
certifi 28/02/2016 py35_0
cliquez sur 6,7 py35_0 Conda-Forge cloudpickle 0.4.0 py35_0
cycleur 0.10.0 py35_0
cython 0,27 py35_0 conda-forge dask 0.15.2 py35_0
dask-core 0.15.3 py_0 conda-forge dbus 01/10/20 0
décorateur 4.1.2 py35_0
distribué 1.18.1 py35_0
entrypoints 0,2. 3 py35_0
annonce 2.1.0 0
fastparquet 0.1.2 py35_0 conda-forge fontconfig 2.12.1 3
freetype 2.5.5 2
glib 2.50.2 1
gst-plugins-carte 1.8.0 0
gstreamer 1.8.0 0
heapdict 1.0.0 py35_0 conda-forge html5lib 0,9999999 py35_0
icu 54,1 0
ipykernel 4.6.1 py35_0
ipython 6.1.0 py35_0
ipython_genutils 0.2.0 py35_0
ipywidgets 6.0.0 py35_0
jedi 0.10.2 py35_2
jinja2 2.9.6 py35_0
jpeg 9b 0
jsonschema 2.6.0 py35_0
jupyter 1.0.0 py35_3
jupyter_client 5.1.0 py35_0
jupyter_console 5,2.0 py35_0
jupyter_core 4.3.0 py35_0
libffi 3.2.1 1
libgcc 5.2.0 0
libiconv 1,14 0
libpng 1.6.30 1
libsodium 1.0.10 0
libxcb 1,12 1
libxml2 2.9.4 0
llvmlite 0.20.0 py35_0
médaillon 0.2.0 py35_1
markupsafe 1,0 py35_0
matplotlib 2.0.2 np113py35_0
désaccorde 0.7.4 py35_0
MKL 2017.0.3 0
msgpack-python 0.4.8 py35_0 Conda-Forge nbconvert 5.2.1 py35_0
nbformat 4.4.0 py35_0
portable 5.0 0,0 py35_0
numba 0.35.0 np113py35_0
numpy 1.13.1 py35_0
openssl 1.0.2l 0
pandas 0.20.3 py35_0
pandocfilters 1.4.2 py35_0
parquet-cpp 1.3.0.pre 2 conda-forge partd 0.3.8 py35_0
path.py 10.3.1 py35_0
PCRE 8,39 1
pexpect 4.2.1 py35_0
pickleshare 0.7.4 py35_0
pépin 9.0.1 py35_1
prompt_toolkit 1.0.15 py35_0
psutil 5.3.1 py35_0 Conda-forge ptyprocess 0.5.2 py35_0
py 04/01/34 py35_0 conda-forge pyarrow 0.7.0 py35_1 conda-forge pygments 2.2.0 py35_0
pyparsing 2.2.0 py35_0
pyqt 5.6.0 py35_2
pytest 3.2.2 py35_1 conda-Forge python 3.5. 2 0
python-dateutil 2.6.1 py35_0
python-snappy 0.5.1 py35_0
pytz 2017,2 py35_0
PyYAML 3,12 py35_0
pyzmq 16.0.2 py35_0
qt 5.6.2 5
qtconsole 4.3.1 py35_0
readline 6.2 2
demandes 2.14.2 py35_0
setuptools 36.4.0 py35_1
simplegeneric 0.8.1 py35_1
sip 4,18 py35_0
six 1.10.0 py35_0
accrocheurs 1.1.6 0
sortedcontainers 1.5.7 py35_0 conda-forge sqlite 3,13.0 0
tblib 1.3.2 py35_0 conda-Forge terminado 0,6 py35_0
TestPath 0.3.1 py35_0
épargne 0.10.0 py35_0 conda-Forge tk 05/08/18 0
toolz 0.8.2 py35_0
tornade 4,5 .2 py35_0
traitlets 4.3.2 py35_0
wcwidth 0.1.7 py35_0
roue 0.29.0 py35_0
widgetsnbextension 3.0.2 py35_0
XZ 5.2.3 0
yaml 0.1.6 0
zeromq 4.1.5 0
zict 0.1.3 py_0 Conda-Forge zlib 1.2.11 0

+0

Je crois qu'il y a une incompatibilité avec les versions des bibliothèques que j'utilise. L'un d'entre eux fuit. En utilisant HDF, cela n'arrive pas. J'ai essayé pyarrow en vain. Il y a quelques problèmes d'encodage UTF et ça ne marchera pas. Les limites de la mémoire fixe ne fonctionneront pas. Je fais probablement quelque chose de mal ici mais le plafonnement ne fonctionne pas comme je m'y attendais. –

+0

Question stupide: cela fonctionne-t-il si vous exécutez la commande une seule fois, sans '%% time'? – mdurant

+1

Je remarque que vous avez dask par défaut mais dask-core de conda-forge - c'est bizarre. – mdurant

Répondre

0

Comme @mdurant mentionné dans les commentaires, la contradiction l'installation peut avoir joué un rôle dans le problème.

Je suppose que le problème provient de la façon dont le fichier parquet/ruche a été créé. Avec un grand row_group_offsets, et snappy les décompresser en bloc, il était plus grand et peut rentrer dans la mémoire.

Recréer le fichier parquet/ruche avec row_group_offsets = 100K au lieu de 50M (par défaut), a permis de poursuivre le calcul.

fp.write(os.path.join(parquet_dir,"user_logs.parq"), 
        df, 
        compression="snappy", 
        write_index=True, 
        fixed_text={"msno":44}, 
        file_scheme="hive", 
        row_group_offsets=100000, 
        append=True 

       ) 

Il est intéressant de noter que, après la résolution du problème avec les bibliothèques, dask.threading/dask.multiprocessing était OK digérer le fichier avec un grand row_group_offsets. Cependant, dans dask.distributed (en utilisant le cluster local), il échouerait toujours.

Matière à réflexion.