diff --git a/bin/interpreter.sh b/bin/interpreter.sh index a81c8f21067..4fb4b269265 100755 --- a/bin/interpreter.sh +++ b/bin/interpreter.sh @@ -149,6 +149,28 @@ elif [[ "${INTERPRETER_ID}" == "hbase" ]]; then else echo "HBASE_HOME and HBASE_CONF_DIR are not set, configuration might not be loaded" fi +elif [[ "${INTERPRETER_ID}" == "pig" ]]; then + # autodetect HADOOP_CONF_HOME by heuristic + if [[ -n "${HADOOP_HOME}" ]] && [[ -z "${HADOOP_CONF_DIR}" ]]; then + if [[ -d "${HADOOP_HOME}/etc/hadoop" ]]; then + export HADOOP_CONF_DIR="${HADOOP_HOME}/etc/hadoop" + elif [[ -d "/etc/hadoop/conf" ]]; then + export HADOOP_CONF_DIR="/etc/hadoop/conf" + fi + fi + + if [[ -n "${HADOOP_CONF_DIR}" ]] && [[ -d "${HADOOP_CONF_DIR}" ]]; then + ZEPPELIN_INTP_CLASSPATH+=":${HADOOP_CONF_DIR}" + fi + + # autodetect TEZ_CONF_DIR + if [[ -n "${TEZ_CONF_DIR}" ]]; then + ZEPPELIN_INTP_CLASSPATH+=":${TEZ_CONF_DIR}" + elif [[ -d "/etc/tez/conf" ]]; then + ZEPPELIN_INTP_CLASSPATH+=":/etc/tez/conf" + else + echo "TEZ_CONF_DIR is not set, configuration might not be loaded" + fi fi addJarInDirForIntp "${LOCAL_INTERPRETER_REPO}" diff --git a/conf/interpreter-list b/conf/interpreter-list index 098b3c6c188..38cb386d8cd 100644 --- a/conf/interpreter-list +++ b/conf/interpreter-list @@ -32,6 +32,7 @@ kylin org.apache.zeppelin:zeppelin-kylin:0.6.1 Kylin in lens org.apache.zeppelin:zeppelin-lens:0.6.1 Lens interpreter livy org.apache.zeppelin:zeppelin-livy:0.6.1 Livy interpreter md org.apache.zeppelin:zeppelin-markdown:0.6.1 Markdown support +pig org.apache.zeppelin:zeppelin-pig:0.6.1 Pig interpreter postgresql org.apache.zeppelin:zeppelin-postgresql:0.6.1 Postgresql interpreter python org.apache.zeppelin:zeppelin-python:0.6.1 Python interpreter shell org.apache.zeppelin:zeppelin-shell:0.6.1 Shell command diff --git a/conf/zeppelin-site.xml.template b/conf/zeppelin-site.xml.template index 05bd7195277..c4b369c301c 100755 --- a/conf/zeppelin-site.xml.template +++ b/conf/zeppelin-site.xml.template @@ -190,7 +190,7 @@ zeppelin.interpreters - org.apache.zeppelin.spark.SparkInterpreter,org.apache.zeppelin.spark.PySparkInterpreter,org.apache.zeppelin.rinterpreter.RRepl,org.apache.zeppelin.rinterpreter.KnitR,org.apache.zeppelin.spark.SparkRInterpreter,org.apache.zeppelin.spark.SparkSqlInterpreter,org.apache.zeppelin.spark.DepInterpreter,org.apache.zeppelin.markdown.Markdown,org.apache.zeppelin.angular.AngularInterpreter,org.apache.zeppelin.shell.ShellInterpreter,org.apache.zeppelin.file.HDFSFileInterpreter,org.apache.zeppelin.flink.FlinkInterpreter,,org.apache.zeppelin.python.PythonInterpreter,org.apache.zeppelin.lens.LensInterpreter,org.apache.zeppelin.ignite.IgniteInterpreter,org.apache.zeppelin.ignite.IgniteSqlInterpreter,org.apache.zeppelin.cassandra.CassandraInterpreter,org.apache.zeppelin.geode.GeodeOqlInterpreter,org.apache.zeppelin.postgresql.PostgreSqlInterpreter,org.apache.zeppelin.jdbc.JDBCInterpreter,org.apache.zeppelin.kylin.KylinInterpreter,org.apache.zeppelin.elasticsearch.ElasticsearchInterpreter,org.apache.zeppelin.scalding.ScaldingInterpreter,org.apache.zeppelin.alluxio.AlluxioInterpreter,org.apache.zeppelin.hbase.HbaseInterpreter,org.apache.zeppelin.livy.LivySparkInterpreter,org.apache.zeppelin.livy.LivyPySparkInterpreter,org.apache.zeppelin.livy.LivySparkRInterpreter,org.apache.zeppelin.livy.LivySparkSQLInterpreter,org.apache.zeppelin.bigquery.BigQueryInterpreter,org.apache.zeppelin.beam.BeamInterpreter + org.apache.zeppelin.spark.SparkInterpreter,org.apache.zeppelin.spark.PySparkInterpreter,org.apache.zeppelin.rinterpreter.RRepl,org.apache.zeppelin.rinterpreter.KnitR,org.apache.zeppelin.spark.SparkRInterpreter,org.apache.zeppelin.spark.SparkSqlInterpreter,org.apache.zeppelin.spark.DepInterpreter,org.apache.zeppelin.markdown.Markdown,org.apache.zeppelin.angular.AngularInterpreter,org.apache.zeppelin.shell.ShellInterpreter,org.apache.zeppelin.file.HDFSFileInterpreter,org.apache.zeppelin.flink.FlinkInterpreter,,org.apache.zeppelin.python.PythonInterpreter,org.apache.zeppelin.lens.LensInterpreter,org.apache.zeppelin.ignite.IgniteInterpreter,org.apache.zeppelin.ignite.IgniteSqlInterpreter,org.apache.zeppelin.cassandra.CassandraInterpreter,org.apache.zeppelin.geode.GeodeOqlInterpreter,org.apache.zeppelin.postgresql.PostgreSqlInterpreter,org.apache.zeppelin.jdbc.JDBCInterpreter,org.apache.zeppelin.kylin.KylinInterpreter,org.apache.zeppelin.elasticsearch.ElasticsearchInterpreter,org.apache.zeppelin.scalding.ScaldingInterpreter,org.apache.zeppelin.alluxio.AlluxioInterpreter,org.apache.zeppelin.hbase.HbaseInterpreter,org.apache.zeppelin.livy.LivySparkInterpreter,org.apache.zeppelin.livy.LivyPySparkInterpreter,org.apache.zeppelin.livy.LivySparkRInterpreter,org.apache.zeppelin.livy.LivySparkSQLInterpreter,org.apache.zeppelin.bigquery.BigQueryInterpreter,org.apache.zeppelin.beam.BeamInterpreter,org.apache.zeppelin.pig.PigInterpreter, org.apache.zeppelin.pig.PigQueryInterpreter Comma separated interpreter configurations. First interpreter become a default diff --git a/docs/_includes/themes/zeppelin/_navigation.html b/docs/_includes/themes/zeppelin/_navigation.html index a0e4485db88..1b1fdbf1035 100644 --- a/docs/_includes/themes/zeppelin/_navigation.html +++ b/docs/_includes/themes/zeppelin/_navigation.html @@ -62,6 +62,7 @@
  • Lens
  • Livy
  • Markdown
  • +
  • Pig
  • Python
  • Postgresql, HAWQ
  • R
  • @@ -118,8 +119,6 @@
  • How to contribute (website)
  • - - -
    +
    Keys @@ -165,52 +165,4 @@
    - -
    -
    - - Latitude -
      -
    • -
      - {{paragraph.config.graph.map.lat.name}} -
      -
    • -
    -
    -
    -
    - - Longitude -
      -
    • -
      - {{paragraph.config.graph.map.lng.name}} -
      -
    • -
    -
    -
    -
    - - Pin contents -
      -
    • -
      - {{col.name}} -
      -
    • -
    -
    -
    -
    diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js index 6eaba8282db..deab258ed65 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js @@ -30,13 +30,12 @@ 'websocketMsgSrv', 'baseUrlSrv', 'ngToast', - 'saveAsService', - 'esriLoader' + 'saveAsService' ]; function ParagraphCtrl($scope, $rootScope, $route, $window, $routeParams, $location, $timeout, $compile, $http, $q, websocketMsgSrv, - baseUrlSrv, ngToast, saveAsService, esriLoader) { + baseUrlSrv, ngToast, saveAsService) { var ANGULAR_FUNCTION_OBJECT_NAME_PREFIX = '_Z_ANGULAR_FUNC_'; $scope.parentNote = null; $scope.paragraph = null; @@ -105,7 +104,6 @@ $scope.parentNote = note; $scope.originalText = angular.copy(newParagraph.text); $scope.chart = {}; - $scope.baseMapOption = ['Streets', 'Satellite', 'Hybrid', 'Topo', 'Gray', 'Oceans', 'Terrain']; $scope.colWidthOption = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; $scope.paragraphFocused = false; if (newParagraph.focus) { @@ -257,22 +255,6 @@ config.graph.scatter = {}; } - if (!config.graph.map) { - config.graph.map = {}; - } - - if (!config.graph.map.baseMapType) { - config.graph.map.baseMapType = $scope.baseMapOption[0]; - } - - if (!config.graph.map.isOnline) { - config.graph.map.isOnline = true; - } - - if (!config.graph.map.pinCols) { - config.graph.map.pinCols = []; - } - if (config.enabled === undefined) { config.enabled = true; } @@ -974,8 +956,6 @@ if (!type || type === 'table') { setTable($scope.paragraph.result, refresh); - } else if (type === 'map') { - setMap($scope.paragraph.result, refresh); } else { setD3Chart(type, $scope.paragraph.result, refresh); } @@ -1206,236 +1186,6 @@ $timeout(retryRenderer); }; - var setMap = function(data, refresh) { - var createPinMapLayer = function(pins, cb) { - esriLoader.require(['esri/layers/FeatureLayer'], function(FeatureLayer) { - var pinLayer = new FeatureLayer({ - id: 'pins', - spatialReference: $scope.map.spatialReference, - geometryType: 'point', - source: pins, - fields: [], - objectIdField: '_ObjectID', - renderer: $scope.map.pinRenderer, - popupTemplate: { - title: '[{_lng}, {_lat}]', - content: [{ - type: 'fields', - fieldInfos: [] - }] - } - }); - - // add user-selected pin info fields to popup - var pinInfoCols = $scope.paragraph.config.graph.map.pinCols; - for (var i = 0; i < pinInfoCols.length; ++i) { - pinLayer.popupTemplate.content[0].fieldInfos.push({ - fieldName: pinInfoCols[i].name, - visible: true - }); - } - cb(pinLayer); - }); - }; - - var getMapPins = function(cb) { - esriLoader.require(['esri/geometry/Point'], function(Point, FeatureLayer) { - var latCol = $scope.paragraph.config.graph.map.lat; - var lngCol = $scope.paragraph.config.graph.map.lng; - var pinInfoCols = $scope.paragraph.config.graph.map.pinCols; - var pins = []; - - // construct objects for pins - if (latCol && lngCol && data.rows) { - for (var i = 0; i < data.rows.length; ++i) { - var row = data.rows[i]; - var lng = row[lngCol.index]; - var lat = row[latCol.index]; - var pin = { - geometry: new Point({ - longitude: lng, - latitude: lat, - spatialReference: $scope.map.spatialReference - }), - attributes: { - _ObjectID: i, - _lng: lng, - _lat: lat - } - }; - - // add pin info from user-selected columns - for (var j = 0; j < pinInfoCols.length; ++j) { - var col = pinInfoCols[j]; - pin.attributes[col.name] = row[col.index]; - } - pins.push(pin); - } - } - cb(pins); - }); - }; - - var updateMapPins = function() { - var pinLayer = $scope.map.map.findLayerById('pins'); - $scope.map.popup.close(); - if (pinLayer) { - $scope.map.map.remove(pinLayer); - } - - // add pins to map as layer - getMapPins(function(pins) { - createPinMapLayer(pins, function(pinLayer) { - $scope.map.map.add(pinLayer); - if (pinLayer.source.length > 0) { - $scope.map.goTo(pinLayer.source); - } - }); - }); - }; - - var createMap = function(mapdiv) { - // prevent zooming with the scroll wheel - var disableZoom = function(e) { - var evt = e || window.event; - evt.cancelBubble = true; - evt.returnValue = false; - if (evt.stopPropagation) { - evt.stopPropagation(); - } - }; - var eName = window.WheelEvent ? 'wheel' : // Modern browsers - window.MouseWheelEvent ? 'mousewheel' : // WebKit and IE - 'DOMMouseScroll'; // Old Firefox - mapdiv.addEventListener(eName, disableZoom, true); - - esriLoader.require(['esri/views/MapView', - 'esri/Map', - 'esri/renderers/SimpleRenderer', - 'esri/symbols/SimpleMarkerSymbol'], - function(MapView, Map, SimpleRenderer, SimpleMarkerSymbol) { - $scope.map = new MapView({ - container: mapdiv, - map: new Map({ - basemap: $scope.paragraph.config.graph.map.baseMapType.toLowerCase() - }), - center: [-106.3468, 56.1304], // Canada (lng, lat) - zoom: 2, - pinRenderer: new SimpleRenderer({ - symbol: new SimpleMarkerSymbol({ - 'color': [255, 0, 0, 0.5], - 'size': 16.5, - 'outline': { - 'color': [0, 0, 0, 1], - 'width': 1.125, - }, - // map pin SVG path - 'path': 'M16,3.5c-4.142,0-7.5,3.358-7.5,7.5c0,4.143,7.5,18.121,7.5,' + - '18.121S23.5,15.143,23.5,11C23.5,6.858,20.143,3.5,16,3.5z ' + - 'M16,14.584c-1.979,0-3.584-1.604-3.584-3.584S14.021,7.416,' + - '16,7.416S19.584,9.021,19.584,11S17.979,14.584,16,14.584z' - }) - }) - }); - - $scope.map.on('click', function() { - // ArcGIS JS API 4.0 does not account for scrolling or position - // changes by default (this is a bug, to be fixed in the upcoming - // version 4.1; see https://geonet.esri.com/thread/177238#comment-609681). - // This results in a misaligned popup. - - // Workaround: manually set popup position to match position of selected pin - if ($scope.map.popup.selectedFeature) { - $scope.map.popup.location = $scope.map.popup.selectedFeature.geometry; - } - }); - $scope.map.then(updateMapPins); - }); - }; - - var checkMapOnline = function(cb) { - // are we able to get a response from the ArcGIS servers? - var callback = function(res) { - var online = (res.status > 0); - $scope.paragraph.config.graph.map.isOnline = online; - cb(online); - }; - $http.head('//services.arcgisonline.com/arcgis/', { - timeout: 5000, - withCredentials: false - }).then(callback, callback); - }; - - var renderMap = function() { - var mapdiv = angular.element('#p' + $scope.paragraph.id + '_map') - .css('height', $scope.paragraph.config.graph.height) - .children('div').get(0); - - // on chart type change, destroy map to force reinitialization. - if ($scope.map && !refresh) { - $scope.map.map.destroy(); - $scope.map.pinRenderer = null; - $scope.map = null; - } - - var requireMapCSS = function() { - var url = '//js.arcgis.com/4.0/esri/css/main.css'; - if (!angular.element('link[href="' + url + '"]').length) { - var link = document.createElement('link'); - link.rel = 'stylesheet'; - link.type = 'text/css'; - link.href = url; - angular.element('head').append(link); - } - }; - - var requireMapJS = function(cb) { - if (!esriLoader.isLoaded()) { - esriLoader.bootstrap({ - url: '//js.arcgis.com/4.0' - }).then(cb); - } else { - cb(); - } - }; - - checkMapOnline(function(online) { - // we need an internet connection to use the map - if (online) { - // create map if not exists. - if (!$scope.map) { - requireMapCSS(); - requireMapJS(function() { - createMap(mapdiv); - }); - } else { - updateMapPins(); - } - } - }); - }; - - var retryRenderer = function() { - if (angular.element('#p' + $scope.paragraph.id + '_map div').length) { - try { - renderMap(); - } catch (err) { - console.log('Map drawing error %o', err); - } - } else { - $timeout(retryRenderer,10); - } - }; - $timeout(retryRenderer); - }; - - $scope.setMapBaseMap = function(bm) { - $scope.paragraph.config.graph.map.baseMapType = bm; - if ($scope.map) { - $scope.map.map.basemap = bm.toLowerCase(); - } - }; - $scope.isGraphMode = function(graphName) { var activeAppId = _.get($scope.paragraph.config, 'helium.activeApp'); if ($scope.getResultType() === 'TABLE' && $scope.getGraphMode() === graphName && !activeAppId) { @@ -1498,24 +1248,6 @@ $scope.setGraphMode($scope.paragraph.config.graph.mode, true, false); }; - $scope.removeMapOptionLat = function(idx) { - $scope.paragraph.config.graph.map.lat = null; - clearUnknownColsFromGraphOption(); - $scope.setGraphMode($scope.paragraph.config.graph.mode, true, false); - }; - - $scope.removeMapOptionLng = function(idx) { - $scope.paragraph.config.graph.map.lng = null; - clearUnknownColsFromGraphOption(); - $scope.setGraphMode($scope.paragraph.config.graph.mode, true, false); - }; - - $scope.removeMapOptionPinInfo = function(idx) { - $scope.paragraph.config.graph.map.pinCols.splice(idx, 1); - clearUnknownColsFromGraphOption(); - $scope.setGraphMode($scope.paragraph.config.graph.mode, true, false); - }; - /* Clear unknown columns from graph option */ var clearUnknownColsFromGraphOption = function() { var unique = function(list) { @@ -1574,10 +1306,6 @@ removeUnknown($scope.paragraph.config.graph.groups); removeUnknownFromFields($scope.paragraph.config.graph.scatter); - - unique($scope.paragraph.config.graph.map.pinCols); - removeUnknown($scope.paragraph.config.graph.map.pinCols); - removeUnknownFromFields($scope.paragraph.config.graph.map); }; /* select default key and value if there're none selected */ @@ -1598,23 +1326,6 @@ $scope.paragraph.config.graph.scatter.xAxis = $scope.paragraph.result.columnNames[0]; } } - - /* try to find columns for the map logitude and latitude */ - var findDefaultMapCol = function(settingName, keyword) { - var col; - if (!$scope.paragraph.config.graph.map[settingName]) { - for (var i = 0; i < $scope.paragraph.result.columnNames.length; ++i) { - col = $scope.paragraph.result.columnNames[i]; - if (col.name.toUpperCase().indexOf(keyword) !== -1) { - $scope.paragraph.config.graph.map[settingName] = col; - break; - } - } - } - }; - - findDefaultMapCol('lat', 'LAT'); - findDefaultMapCol('lng', 'LONG'); }; var pivot = function(data) { diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.css b/zeppelin-web/src/app/notebook/paragraph/paragraph.css index 0b821c94181..60b93d0f9a1 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.css +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.css @@ -331,41 +331,12 @@ table.dataTable.table-condensed .sorting_desc:after { .tableDisplay div { } -.tableDisplay img:not(.esri-bitmap) { +.tableDisplay img { display: block; max-width: 100%; height: auto; } -.esri-display-object > svg { - overflow: visible; -} - -.esri-popup > .esri-docked.esri-dock-to-bottom { - padding: 8px; - margin-top: 0px; -} - -.esri-popup-main { - max-height: 100%; -} - -span.map-offline-text { - display: table; - width: 100%; - height: 100%; - text-align: center; -} - -span.map-offline-text > span { - display: table-cell; - vertical-align: middle; - font-size: 18px; - font-weight: 700; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - color: #212121; -} - .tableDisplay .btn-group span { margin: 10px 0 0 10px; font-size: 12px; @@ -383,8 +354,7 @@ span.map-offline-text > span { } -.tableDisplay .option .columns, -div.esri-view { +.tableDisplay .option .columns { height: 100%; } diff --git a/zeppelin-web/src/components/navbar/navbar.controller.js b/zeppelin-web/src/components/navbar/navbar.controller.js index 7838a824e20..8586960af1c 100644 --- a/zeppelin-web/src/components/navbar/navbar.controller.js +++ b/zeppelin-web/src/components/navbar/navbar.controller.js @@ -57,6 +57,7 @@ } function initController() { + $scope.isDrawNavbarNotebookList = false; angular.element('#notebook-list').perfectScrollbar({suppressScrollX: true}); angular.element(document).click(function() { @@ -122,6 +123,19 @@ $scope.$on('loginSuccess', function(event, param) { loadNotes(); }); + + /* + ** Performance optimization for Browser Render. + */ + angular.element(document).ready(function() { + angular.element('.notebook-list-dropdown').on('show.bs.dropdown', function() { + $scope.isDrawNavbarNotebookList = true; + }); + + angular.element('.notebook-list-dropdown').on('hide.bs.dropdown', function() { + $scope.isDrawNavbarNotebookList = false; + }); + }); } })(); diff --git a/zeppelin-web/src/components/navbar/navbar.html b/zeppelin-web/src/components/navbar/navbar.html index c4de8468076..8851409b025 100644 --- a/zeppelin-web/src/components/navbar/navbar.html +++ b/zeppelin-web/src/components/navbar/navbar.html @@ -25,12 +25,12 @@