From 863f6b4a058c495d651fb2e2ba7a80064e9dae9f Mon Sep 17 00:00:00 2001 From: kylef-lab41 Date: Tue, 28 Jul 2015 13:42:49 -0700 Subject: [PATCH 1/5] Update container to Spark 1.4.1 --- dockerfiles/lab41/spark-mesos-client-ipython/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dockerfiles/lab41/spark-mesos-client-ipython/Dockerfile b/dockerfiles/lab41/spark-mesos-client-ipython/Dockerfile index 6a5c600..017c3c2 100644 --- a/dockerfiles/lab41/spark-mesos-client-ipython/Dockerfile +++ b/dockerfiles/lab41/spark-mesos-client-ipython/Dockerfile @@ -24,8 +24,8 @@ RUN apt-get install --assume-yes libstdc++6 RUN pip install --upgrade pyzmq # update spark libraries latest standalone install -RUN curl http://d3kbcqa49mib13.cloudfront.net/spark-1.3.1-bin-hadoop2.6.tgz | tar -xz -C /usr/local/ && \ - cd /usr/local && rm spark && ln -s spark-1.3.1-bin-hadoop2.6 spark && \ +RUN curl http://d3kbcqa49mib13.cloudfront.net/spark-1.4.1-bin-hadoop2.4.tgz | tar -xz -C /usr/local/ && \ + cd /usr/local && rm spark && ln -s spark-1.4.1-bin-hadoop2.4 spark && \ rm /usr/bin/spark-shell && \ ln --symbolic /usr/local/spark/bin/spark-shell /usr/bin/spark-shell From 80c02c5bfb00d0d50a6cd0e3c4a6c524a15b8f9a Mon Sep 17 00:00:00 2001 From: kylef-lab41 Date: Tue, 28 Jul 2015 13:43:13 -0700 Subject: [PATCH 2/5] Expose data volume and IPython notebook port on mesos container --- 5-run-spark-mesos-client-ipython.sh | 1 + dockerfiles/lab41/spark-mesos-client-ipython/Dockerfile | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/5-run-spark-mesos-client-ipython.sh b/5-run-spark-mesos-client-ipython.sh index 3f9d36d..95a1213 100755 --- a/5-run-spark-mesos-client-ipython.sh +++ b/5-run-spark-mesos-client-ipython.sh @@ -48,6 +48,7 @@ __dns=$(dns_detect) echo "starting $__image..." __container=$(docker run -d \ --net="host" \ + --publish=8888:8888 \ --env "SPARK_MASTER=$__spark_master" \ --env "SPARK_BINARY=$__spark_binary" \ --env "SPARK_RAM_DRIVER=8G" \ diff --git a/dockerfiles/lab41/spark-mesos-client-ipython/Dockerfile b/dockerfiles/lab41/spark-mesos-client-ipython/Dockerfile index 017c3c2..91b486f 100644 --- a/dockerfiles/lab41/spark-mesos-client-ipython/Dockerfile +++ b/dockerfiles/lab41/spark-mesos-client-ipython/Dockerfile @@ -48,3 +48,9 @@ RUN export CONFIGURE_OPTS=--disable-audit && \ # add mesos-specific pyspark shell.py ADD config/pyspark/shell.py $SPARK_HOME/python/pyspark/shell.py + +# expose the IPython notebook port +EXPOSE 8888 + +# add data volume +VOLUME ["/data"] From 12ea89c5bc9a30d5392d6eb0682f0856afd7256f Mon Sep 17 00:00:00 2001 From: kylef-lab41 Date: Tue, 28 Jul 2015 13:43:25 -0700 Subject: [PATCH 3/5] Increase memory usage for Spark driver and workers --- 5-run-spark-mesos-client-ipython.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/5-run-spark-mesos-client-ipython.sh b/5-run-spark-mesos-client-ipython.sh index 95a1213..ff86f42 100755 --- a/5-run-spark-mesos-client-ipython.sh +++ b/5-run-spark-mesos-client-ipython.sh @@ -51,8 +51,8 @@ __container=$(docker run -d \ --publish=8888:8888 \ --env "SPARK_MASTER=$__spark_master" \ --env "SPARK_BINARY=$__spark_binary" \ - --env "SPARK_RAM_DRIVER=8G" \ - --env "SPARK_RAM_WORKER=4G" \ + --env "SPARK_RAM_DRIVER=64G" \ + --env "SPARK_RAM_WORKER=8G" \ --env "CONTAINER_USER=$__spark_user" \ --volume=$__host_dir_hadoop_conf:/etc/hadoop/conf \ --volume=$__host_dir_hive_conf:/etc/hive/conf \ From f6c096562c6e88c273db9c5670e6cfcd1e4129f8 Mon Sep 17 00:00:00 2001 From: kylef-lab41 Date: Tue, 28 Jul 2015 13:45:33 -0700 Subject: [PATCH 4/5] Customize pyspark shell environment Auto-detect open port for WebUI and add environment-specified values for: - mesos master - memory usage - spark binary --- .../config/pyspark/shell.py | 47 +++++++++++++++++-- runtime/ipython/notebooks/Example_Pi.ipynb | 45 +++++++++--------- 2 files changed, 67 insertions(+), 25 deletions(-) diff --git a/dockerfiles/lab41/spark-mesos-client-ipython/config/pyspark/shell.py b/dockerfiles/lab41/spark-mesos-client-ipython/config/pyspark/shell.py index 9292d83..e76e8ed 100644 --- a/dockerfiles/lab41/spark-mesos-client-ipython/config/pyspark/shell.py +++ b/dockerfiles/lab41/spark-mesos-client-ipython/config/pyspark/shell.py @@ -40,6 +40,33 @@ from pyspark.sql import SQLContext, HiveContext from pyspark.storagelevel import StorageLevel + +# find an available port for SparkUI +def ui_get_available_port(): + import socket; + + # default UI host/port + host = "127.0.0.1" + port = 4040 + + # check + check = notfound = 0 + + # find the first available unoccupied port + while (check==notfound): + + # check if available + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + check = sock.connect_ex((host, port)) + + # try again if port unavailable + if check == notfound: + port += 1 + + # return the first available port + return port + + # this is the deprecated equivalent of ADD_JARS add_files = None if os.environ.get("ADD_FILES") is not None: @@ -50,10 +77,22 @@ # setup mesos-based connection conf = (SparkConf() - .setMaster(os.environ["SPARK_MASTER"]) - .set("spark.executor.uri", os.environ["SPARK_BINARY"]) - .set("spark.driver.memory", os.environ["SPARK_RAM_DRIVER"]) - .set("spark.executor.memory", os.environ["SPARK_RAM_WORKER"])) + .setMaster(os.environ["SPARK_MASTER"])) + +# optionally set memory limits +if os.environ.get("SPARK_RAM_DRIVER"): + conf.set("spark.driver.memory", os.environ["SPARK_RAM_DRIVER"]) +if os.environ.get("SPARK_RAM_WORKER"): + conf.set("spark.executor_memory", os.environ["SPARK_RAM_WORKER"]) + +# set the UI port +conf.set("spark.ui.port", ui_get_available_port()) + +# optionally set the Spark binary +if os.environ.get("SPARK_BINARY"): + conf.set("spark.executor.uri", os.environ["SPARK_BINARY"]) + +# establish config-based context sc = SparkContext(appName="DockerIPythonShell", pyFiles=add_files, conf=conf) atexit.register(lambda: sc.stop()) diff --git a/runtime/ipython/notebooks/Example_Pi.ipynb b/runtime/ipython/notebooks/Example_Pi.ipynb index 82b5f2e..37ef03d 100644 --- a/runtime/ipython/notebooks/Example_Pi.ipynb +++ b/runtime/ipython/notebooks/Example_Pi.ipynb @@ -45,26 +45,7 @@ }, { "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# update SparkContext to use HDFS Spark binary\n", - "# TODO: setup this portion to configure on server startup\n", - "from pyspark import SparkConf, SparkContext\n", - "sc.stop()\n", - "conf = (SparkConf()\n", - " .setMaster(\"mesos://mesos-master-fqdn:5050\")\n", - " .setAppName(\"Calculate Pi\")\n", - " .set(\"spark.executor.uri\", \"hdfs:///spark/spark-1.3.0-bin-hadoop2.4.tgz\"))\n", - "sc = SparkContext(conf = conf)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "metadata": { "collapsed": false }, @@ -73,7 +54,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Pi is roughly 3.036000\n" + "Pi is roughly 3.068000\n" ] } ], @@ -90,6 +71,28 @@ "count = sc.parallelize(xrange(0, NUM_SAMPLES)).map(sample).reduce(lambda a, b: a + b)\n", "print \"Pi is roughly %f\" % (4.0 * count / NUM_SAMPLES)" ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "u'4041'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "conf.get(\"spark.ui.port\")" + ] } ], "metadata": { From 2e352a00b6b9fe158ec9527b8a850642b7d2d55f Mon Sep 17 00:00:00 2001 From: kylef-lab41 Date: Tue, 28 Jul 2015 13:45:58 -0700 Subject: [PATCH 5/5] Add custom CSS and logo for IPython notebook --- .../profile_spark/static/base/images/logo.png | Bin 0 -> 10359 bytes .../profile_spark/static/custom/custom.css | 139 +++++++++++++++++- 2 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 runtime/ipython/profile_spark/static/base/images/logo.png diff --git a/runtime/ipython/profile_spark/static/base/images/logo.png b/runtime/ipython/profile_spark/static/base/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1a41d4dcd1be92a9b8c1a53ba601f736d0cd6528 GIT binary patch literal 10359 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 literal 0 HcmV?d00001 diff --git a/runtime/ipython/profile_spark/static/custom/custom.css b/runtime/ipython/profile_spark/static/custom/custom.css index 9f4abda..c7d1a49 100644 --- a/runtime/ipython/profile_spark/static/custom/custom.css +++ b/runtime/ipython/profile_spark/static/custom/custom.css @@ -1,7 +1,138 @@ /* -Placeholder for custom user CSS -mainly to be overridden in profile/static/custom/custom.css + Theme modified from Base16 harmonic16 Dark by Jannik Siebert (https://github.com/janniks) -This will always be an empty file in IPython -*/ \ No newline at end of file + CodeMirror template adapted for IPython Notebook by Nikhil Sonnad (https://github.com/nsonnad/base16-ipython-notebook) + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-chrome-devtools) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +/* Uncomment to use a custom font +div#notebook, div.CodeMirror, div.output_area pre, div.output_wrapper, div.prompt { + font-family: 'Custom Font Name', monospace !important; +} +*/ + +#notebook img{ + display:block; + background: url(/static/custom/logo.png) no-repeat; + width: 500px; + height: 115px; + padding-left: 233px; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.notebook_app { + background-color: #222; +} + +/* GLOBALS */ +body {background-color: #222;color: #FFF} +a {color: #FF8282;} + +/* INTRO PAGE */ +.toolbar_info, .list_container { + color: #e5ebf1; +} + +#running .panel-group .panel .panel-heading, +.panel-heading, +.list_header { + background-color: #0E3A42; +} + +#header { + background-color: #0E3A42; + border-bottom: 1px solid maroon; + padding: 10px 0; +} + +#header .header-bar { + width: 100%; + height: 1px; + background: transparent; + margin-bottom: -1px; +} + +.panel { + background-color: transparent; +} + +#notebook-container { + background-color: #EEE; +} + +.checkpoint_status, +.autosave_status { + color: #AAA; + font-size: 100% ! important; +} + +#kernel_logo_widget { + display: none; +} + +/* NOTEBOOK */ + +/* comment out this line to bring the toolbar back */ +/*div#maintoolbar, div#header {display: none !important;}*/ +div#notebook {border-top: none;} + +div.input_prompt {color: #bf5656;} +div.output_prompt {color: #bf568b;} +div.input_area { + border-radius: 0px; + border: 1px solid #405c79; +} +div.output_area pre {font-weight: normal; color: #3F474F;} +div.output_subarea {font-weight: normal; color: #3F474F;} + +.rendered_html table, .rendered_html th, .rendered_html tr, .rendered_html td { + border: 1px #3F474F solid; + color: #3F474F; +} +div.output_html { font-family: sans-serif; } +table.dataframe tr {border: 1px #3F474F;} + +div.cell.selected {border-radius: 0px;} +div.cell.edit_mode {border-radius: 0px; border: thin solid #bf568b;} +div.text_cell_render, div.output_html {color: #3F474F;} + +span.ansiblack {color: #223b54;} +span.ansiblue {color: #568bbf;} +span.ansigray {color: #aabcce;} +span.ansigreen {color: #56bf8b;} +span.ansipurple {color: #bf568b;} +span.ansired {color: #bf8b56;} +span.ansiyellow {color: #8bbf56;} + +div.output_stderr {background-color: #bf8b56;} +div.output_stderr pre {color: #e5ebf1;} + +.cm-s-ipython.CodeMirror {background: #0b1c2c; color: #e5ebf1;} +.cm-s-ipython div.CodeMirror-selected {background: #223b54 !important;} +.cm-s-ipython .CodeMirror-gutters {background: #0b1c2c; border-right: 0px;} +.cm-s-ipython .CodeMirror-linenumber {color: #627e99;} +.cm-s-ipython .CodeMirror-cursor {border-left: 1px solid #aabcce !important;} + +.cm-s-ipython span.cm-comment {color: #bf5656;} +.cm-s-ipython span.cm-atom {color: #bf568b;} +.cm-s-ipython span.cm-number {color: #bf568b;} + +.cm-s-ipython span.cm-property, .cm-s-ipython span.cm-attribute {color: #56bf8b;} +.cm-s-ipython span.cm-keyword {color: #bf8b56;} +.cm-s-ipython span.cm-string {color: #8bbf56;} +.cm-s-ipython span.cm-operator {color: #bf5656;} +.cm-s-ipython span.cm-builtin {color: #bf568b;} + +.cm-s-ipython span.cm-variable {color: #56bf8b;} +.cm-s-ipython span.cm-variable-2 {color: #8b56bf;} +.cm-s-ipython span.cm-def {color: #bfbf56;} +.cm-s-ipython span.cm-error {background: #bf8b56; color: #aabcce;} +.cm-s-ipython span.cm-bracket {color: #3F474F;} +.cm-s-ipython span.cm-tag {color: #bf8b56;} +.cm-s-ipython span.cm-link {color: #bf568b;} + +.cm-s-ipython .CodeMirror-matchingbracket { text-decoration: underline; color: #e5ebf1 !important;}