http://git-wip-us.apache.org/repos/asf/zeppelin/blob/085efeb6/notebook/Zeppelin Tutorial/Using Mahout_2BYEZ5EVK.zpln ---------------------------------------------------------------------- diff --git a/notebook/Zeppelin Tutorial/Using Mahout_2BYEZ5EVK.zpln b/notebook/Zeppelin Tutorial/Using Mahout_2BYEZ5EVK.zpln new file mode 100644 index 0000000..aab04df --- /dev/null +++ b/notebook/Zeppelin Tutorial/Using Mahout_2BYEZ5EVK.zpln @@ -0,0 +1,887 @@ +{ + "paragraphs": [ + { + "text": "%md\n\n### The [Apache Mahout](http://mahout.apache.org/)⢠project\u0027s goal is to build an environment for quickly creating scalable performant machine learning applications.\n\n#### Apache Mahout software provides three major features:\n\n- A simple and extensible programming environment and framework for building scalable algorithms\n- A wide variety of premade algorithms for Scala + Apache Spark, H2O, Apache Flink\n- Samsara, a vector math experimentation environment with R-like syntax which works at scale\n\n#### In other words:\n\n*Apache Mahout provides a unified API for quickly creating machine learning algorithms on a variety of engines.*\n\n#### Getting Started\n\nApache Mahout is a collection of Libraries that enhance Apache Flink, Apache Spark, and others. Currently Zeppelin support the Flink and Spark Engines. A convenience script is provided to setup the nessecary imports and configurations to run Mahout on Spark and Flink. \n\nWe can use Apache Maho ut\u0027s R-Like Domain Specific Language (DSL) inline with native Flink or Spark code. We must however, first declare a few imports that are different for Spark and Flink\n\n__References:__\n\n[Mahout-Samsara\u0027s In-Core Linear Algebra DSL Reference](http://mahout.apache.org/users/environment/in-core-reference.html)\n[Mahout-Samsara\u0027s Distributed Linear Algebra DSL Reference](http://mahout.apache.org/users/environment/out-of-core-reference.html)\n[Getting Started with the Mahout-Samsara Shell](http://mahout.apache.org/users/sparkbindings/play-with-shell.html)\n", + "dateUpdated": "Sep 28, 2016 10:01:52 AM", + "config": { + "colWidth": 12.0, + "enabled": true, + "editorMode": "ace/mode/scala", + "editorHide": true, + "results": [ + { + "graph": { + "mode": "table", + "height": 300.0, + "optionOpen": false, + "keys": [], + "values": [], + "groups": [], + "scatter": {}, + "map": { + "baseMapType": "Streets", + "isOnline": true, + "pinCols": [] + } + } + } + ] + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "jobName": "paragraph_1475013396125_39313566", + "id": "20160927-155636_1798325301", + "results": { + "code": "SUCCESS", + "msg": [ + { + "type": "HTML", + "data": "\u003ch3\u003eThe \u003ca href\u003d\"http://mahout.apache.org/\"\u003eApache Mahout\u003c/a\u003e⢠project\u0027s goal is to build an environment for quickly creating scalable performant machine learning applications.\u003c/h3\u003e\n\u003ch4\u003eApache Mahout software provides three major features:\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eA simple and extensible programming environment and framework for building scalable algorithms\u003c/li\u003e\n\u003cli\u003eA wide variety of premade algorithms for Scala + Apache Spark, H2O, Apache Flink\u003c/li\u003e\n\u003cli\u003eSamsara, a vector math experimentation environment with R-like syntax which works at scale\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4\u003eIn other words:\u003c/h4\u003e\n\u003cp\u003e\u003cem\u003eApache Mahout provides a unified API for quickly creating machine learning algorithms on a variety of engines.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eReferences:\u003c/st rong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href\u003d\"http://mahout.apache.org/users/environment/in-core-reference.html\"\u003eMahout-Samsara\u0027s In-Core Linear Algebra DSL Reference\u003c/a\u003e\n\u003cbr /\u003e\u003ca href\u003d\"http://mahout.apache.org/users/environment/out-of-core-reference.html\"\u003eMahout-Samsara\u0027s Distributed Linear Algebra DSL Reference\u003c/a\u003e\n\u003cbr /\u003e\u003ca href\u003d\"http://mahout.apache.org/users/sparkbindings/play-with-shell.html\"\u003eGetting Started with the Mahout-Samsara Shell\u003c/a\u003e\u003c/p\u003e\n" + } + ] + }, + "dateCreated": "Sep 27, 2016 3:56:36 AM", + "dateStarted": "Sep 27, 2016 4:02:55 AM", + "dateFinished": "Sep 27, 2016 4:02:55 AM", + "status": "FINISHED", + "progressUpdateIntervalMs": 500 + }, + { + "text": "%md\n\n#### \"Installing\" the Apache Mahout dependencies and configuring a new Spark and Flink interpreter\n\nThe following two paragraphs are convenience paragraphs. You **only need to run them once** to create two new interpreters `%spark.mahout` and `%flink.mahout`. These are intended for users who don\u0027t have Apache Mahout already installed. They assume you started Apache Zeppelin from the top level directory or from the bin. You can tell which one is you by weather you started Zeppelin by typing `./zeppelin-daemon.sh start` or `bin/zeppelin-daemon.sh start`. If you started Zeppelin from somewhere else you will also need to run them from the command line.\n\nThey both run a python script which may be found at `ZEPPELIN_HOME/scripts/mahout/add_mahout.py`\n\nIn short this script:\n- Downloads Apache Mahout\n- Creates a new Flink interpreter with dependencies.\n- Creates a new Spark interpreter with dependencies and modified configuration to use Kryo serializa tion.\n\n__You only need to run this script once ever.__ (Maybe again if for some reason you delete `conf/interpreter.json`) \n", + "dateUpdated": "Sep 27, 2016 4:31:15 AM", + "config": { + "colWidth": 12.0, + "enabled": true, + "editorMode": "ace/mode/scala", + "editorHide": true, + "results": [ + { + "graph": { + "mode": "table", + "height": 300.0, + "optionOpen": false, + "keys": [], + "values": [], + "groups": [], + "scatter": {}, + "map": { + "baseMapType": "Streets", + "isOnline": true, + "pinCols": [] + } + } + } + ] + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "jobName": "paragraph_1475015019489_-1704057033", + "id": "20160927-162339_341514150", + "results": { + "code": "SUCCESS", + "msg": [ + { + "type": "HTML", + "data": "\u003ch4\u003e\u0026ldquo;Installing\u0026rdquo; the Apache Mahout dependencies and configuring a new Spark and Flink interpreter\u003c/h4\u003e\n\u003cp\u003eThe following two paragraphs are convenience paragraphs. You \u003cstrong\u003eonly need to run them once\u003c/strong\u003e to create two new interpreters \u003ccode\u003e%spark.mahout\u003c/code\u003e and \u003ccode\u003e%flink.mahout\u003c/code\u003e. These are intended for users who don\u0027t have Apache Mahout already installed. They assume you started Apache Zeppelin from the top level directory or from the bin. You can tell which one is you by weather you started Zeppelin by typing \u003ccode\u003e./zeppelin-daemon.sh start\u003c/code\u003e or \u003ccode\u003ebin/zeppelin-daemon.sh start\u003c/code\u003e. If you started Zeppelin from somewhere else you will also need to run them from the command line.\u003c/p\u003e\n\u003cp\u003eThey both run a python script which may be found at \u003ccode\u003e ZEPPELIN_HOME/scripts/mahout/add_mahout.py\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIn short this script:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDownloads Apache Mahout\u003c/li\u003e\n\u003cli\u003eCreates a new Flink interpreter with dependencies.\u003c/li\u003e\n\u003cli\u003eCreates a new Spark interpreter with dependencies and modified configuration to use Kryo serialization.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eYou only need to run this script once ever.\u003c/strong\u003e (Maybe again if for some reason you delete \u003ccode\u003econf/interpreter.json\u003c/code\u003e)\u003c/p\u003e\n" + } + ] + }, + "dateCreated": "Sep 27, 2016 4:23:39 AM", + "dateStarted": "Sep 27, 2016 4:31:12 AM", + "dateFinished": "Sep 27, 2016 4:31:13 AM", + "status": "FINISHED", + "progressUpdateIntervalMs": 500 + }, + { + "title": "Convenience Paragraph if you started Zeppelin by \u0027./zeppelin-daemon.sh start\u0027", + "text": "%sh\n\npython ../scripts/mahout/add_mahout.py", + "dateUpdated": "Dec 17, 2016 3:41:45 PM", + "config": { + "colWidth": 12.0, + "graph": { + "mode": "table", + "height": 300.0, + "optionOpen": false, + "keys": [], + "values": [], + "groups": [], + "scatter": {}, + "map": { + "baseMapType": "Streets", + "isOnline": true, + "pinCols": [] + } + }, + "enabled": true, + "editorMode": "ace/mode/sh", + "title": true, + "results": {}, + "editorSetting": { + "language": "sh", + "editOnDblClick": false + } + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "jobName": "paragraph_1475014957043_-748248820", + "id": "20160927-162237_1864782562", + "dateCreated": "Sep 27, 2016 4:22:37 AM", + "status": "READY", + "progressUpdateIntervalMs": 500 + }, + { + "title": "Convenience Paragraph if you started Zeppelin by \u0027bin/zeppelin-daemon.sh start\u0027", + "text": "%sh\npython scripts/mahout/add_mahout_interpreters.py", + "dateUpdated": "Dec 17, 2016 3:41:46 PM", + "config": { + "colWidth": 12.0, + "graph": { + "mode": "table", + "height": 300.0, + "optionOpen": false, + "keys": [], + "values": [], + "groups": [], + "scatter": {}, + "map": { + "baseMapType": "Streets", + "isOnline": true, + "pinCols": [] + } + }, + "enabled": true, + "editorMode": "ace/mode/sh", + "title": true, + "results": {}, + "editorSetting": { + "language": "sh", + "editOnDblClick": false + } + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "jobName": "paragraph_1475018789604_-139338572", + "id": "20160927-172629_1189436716", + "dateCreated": "Sep 27, 2016 5:26:29 AM", + "status": "READY", + "progressUpdateIntervalMs": 500 + }, + { + "text": "%md\n\nAfter the interpreters are created you will need to \u0027bind\u0027 them by clicking on the little gear in the top right corner, scrolling to the top, and clicking on `mahoutFlink` and `mahoutSpark` so that they are highlighted in blue.\n\n#### Running Mahout code\n\nYou will need to import certain libraries, and declare the _Mahout Distributed Context_ when you first start your notebook using the interpreters. \n\nIf using Apache Flink the code you need to run is:\n```scala\n%flinkMahout\n\nimport org.apache.flink.api.scala._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.flinkbindings._\nimport org.apache.mahout.math._\nimport scalabindings._\nimport RLikeOps._\n\n\nimplicit val ctx \u003d new FlinkDistributedContext(benv)\n```\n\nIf using Apache Spark the code you need to run is\n```scala\n%sparkMahout\n\nimport org.apache.mahout.math._\nimport org.apache.mahout.math.scalabindings._\nimport or g.apache.mahout.math.drm._\nimport org.apache.mahout.math.scalabindings.RLikeOps._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.sparkbindings._\n\nimplicit val sdc: org.apache.mahout.sparkbindings.SparkDistributedContext \u003d sc2sdc(sc)\n```\n\n__Note: For Apache Mahout on Apache Spark you must be running Spark 1.5.x or 1.6.x. We are working hard on supporting Spark 2.0__\nIn the meantime, feel free to play with Mahout on Flink and then simple _copy and paste your Mahout code to Spark once it is supported!_\n\n### A Side by Side Example\n", + "dateUpdated": "Sep 28, 2016 12:36:44 PM", + "config": { + "colWidth": 12.0, + "enabled": true, + "editorMode": "ace/mode/markdown", + "editorHide": true, + "results": [ + { + "graph": { + "mode": "table", + "height": 300.0, + "optionOpen": false, + "keys": [], + "values": [], + "groups": [], + "scatter": {}, + "map": { + "baseMapType": "Streets", + "isOnline": true, + "pinCols": [] + } + } + } + ] + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "jobName": "paragraph_1475014730618_1513783554", + "id": "20160927-161850_1560940440", + "results": { + "code": "SUCCESS", + "msg": [ + { + "type": "HTML", + "data": "\u003cp\u003eAfter the interpreters are created you will need to \u0027bind\u0027 them by clicking on the little gear in the top right corner, scrolling to the top, and clicking on \u003ccode\u003emahoutFlink\u003c/code\u003e and \u003ccode\u003emahoutSpark\u003c/code\u003e so that they are highlighted in blue.\u003c/p\u003e\n\u003ch4\u003eRunning Mahout code\u003c/h4\u003e\n\u003cp\u003eYou will need to import certain libraries, and declare the \u003cem\u003eMahout Distributed Context\u003c/em\u003e when you first start your notebook using the interpreters.\u003c/p\u003e\n\u003cp\u003eIf using Apache Flink the code you need to run is:\u003c/p\u003e\n\u003cpre\u003e\u003ccode class\u003d\"scala\"\u003e%flinkMahout\n\nimport org.apache.flink.api.scala._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.flinkbindings._\nimport org.apache.mahout.math._\nimport scalabindings._\nimport RLikeOps._\n\n\n@tra nsient implicit val ctx \u003d new FlinkDistributedContext(benv)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eIf using Apache Spark the code you need to run is\u003c/p\u003e\n\u003cpre\u003e\u003ccode class\u003d\"scala\"\u003e%sparkMahout\n\nimport org.apache.mahout.math._\nimport org.apache.mahout.math.scalabindings._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.scalabindings.RLikeOps._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.sparkbindings._\n\nimplicit val sdc: org.apache.mahout.sparkbindings.SparkDistributedContext \u003d sc2sdc(sc)\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e\u003cstrong\u003eNote: For Apache Mahout on Apache Spark you must be running Spark 1.5.x or 1.6.x. We are working hard on supporting Spark 2.0\u003c/strong\u003e\n\u003cbr /\u003eIn the meantime, feel free to play with Mahout on Flink and then simple \u003cem\u003ecopy and paste your Mahout code to Spark once it is supported!\u003c/em\u00 3e\u003c/p\u003e\n\u003ch3\u003eA Side by Side Example\u003c/h3\u003e\n" + } + ] + }, + "dateCreated": "Sep 27, 2016 4:18:50 AM", + "dateStarted": "Sep 28, 2016 10:17:05 AM", + "dateFinished": "Sep 28, 2016 10:17:06 AM", + "status": "FINISHED", + "progressUpdateIntervalMs": 500 + }, + { + "text": "%flinkMahout\n\n// Imports and creating the distributed context, similar but not exactly the same ///////////////////////////////////////////\nimport org.apache.flink.api.scala._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.flinkbindings._\nimport org.apache.mahout.math._\nimport scalabindings._\nimport RLikeOps._\n\n\nimplicit val ctx \u003d new FlinkDistributedContext(benv)\n\n// CODE IS EXACTLY THE SAME FROM HERE ON - R-Like DSL ////////////////////////////////////////////////////////////////////////////////\n\nval drmData \u003d drmParallelize(dense(\n (2, 2, 10.5, 10, 29.509541), // Apple Cinnamon Cheerios\n (1, 2, 12, 12, 18.042851), // Cap\u0027n\u0027Crunch\n (1, 1, 12, 13, 22.736446), // Cocoa Puffs\n (2, 1, 11, 13, 32.207582), // Froot Loops\n (1, 2, 12, 11, 21.871292), // Honey Graham Ohs\n (2, 1, 16, 8, 36.187559), // Wheaties Honey Gold\n (6, 2, 17, 1, 50.764999) , // Cheerios\n (3, 2, 13, 7, 40.400208), // Clusters\n (3, 3, 13, 4, 45.811716)), numPartitions \u003d 2)\n \ndrmData.collect(::, 0 until 4)\n\nval drmX \u003d drmData(::, 0 until 4)\nval y \u003d drmData.collect(::, 4)\nval drmXtX \u003d drmX.t %*% drmX\nval drmXty \u003d drmX.t %*% y\n\n\nval XtX \u003d drmXtX.collect\nval Xty \u003d drmXty.collect(::, 0)\nval beta \u003d solve(XtX, Xty)\n\n", + "dateUpdated": "Sep 28, 2016 1:41:59 PM", + "config": { + "colWidth": 6.0, + "enabled": true, + "editorMode": "ace/mode/markdown", + "results": [ + { + "graph": { + "mode": "table", + "height": 300.0, + "optionOpen": false, + "keys": [], + "values": [], + "groups": [], + "scatter": {}, + "map": { + "baseMapType": "Streets", + "isOnline": true, + "pinCols": [] + } + } + } + ] + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "jobName": "paragraph_1475015779325_-1869239670", + "id": "20160927-163619_899520006", + "results": { + "code": "SUCCESS", + "msg": [ + { + "type": "TEXT", + "data": "import org.apache.flink.api.scala._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.flinkbindings._\nimport org.apache.mahout.math._\nimport scalabindings._\nimport RLikeOps._\nctx: org.apache.mahout.flinkbindings.FlinkDistributedContext \u003d org.apache.mahout.flinkbindings.FlinkDistributedContext@4452b0a5\nwarning: Class it.unimi.dsi.fastutil.ints.Int2DoubleOpenHashMap not found - continuing with a stub.\ndrmData: org.apache.mahout.math.drm.CheckpointedDrm[Int] \u003d org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@445242be\n(5,9)\nres1: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:2.0,1:2.0,2:10.5,3:10.0}\n 1 \u003d\u003e\t{0:1.0,1:2.0,2:12.0,3:12.0}\n 2 \u003d\u003e\t{0:1.0,1:1.0,2:12.0,3:13.0}\n 3 \u003d\u003e\t{0:2.0,1:1.0,2:11.0,3:13.0}\n 4 \u003d\u003e\t{0:1.0,1:2.0,2:12.0,3:11.0}\n 5 \u003d\u003e\t{0:2.0,1:1.0,2:16.0,3:8.0}\n 6 \u003d\u003e\t{0:6.0,1:2.0,2:17.0,3: 1.0}\n 7 \u003d\u003e\t{0:3.0,1:2.0,2:13.0,3:7.0}\n 8 \u003d\u003e\t{0:3.0,1:3.0,2:13.0,3:4.0}\n}\ndrmX: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpMapBlock(org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@445242be,\u003cfunction1\u003e,4,-1,true)\n(5,9)\ny: org.apache.mahout.math.Vector \u003d {0:29.509541,1:18.042851,2:22.736446,3:32.207582,4:21.871292,5:36.187559,6:50.764999,7:40.400208,8:45.811716}\ndrmXtX: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpABAnyKey(OpAt(OpMapBlock(org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@445242be,\u003cfunction1\u003e,4,-1,true)),OpMapBlock(org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@445242be,\u003cfunction1\u003e,4,-1,true))\ndrmXty: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpAx(OpAt(OpMapBlock(org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@445242be,\u003cfunction1\u003e,4,-1,true)),{0:29.509541,1:18.042851,2:22.736446,3:32.207582,4:21.871292,5:36.187559,6:50.764999,7:40.400208,8:45.8117 16})\n(4,4)\nXtX: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:69.0,1:40.0,2:291.0,3:137.0}\n 1 \u003d\u003e\t{0:40.0,1:32.0,2:207.0,3:128.0}\n 2 \u003d\u003e\t{0:291.0,1:207.0,2:1546.25,3:968.0}\n 3 \u003d\u003e\t{0:137.0,1:128.0,2:968.0,3:833.0}\n}\n(1,4)\nXty: org.apache.mahout.math.Vector \u003d {0:821.6857190000001,1:549.744517,2:3978.7015895000004,3:2272.7799889999997}\nbeta: org.apache.mahout.math.Vector \u003d {0:5.247349465378393,1:2.7507945784675067,2:1.1527813010791783,3:0.10312017617607437}\n" + } + ] + }, + "dateCreated": "Sep 27, 2016 4:36:19 AM", + "dateStarted": "Sep 28, 2016 1:41:59 PM", + "dateFinished": "Sep 28, 2016 1:42:25 PM", + "status": "FINISHED", + "progressUpdateIntervalMs": 500 + }, + { + "text": "%sparkMahout\n\n// Imports and creating the distributed context, similar but not exactly the same ///////////////////////////////////////////\n\nimport org.apache.mahout.math._\nimport org.apache.mahout.math.scalabindings._\nimport org.apache.mahout.math.drm._\nimport org.apache.mahout.math.scalabindings.RLikeOps._\nimport org.apache.mahout.math.drm.RLikeDrmOps._\nimport org.apache.mahout.sparkbindings._\n\nimplicit val sdc: org.apache.mahout.sparkbindings.SparkDistributedContext \u003d sc2sdc(sc)\n\n\n// CODE IS EXACTLY THE SAME FROM HERE ON - R-Like DSL ////////////////////////////////////////////////////////////////////////////////\n\nval drmData \u003d drmParallelize(dense(\n (2, 2, 10.5, 10, 29.509541), // Apple Cinnamon Cheerios\n (1, 2, 12, 12, 18.042851), // Cap\u0027n\u0027Crunch\n (1, 1, 12, 13, 22.736446), // Cocoa Puffs\n (2, 1, 11, 13, 32.207582), // Froot Loops\n (1, 2, 12, 11, 21.871292), // Honey Graham Ohs\n (2, 1, 16, 8, 36.1875 59), // Wheaties Honey Gold\n (6, 2, 17, 1, 50.764999), // Cheerios\n (3, 2, 13, 7, 40.400208), // Clusters\n (3, 3, 13, 4, 45.811716)), numPartitions \u003d 2)\n \ndrmData.collect(::, 0 until 4)\n\nval drmX \u003d drmData(::, 0 until 4)\nval y \u003d drmData.collect(::, 4)\nval drmXtX \u003d drmX.t %*% drmX\nval drmXty \u003d drmX.t %*% y\n\n\nval XtX \u003d drmXtX.collect\nval Xty \u003d drmXty.collect(::, 0)\nval beta \u003d solve(XtX, Xty)\n", + "dateUpdated": "Sep 28, 2016 1:45:09 PM", + "config": { + "colWidth": 6.0, + "enabled": true, + "editorMode": "ace/mode/scala", + "results": [ + { + "graph": { + "mode": "table", + "height": 300.0, + "optionOpen": false, + "keys": [], + "values": [], + "groups": [], + "scatter": {}, + "map": { + "baseMapType": "Streets", + "isOnline": true, + "pinCols": [] + } + } + } + ] + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "jobName": "paragraph_1475016737629_-774084480", + "id": "20160927-165217_1266863511", + "results": { + "code": "SUCCESS", + "msg": [ + { + "type": "TEXT", + "data": "\nimport org.apache.mahout.math._\n\nimport org.apache.mahout.math.scalabindings._\n\nimport org.apache.mahout.math.drm._\n\nimport org.apache.mahout.math.scalabindings.RLikeOps._\n\nimport org.apache.mahout.math.drm.RLikeDrmOps._\n\nimport org.apache.mahout.sparkbindings._\n\nsdc: org.apache.mahout.sparkbindings.SparkDistributedContext \u003d org.apache.mahout.sparkbindings.SparkDistributedContext@32c46474\n\ndrmData: org.apache.mahout.math.drm.CheckpointedDrm[Int] \u003d org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@783484b9\n\n\n\n\n\n\n\n\n\n\n\n\nres2: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:2.0,1:2.0,2:10.5,3:10.0}\n 1 \u003d\u003e\t{0:1.0,1:2.0,2:12.0,3:12.0}\n 2 \u003d\u003e\t{0:1.0,1:1.0,2:12.0,3:13.0}\n 3 \u003d\u003e\t{0:2.0,1:1.0,2:11.0,3:13.0}\n 4 \u003d\u003e\t{0:1.0,1:2.0,2:12.0,3:11.0}\n 5 \u003d\u003e\t{0:2.0,1:1.0,2:16.0,3:8.0}\n 6 \u003d\u003e\t{0:6.0,1:2.0,2:17.0,3:1.0}\n 7 \u003d\u003e\t{0:3.0,1:2.0,2:13.0,3: 7.0}\n 8 \u003d\u003e\t{0:3.0,1:3.0,2:13.0,3:4.0}\n}\n\ndrmX: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpMapBlock(org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@783484b9,\u003cfunction1\u003e,4,-1,true)\n\ny: org.apache.mahout.math.Vector \u003d {0:29.509541,1:18.042851,2:22.736446,3:32.207582,4:21.871292,5:36.187559,6:50.764999,7:40.400208,8:45.811716}\n\ndrmXtX: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpABAnyKey(OpAt(OpMapBlock(org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@783484b9,\u003cfunction1\u003e,4,-1,true)),OpMapBlock(org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@783484b9,\u003cfunction1\u003e,4,-1,true))\n\ndrmXty: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpAx(OpAt(OpMapBlock(org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@783484b9,\u003cfunction1\u003e,4,-1,true)),{0:29.509541,1:18.042851,2:22.736446,3:32.207582,4:21.871292,5:36.187559,6:50.764999,7:40.400208,8:45.811716})\n\n\n\n\n\n\n\nXtX: org.apache.mahout.m ath.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:69.0,1:40.0,2:291.0,3:137.0}\n 1 \u003d\u003e\t{0:40.0,1:32.0,2:207.0,3:128.0}\n 2 \u003d\u003e\t{0:291.0,1:207.0,2:1546.25,3:968.0}\n 3 \u003d\u003e\t{0:137.0,1:128.0,2:968.0,3:833.0}\n}\n\nXty: org.apache.mahout.math.Vector \u003d {0:821.6857190000001,1:549.744517,2:3978.7015894999995,3:2272.779989}\n\nbeta: org.apache.mahout.math.Vector \u003d {0:5.247349465378446,1:2.750794578467531,2:1.1527813010791554,3:0.10312017617608908}\n" + } + ] + }, + "dateCreated": "Sep 27, 2016 4:52:17 AM", + "dateStarted": "Sep 28, 2016 1:45:09 PM", + "dateFinished": "Sep 28, 2016 1:45:23 PM", + "status": "FINISHED", + "progressUpdateIntervalMs": 500 + }, + { + "title": "Use Resource Pools with Zeppelin", + "text": "%md\n\n### Taking advantage of Zeppelin Resource Pools\n\nOne of the major motivations for integrating Apache Mahout with Apache Zeppelin was the many benefits that come from leveraging the resource pools. A resource pool is a block of memory that can be acccessed by all interpreters and is useful for sharing small variables between the interpreters. \n\nThe Spark interpreter has a simple interface for accessing the ResourcePools, the Flink interface is less documented but can be reverse engineered from code (thanks open source!)\n\n\nCollect betas from Spark and Flink- compare in Python\n\nCreate Matrix in Flink and Spark - visualize with R", + "dateUpdated": "Sep 27, 2016 5:55:31 AM", + "config": { + "colWidth": 12.0, + "enabled": true, + "title": true, + "editorMode": "ace/mode/markdown", + "editorHide": true, + "results": [ + { + "graph": { + "mode": "table", + "height": 300.0, + "optionOpen": false, + "keys": [], + "values": [], + "groups": [], + "scatter": {}, + "map": { + "baseMapType": "Streets", + "isOnline": true, + "pinCols": [] + } + } + } + ] + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "jobName": "paragraph_1475016792277_-1100474141", + "id": "20160927-165312_1668894932", + "results": { + "code": "SUCCESS", + "msg": [ + { + "type": "HTML", + "data": "\u003ch3\u003eTaking advantage of Zeppelin Resource Pools\u003c/h3\u003e\n\u003cp\u003eOne of the major motivations for integrating Apache Mahout with Apache Zeppelin was the many benefits that come from leveraging the resource pools. A resource pool is a block of memory that can be acccessed by all interpreters and is useful for sharing small variables between the interpreters.\u003c/p\u003e\n\u003cp\u003eThe Spark interpreter has a simple interface for accessing the ResourcePools, the Flink interface is less documented but can be reverse engineered from code (thanks open source!)\u003c/p\u003e\n\u003cp\u003eCollect betas from Spark and Flink- compare in Python\u003c/p\u003e\n\u003cp\u003eCreate Matrix in Flink and Spark - visualize with R\u003c/p\u003e\n" + } + ] + }, + "dateCreated": "Sep 27, 2016 4:53:12 AM", + "dateStarted": "Sep 27, 2016 5:40:35 AM", + "dateFinished": "Sep 27, 2016 5:40:36 AM", + "status": "FINISHED", + "progressUpdateIntervalMs": 500 + }, + { + "title": "Flink ResourcePools", + "text": "%flinkMahout\n\nimport org.apache.zeppelin.interpreter.InterpreterContext\n\nval resourcePool \u003d InterpreterContext.get().getResourcePool()\n\nresourcePool.put(\"flinkBeta\", beta.asFormatString)\n", + "dateUpdated": "Sep 28, 2016 1:42:35 PM", + "config": { + "colWidth": 6.0, + "enabled": true, + "editorMode": "ace/mode/scala", + "title": true, + "results": [ + { + "graph": { + "mode": "table", + "height": 300.0, + "optionOpen": false, + "keys": [], + "values": [], + "groups": [], + "scatter": {}, + "map": { + "baseMapType": "Streets", + "isOnline": true, + "pinCols": [] + } + } + } + ] + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "jobName": "paragraph_1475019635571_-1705373112", + "id": "20160927-174035_1591078106", + "results": { + "code": "SUCCESS", + "msg": [ + { + "type": "TEXT", + "data": "import org.apache.zeppelin.interpreter.InterpreterContext\nresourcePool: org.apache.zeppelin.resource.ResourcePool \u003d org.apache.zeppelin.resource.DistributedResourcePool@3fdd93cc\n" + } + ] + }, + "dateCreated": "Sep 27, 2016 5:40:35 AM", + "dateStarted": "Sep 28, 2016 1:42:35 PM", + "dateFinished": "Sep 28, 2016 1:42:36 PM", + "status": "FINISHED", + "progressUpdateIntervalMs": 500 + }, + { + "title": "Spark ResourcePools", + "text": "%sparkMahout\n\n\n\n\nz.put(\"sparkBeta\", beta.asFormatString)", + "dateUpdated": "Sep 28, 2016 1:45:35 PM", + "config": { + "colWidth": 6.0, + "enabled": true, + "editorMode": "ace/mode/scala", + "title": true, + "results": [] + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "jobName": "paragraph_1475019751650_-1885234738", + "id": "20160927-174231_1288588876", + "results": { + "code": "SUCCESS", + "msg": [] + }, + "dateCreated": "Sep 27, 2016 5:42:31 AM", + "dateStarted": "Sep 28, 2016 1:45:35 PM", + "dateFinished": "Sep 28, 2016 1:45:36 PM", + "status": "FINISHED", + "progressUpdateIntervalMs": 500 + }, + { + "title": "Collect Results in Python and Evaluate Differences", + "text": "%spark.pyspark\n\nimport ast\n\nflinkBetaDict \u003d ast.literal_eval(z.get(\"flinkBeta\"))\nsparkBetaDict \u003d ast.literal_eval(z.get(\"sparkBeta\"))\n\nprint \"----------------- differences between betas calulated in Flink and Spark-----------------\"\nfor i in range(0,4):\n print \"beta\", i, \": \" , flinkBetaDict[i] - sparkBetaDict[i]", + "dateUpdated": "Sep 28, 2016 1:45:37 PM", + "config": { + "colWidth": 12.0, + "enabled": true, + "editorMode": "ace/mode/python", + "title": true, + "results": [ + { + "graph": { + "mode": "table", + "height": 300.0, + "optionOpen": false, + "keys": [], + "values": [], + "groups": [], + "scatter": {}, + "map": { + "baseMapType": "Streets", + "isOnline": true, + "pinCols": [] + } + } + } + ] + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "jobName": "paragraph_1475020470280_1661203311", + "id": "20160927-175430_1451783515", + "results": { + "code": "SUCCESS", + "msg": [ + { + "type": "TEXT", + "data": "----------------- differences between betas calulated in Flink and Spark-----------------\nbeta 0 : -5.24025267623e-14\nbeta 1 : -2.44249065418e-14\nbeta 2 : 2.28705943073e-14\nbeta 3 : -1.47104550763e-14\n" + } + ] + }, + "dateCreated": "Sep 27, 2016 5:54:30 AM", + "dateStarted": "Sep 28, 2016 1:45:38 PM", + "dateFinished": "Sep 28, 2016 1:45:38 PM", + "status": "FINISHED", + "progressUpdateIntervalMs": 500 + }, + { + "text": "%md\n\n## Plotting Mahout with R\n\nThe following examples show how we can leverage R to plot our results from Mahout\n", + "dateUpdated": "Sep 28, 2016 12:34:33 PM", + "config": { + "colWidth": 12.0, + "enabled": true, + "editorMode": "ace/mode/markdown", + "editorHide": true, + "results": [ + { + "graph": { + "mode": "table", + "height": 300.0, + "optionOpen": false, + "keys": [], + "values": [], + "groups": [], + "scatter": {}, + "map": { + "baseMapType": "Streets", + "isOnline": true, + "pinCols": [] + } + } + } + ] + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "jobName": "paragraph_1475087633007_-566041383", + "id": "20160928-123353_147363530", + "results": { + "code": "SUCCESS", + "msg": [ + { + "type": "HTML", + "data": "\u003ch2\u003ePlotting Mahout with R\u003c/h2\u003e\n\u003cp\u003eThe following examples show how we can leverage R to plot our results from Mahout\u003c/p\u003e\n" + } + ] + }, + "dateCreated": "Sep 28, 2016 12:33:53 PM", + "dateStarted": "Sep 28, 2016 12:34:30 PM", + "dateFinished": "Sep 28, 2016 12:34:30 PM", + "status": "FINISHED", + "progressUpdateIntervalMs": 500 + }, + { + "text": "%flinkMahout\nval mxRnd \u003d Matrices.symmetricUniformView(5000, 2, 1234)\nval drmRand \u003d drmParallelize(mxRnd)\n\n\nval drmSin \u003d drmRand.mapBlock() {case (keys, block) \u003d\u003e \n val blockB \u003d block.like()\n for (i \u003c- 0 until block.nrow) {\n blockB(i, 0) \u003d block(i, 0) \n blockB(i, 1) \u003d Math.sin((block(i, 0) * 8))\n }\n keys -\u003e blockB\n}\n\nresourcePool.put(\"flinkSinDrm\", drm.drmSampleToTSV(drmSin, 0.85))", + "dateUpdated": "Sep 28, 2016 1:52:44 PM", + "config": { + "colWidth": 6.0, + "enabled": true, + "editorMode": "ace/mode/scala", + "results": [ + { + "graph": { + "mode": "table", + "height": 284.0, + "optionOpen": false, + "keys": [], + "values": [], + "groups": [], + "scatter": {}, + "map": { + "baseMapType": "Streets", + "isOnline": true, + "pinCols": [] + } + } + } + ] + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "jobName": "paragraph_1475020580886_2102494975", + "id": "20160927-175620_816809523", + "results": { + "code": "SUCCESS", + "msg": [ + { + "type": "TEXT", + "data": "mxRnd: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:0.4586377101191827,1:0.07261898163580698}\n 1 \u003d\u003e\t{0:0.48977896201757654,1:0.2695201068510176}\n 2 \u003d\u003e\t{0:0.33215452109376786,1:0.2148377346657124}\n 3 \u003d\u003e\t{0:0.4497098649240723,1:0.4331127334380502}\n 4 \u003d\u003e\t{0:-0.03782634247193647,1:-0.32353833540588983}\n 5 \u003d\u003e\t{0:0.15137106418749705,1:0.422446220403861}\n 6 \u003d\u003e\t{0:0.2714115385692545,1:-0.4495233989067956}\n 7 \u003d\u003e\t{0:0.02468155133492185,1:0.49474128114887833}\n 8 \u003d\u003e\t{0:-0.2269662536373416,1:-0.14808249195411455}\n 9 \u003d\u003e\t{0:0.050870692759856756,1:-0.4797329808849356}\n... }\ndrmRand: org.apache.mahout.math.drm.CheckpointedDrm[Int] \u003d org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@72c5b7be\ndrmSin: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpMapBlock(org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@72c5b7be,\u003cfunction1\u003e ,-1,-1,true)\n(2,5000)\n" + } + ] + }, + "dateCreated": "Sep 27, 2016 5:56:20 AM", + "dateStarted": "Sep 28, 2016 1:42:42 PM", + "dateFinished": "Sep 28, 2016 1:42:52 PM", + "status": "FINISHED", + "progressUpdateIntervalMs": 500 + }, + { + "text": "%sparkMahout\nval mxRnd \u003d Matrices.symmetricUniformView(5000, 2, 1234)\nval drmRand \u003d drmParallelize(mxRnd)\n\n\nval drmSin \u003d drmRand.mapBlock() {case (keys, block) \u003d\u003e \n val blockB \u003d block.like()\n for (i \u003c- 0 until block.nrow) {\n blockB(i, 0) \u003d block(i, 0) \n blockB(i, 1) \u003d Math.sin((block(i, 0) * 8))\n }\n keys -\u003e blockB\n}\n\nz.put(\"sparkSinDrm\", org.apache.mahout.math.drm.drmSampleToTSV(drmSin, 0.85))\n", + "dateUpdated": "Sep 27, 2016 6:38:39 AM", + "config": { + "colWidth": 6.0, + "enabled": true, + "editorMode": "ace/mode/scala", + "results": [ + { + "graph": { + "mode": "table", + "height": 300.0, + "optionOpen": false, + "keys": [], + "values": [], + "groups": [], + "scatter": {}, + "map": { + "baseMapType": "Streets", + "isOnline": true, + "pinCols": [] + } + } + } + ] + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "jobName": "paragraph_1475021390512_-2030189316", + "id": "20160927-180950_1754833838", + "results": { + "code": "SUCCESS", + "msg": [ + { + "type": "TEXT", + "data": "\n\n\n\n\n\n\n\n\n\n\n\n\nmxRnd: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:0.4586377101191827,1:0.07261898163580698}\n 1 \u003d\u003e\t{0:0.48977896201757654,1:0.2695201068510176}\n 2 \u003d\u003e\t{0:0.33215452109376786,1:0.2148377346657124}\n 3 \u003d\u003e\t{0:0.4497098649240723,1:0.4331127334380502}\n 4 \u003d\u003e\t{0:-0.03782634247193647,1:-0.32353833540588983}\n 5 \u003d\u003e\t{0:0.15137106418749705,1:0.422446220403861}\n 6 \u003d\u003e\t{0:0.2714115385692545,1:-0.4495233989067956}\n 7 \u003d\u003e\t{0:0.02468155133492185,1:0.49474128114887833}\n 8 \u003d\u003e\t{0:-0.2269662536373416,1:-0.14808249195411455}\n 9 \u003d\u003e\t{0:0.050870692759856756,1:-0.4797329808849356}\n... }\n\ndrmRand: org.apache.mahout.math.drm.CheckpointedDrm[Int] \u003d org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@1d6a6ecf\n\ndrmSin: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpMapBlock(org.apache.mahout.sparkbindings.drm.CheckpointedDrmSpark@ 1d6a6ecf,\u003cfunction1\u003e,-1,-1,true)\n" + } + ] + }, + "dateCreated": "Sep 27, 2016 6:09:50 AM", + "dateStarted": "Sep 27, 2016 6:38:39 AM", + "dateFinished": "Sep 27, 2016 6:38:40 AM", + "status": "FINISHED", + "progressUpdateIntervalMs": 500 + }, + { + "text": "%spark.r {\"imageWidth\": \"400px\"}\n\nlibrary(\"ggplot2\")\n\nflinkSinStr \u003d z.get(\"flinkSinDrm\")\nsparkSinStr \u003d z.get(\"sparkSinDrm\")\n\nflinkData \u003c- read.table(text\u003d flinkSinStr, sep\u003d\"\\t\", header\u003dFALSE)\nsparkData \u003c- read.table(text\u003d sparkSinStr, sep\u003d\"\\t\", header\u003dFALSE)\n\nplot(flinkData, col\u003d\"red\")\n# Graph trucks with red dashed line and square points\npoints(sparkData, col\u003d\"blue\")\n\n# Create a title with a red, bold/italic font\ntitle(main\u003d\"Sampled Mahout Sin Graph in R\", col.main\u003d\"black\", font.main\u003d4)\n\nlegend(\"bottomright\", c(\"Apache Flink\", \"Apache Spark\"), col\u003d c(\"red\", \"blue\"), pch\u003d c(22, 22)) \n\n", + "dateUpdated": "Sep 28, 2016 1:52:26 PM", + "config": { + "colWidth": 6.0, + "enabled": true, + "editorMode": "ace/mode/r", + "results": [ + { + "graph": { + "mode": "table", + "height": 300.0, + "optionOpen": false, + "keys": [], + "values": [], + "groups": [], + "scatter": {}, + "map": { + "baseMapType": "Streets", + "isOnline": true, + "pinCols": [] + } + } + } + ] + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "jobName": "paragraph_1475021654999_1062405375", + "id": "20160927-181414_1420533932", + "results": { + "code": "SUCCESS", + "msg": [ + { + "type": "HTML", + "data": "\u003cp\u003e\u003cimg src\u003d\"data:image/png;base64,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\" alt\u003d\"plot of chunk unnamed-chunk-1\" width\u003d\"400px\" /\u003e\u003c/p\u003e" + } + ] + }, + "dateCreated": "Sep 27, 2016 6:14:14 AM", + "dateStarted": "Sep 27, 2016 6:42:20 AM", + "dateFinished": "Sep 27, 2016 6:42:20 AM", + "status": "FINISHED", + "progressUpdateIntervalMs": 500 + }, + { + "title": "Create a Gaussian Matrix", + "text": "%flinkMahout\n\nval mxRnd3d \u003d Matrices.symmetricUniformView(5000, 3, 1234)\nval drmRand3d \u003d drmParallelize(mxRnd3d)\n\nval drmGauss \u003d drmRand3d.mapBlock() {case (keys, block) \u003d\u003e\n val blockB \u003d block.like()\n for (i \u003c- 0 until block.nrow) {\n val x: Double \u003d block(i, 0)\n val y: Double \u003d block(i, 1)\n val z: Double \u003d block(i, 2)\n\n blockB(i, 0) \u003d x\n blockB(i, 1) \u003d y\n blockB(i, 2) \u003d Math.exp(-((Math.pow(x, 2)) + (Math.pow(y, 2)))/2)\n }\n keys -\u003e blockB\n}\n\nresourcePool.put(\"flinkGaussDrm\", drm.drmSampleToTSV(drmGauss, 50.0))", + "dateUpdated": "Sep 28, 2016 1:53:22 PM", + "config": { + "colWidth": 6.0, + "enabled": true, + "editorMode": "ace/mode/scala", + "tableHide": true, + "title": true, + "results": [ + { + "graph": { + "mode": "table", + "height": 300.0, + "optionOpen": false, + "keys": [], + "values": [], + "groups": [], + "scatter": {}, + "map": { + "baseMapType": "Streets", + "isOnline": true, + "pinCols": [] + } + } + } + ] + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "jobName": "paragraph_1475021740078_127388926", + "id": "20160927-181540_1706054053", + "results": { + "code": "SUCCESS", + "msg": [ + { + "type": "TEXT", + "data": "mxRnd3d: org.apache.mahout.math.Matrix \u003d \n{\n 0 \u003d\u003e\t{0:0.4586377101191827,1:0.07261898163580698,2:-0.4120814898385057}\n 1 \u003d\u003e\t{0:0.48977896201757654,1:0.2695201068510176,2:0.2035624121801051}\n 2 \u003d\u003e\t{0:0.33215452109376786,1:0.2148377346657124,2:0.22923597484837382}\n 3 \u003d\u003e\t{0:0.4497098649240723,1:0.4331127334380502,2:-0.26063522630725094}\n 4 \u003d\u003e\t{0:-0.03782634247193647,1:-0.32353833540588983,2:-0.4423256266785404}\n 5 \u003d\u003e\t{0:0.15137106418749705,1:0.422446220403861,2:-0.20452218901606223}\n 6 \u003d\u003e\t{0:0.2714115385692545,1:-0.4495233989067956,2:0.13402344186662743}\n 7 \u003d\u003e\t{0:0.02468155133492185,1:0.49474128114887833,2:-0.484577970998106}\n 8 \u003d\u003e\t{0:-0.2269662536373416,1:-0.14808249195411455,2:-0.16159073199184967}\n 9 \u003d\u003e\t{0:0.050870692759856756,1:-0.4797329808849356,2:0.30230792168515175}\n... }\ndrmRand3d: org.apache.mahout.math.drm.CheckpointedDrm[Int] \u 003d org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@448a1f4e\ndrmGauss: org.apache.mahout.math.drm.DrmLike[Int] \u003d OpMapBlock(org.apache.mahout.flinkbindings.drm.CheckpointedFlinkDrm@448a1f4e,\u003cfunction1\u003e,-1,-1,true)\n(3,5000)\n" + } + ] + }, + "dateCreated": "Sep 27, 2016 6:15:40 AM", + "dateStarted": "Sep 28, 2016 1:50:54 PM", + "dateFinished": "Sep 28, 2016 1:51:00 PM", + "status": "FINISHED", + "progressUpdateIntervalMs": 500 + }, + { + "text": "%spark.r {\"imageWidth\": \"400px\"}\n\nlibrary(scatterplot3d)\n\n\nflinkGaussStr \u003d z.get(\"flinkGaussDrm\")\nflinkData \u003c- read.table(text\u003d flinkGaussStr, sep\u003d\"\\t\", header\u003dFALSE)\n\nscatterplot3d(flinkData, color\u003d\"green\")\n\n", + "dateUpdated": "Sep 28, 2016 1:54:56 PM", + "config": { + "colWidth": 6.0, + "enabled": true, + "editorMode": "ace/mode/r", + "results": [ + { + "graph": { + "mode": "table", + "height": 300.0, + "optionOpen": false, + "keys": [], + "values": [], + "groups": [], + "scatter": {}, + "map": { + "baseMapType": "Streets", + "isOnline": true, + "pinCols": [] + } + } + } + ] + }, + "settings": { + "params": {}, + "forms": {} + }, + "apps": [], + "jobName": "paragraph_1475023444293_-1038534869", + "id": "20160927-184404_773885252", + "results": { + "code": "SUCCESS", + "msg": [ + { + "type": "HTML", + "data": "\u003cp\u003e\u003cimg src\u003d\"data:image/png;base64,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
<TRUNCATED>