{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# PIG et Param\u00e8tres sur Cloudera - \u00e9nonc\u00e9\n", "\n", "Utilisation de job param\u00e9trables en Map/Reduce avec [PIG](https://pig.apache.org/) sur [Cloudera](https://www.cloudera.com/)."]}, {"cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [{"data": {"text/html": ["Plan\n", "
run previous cell, wait for 2 seconds
\n", ""], "text/plain": [""]}, "execution_count": 2, "metadata": {}, "output_type": "execute_result"}], "source": ["from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Param\u00e8tres\n", "\n", "Les sites web produisent des donn\u00e9es en continu. On utilise fr\u00e9quemment le m\u00eame script pour traiter les donn\u00e9esd'un jour, du lendemain, de jour d'apr\u00e8s... Tous les jours, on veut r\u00e9cup\u00e9rer la fr\u00e9quentation de la veille. La seule chose qui change est la date des donn\u00e9es qu'on veut traiter. Plut\u00f4t que de recopier un script en entier pour changer une date qui appara\u00eet parfois \u00e0 plusieurs endroits, il est pr\u00e9f\u00e9rable d'\u00e9crire un script ou la date appara\u00eet comme une variable.\n", "\n", "Ce notebook va illustrer ce proc\u00e9d\u00e9 sur la construction d'un histogramme. Le param\u00e8tre du script sera la largeur des barres de l'histogramme (ou [bin](http://en.wikipedia.org/wiki/Histogram#Number_of_bins_and_width) en anglais)."]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Connexion au cluster\n", "\n", "On prend le cluster [Cloudera](http://www.xavierdupre.fr/app/ensae_teaching_cs/helpsphinx/notebooks/td3a_cenonce_session6.html#p2). Il faut ex\u00e9cuter ce script pour pouvoir notifier au notebook que la variable ``params`` existe."]}, {"cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [{"data": {"text/html": ["
server + credentials\n", "
password \n", "
server \n", "
username \n", "
\n", ""], "text/plain": [""]}, "execution_count": 3, "metadata": {}, "output_type": "execute_result"}], "source": ["import pyensae, pyquickhelper\n", "from pyquickhelper.ipythonhelper import open_html_form\n", "params={\"server\":\"df...fr\", \"username\":\"\", \"password\":\"\"}\n", "open_html_form(params=params,title=\"server + credentials\", key_save=\"params\")"]}, {"cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [{"data": {"text/plain": [""]}, "execution_count": 4, "metadata": {}, "output_type": "execute_result"}], "source": ["import pyensae\n", "%load_ext pyensae\n", "%load_ext pyenbc\n", "password = params[\"password\"]\n", "server = params[\"server\"]\n", "username = params[\"username\"]\n", "client = %remote_open\n", "client"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Upload version\n", "\n", "On commence par simuler des donn\u00e9es."]}, {"cell_type": "code", "execution_count": 4, "metadata": {"collapsed": true}, "outputs": [], "source": ["import random\n", "with open(\"random.sample.txt\", \"w\") as f :\n", " for i in range(0,10000) :\n", " x = random.random()\n", " f.write(str(x)+\"\\n\")"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On cr\u00e9\u00e9 un r\u00e9pertoire sur le cluster :"]}, {"cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [{"data": {"text/plain": ["('', '')"]}, "execution_count": 6, "metadata": {}, "output_type": "execute_result"}], "source": ["%dfs_mkdir random"]}, {"cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [{"data": {"text/plain": ["'random/random.sample.txt'"]}, "execution_count": 7, "metadata": {}, "output_type": "execute_result"}], "source": ["%remote_up_cluster random.sample.txt random/random.sample.txt"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## PIG et param\u00e8tres"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On indique un param\u00e8tre par le symbole : ``$bins``. La valeur du param\u00e8tre est pass\u00e9 sous forme de cha\u00eene de caract\u00e8res au script et remplac\u00e9e telle quelle dans le script. Il en va de m\u00eame des constantes d\u00e9clar\u00e9es gr\u00e2ce au mot-cl\u00e9 [%declare](https://pig.apache.org/docs/r0.11.1/cont.html#Examples-N1060D).\n", "\n", "La sortie du script inclut le param\u00e8tre : cela permet de retrouver comment ces donn\u00e9es ont \u00e9t\u00e9 g\u00e9n\u00e9r\u00e9es."]}, {"cell_type": "code", "execution_count": 7, "metadata": {"collapsed": true}, "outputs": [], "source": ["%%PIG histogram.pig\n", "\n", "values = LOAD 'random/random.sample.txt' USING PigStorage('\\t') AS (x:double);\n", "\n", "values_h = FOREACH values GENERATE x, ((int)(x / $bins)) * $bins AS h ;\n", "\n", "hist_group = GROUP values_h BY h ;\n", "\n", "hist = FOREACH hist_group GENERATE group, COUNT(values_h) AS nb ;\n", "\n", "STORE hist INTO 'random/histo_$bins.txt' USING PigStorage('\\t') ;"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Pour supprimer les pr\u00e9c\u00e9dents r\u00e9sultats :"]}, {"cell_type": "code", "execution_count": 8, "metadata": {"collapsed": true}, "outputs": [], "source": ["if client.dfs_exists(\"random/histo_0.1.txt\"):\n", " client.dfs_rm(\"random/histo_0.1.txt\", recursive=True)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On ex\u00e9cute le job. Comme la commande magique supportant les param\u00e8tres n'existe pas encore, il faut utiliser la variable ``client`` et sa m\u00e9thode [pig_submit](http://www.xavierdupre.fr/app/pyensae/helpsphinx/pyensae/remote/ssh_remote_connection.html?highlight=pig_submit#pyensae.remote.ssh_remote_connection.ASSHClient.pig_submit) qui fait la m\u00eame chose. Elle upload le script puis le soumet."]}, {"cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [{"data": {"text/plain": ["('', '')"]}, "execution_count": 10, "metadata": {}, "output_type": "execute_result"}], "source": ["client.pig_submit(\"histogram.pig\", redirection=\"redirection\", params =dict(bins=\"0.1\") )"]}, {"cell_type": "markdown", "metadata": {}, "source": ["S'il se produit des erreurs, il est recommand\u00e9 d'afficher plus de lignes :"]}, {"cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [{"data": {"text/html": ["
\n", "Total bytes written : 131\n", "Spillable Memory Manager spill count : 0\n", "Total bags proactively spilled: 0\n", "Total records proactively spilled: 0\n", "\n", "Job DAG:\n", "job_1414491244634_0168\n", "\n", "\n", "2014-11-28 00:11:44,435 [main] INFO  org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - Success!\n", "\n", "
"], "text/plain": [""]}, "execution_count": 11, "metadata": {}, "output_type": "execute_result"}], "source": ["%remote_cmd tail redirection.err"]}, {"cell_type": "markdown", "metadata": {}, "source": ["On v\u00e9rifie que tout s'est bien pass\u00e9. La taille devrait \u00eatre \u00e9quivalent \u00e0 l'entr\u00e9e."]}, {"cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [{"data": {"text/html": ["
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
attributescodealiasfoldersizedatetimenameisdir
0 drwxr-xr-x - xavierdupre xavierdupre 0 2014-11-28 00:11 random/histo_0.1.txt True
1 -rw-r--r-- 3 xavierdupre xavierdupre 202586 2014-11-27 23:38 random/random.sample.txt False
\n", "
"], "text/plain": [" attributes code alias folder size date time \\\n", "0 drwxr-xr-x - xavierdupre xavierdupre 0 2014-11-28 00:11 \n", "1 -rw-r--r-- 3 xavierdupre xavierdupre 202586 2014-11-27 23:38 \n", "\n", " name isdir \n", "0 random/histo_0.1.txt True \n", "1 random/random.sample.txt False "]}, "execution_count": 12, "metadata": {}, "output_type": "execute_result"}], "source": ["%dfs_ls random"]}, {"cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [{"data": {"text/plain": ["'random/histo_0.1.txt'"]}, "execution_count": 13, "metadata": {}, "output_type": "execute_result"}], "source": ["if os.path.exists(\"histo.txt\") : os.remove(\"histo.txt\")\n", "client.download_cluster(\"random/histo_0.1.txt\",\"histo.txt\", merge=True)"]}, {"cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [{"data": {"text/plain": [""]}, "execution_count": 14, "metadata": {}, "output_type": "execute_result"}, {"data": {"image/png": "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\n", "text/plain": [""]}, "metadata": {}, "output_type": "display_data"}], "source": ["import matplotlib.pyplot as plt\n", "plt.style.use('ggplot')\n", "import pandas\n", "df = pandas.read_csv(\"histo.txt\", sep=\"\\t\",names=[\"bin\",\"nb\"])\n", "df.plot(x=\"bin\", y=\"nb\", kind=\"bar\")"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Exercice 1 : min, max\n", "\n", "Ajouter deux param\u00e8tres pour construire l'histogramme entre deux valeurs ``a``,``b``."]}, {"cell_type": "code", "execution_count": 14, "metadata": {"collapsed": true}, "outputs": [], "source": []}], "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4"}}, "nbformat": 4, "nbformat_minor": 2}