Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -73,16 +73,16 @@ public class SparkInterpreter extends Interpreter {
"spark",
SparkInterpreter.class.getName(),
new InterpreterPropertyBuilder()
.add("spark.app.name", "Zeppelin", "The name of spark application")
.add("spark.app.name", "Zeppelin", "The name of spark application.")
.add("master",
getSystemDefault("MASTER", "spark.master", "local[*]"),
"spark master uri. ex) spark://masterhost:7077")
"Spark master uri. ex) spark://masterhost:7077")
.add("spark.executor.memory",
getSystemDefault(null, "spark.executor.memory", "512m"),
"executor memory per worker instance. ex) 512m, 32g")
"Executor memory per worker instance. ex) 512m, 32g")
.add("spark.cores.max",
getSystemDefault(null, "spark.cores.max", ""),
"total number of cores to use. Empty value uses all available core")
"Total number of cores to use. Empty value uses all available core.")
.add("args", "", "spark commandline args").build());

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,9 @@ public class SparkSqlInterpreter extends Interpreter {
"spark",
SparkSqlInterpreter.class.getName(),
new InterpreterPropertyBuilder()
.add("zeppelin.spark.maxResult", "10000", "Max number of SparkSQL result to display")
.add("zeppelin.spark.maxResult", "10000", "Max number of SparkSQL result to display.")
.add("zeppelin.spark.useHiveContext", "false",
"use HiveContext instead of SQLContext if it is true")
"Use HiveContext instead of SQLContext if it is true.")
.add("zeppelin.spark.concurrentSQL", "false",
"Execute multiple SQL concurrently if set true.")
.build());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,23 @@ public Response newSettings(String message) throws InterpreterException, IOExcep
return new JsonResponse(Status.CREATED, "").build();
}

@PUT
@Path("setting/{settingId}")
public Response updateSetting(String message, @PathParam("settingId") String settingId) {
logger.info("Update interpreterSetting {}", settingId);
try {
Properties p = gson.fromJson(message, Properties.class);
interpreterFactory.setPropertyAndRestart(settingId, p);
} catch (InterpreterException e) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe it is good to start to handle different error, for exemple the JsonSyntaxException, imagine in my request i send Yo died, then i will get a 500, maybe we can catch this and return a proper http code like 400 Bad Request

return new JsonResponse(Status.NOT_FOUND, e.getMessage(), e).build();
}
InterpreterSetting setting = interpreterFactory.get(settingId);
if (setting == null) {
return new JsonResponse(Status.NOT_FOUND, "", settingId).build();
}
return new JsonResponse(Status.OK, "", setting).build();
}

@DELETE
@Path("setting/{settingId}")
@ApiOperation(httpMethod = "GET", value = "Remove interpreter setting")
Expand Down
2 changes: 2 additions & 0 deletions zeppelin-web/app/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
<link rel="stylesheet" href="bower_components/nvd3/src/nv.d3.css" />
<link rel="stylesheet" href="bower_components/perfect-scrollbar/src/perfect-scrollbar.css" />
<link rel="stylesheet" href="bower_components/ng-sortable/dist/ng-sortable.css" />
<link rel="stylesheet" href="bower_components/angular-xeditable/dist/css/xeditable.css" />
<!-- endbower -->
<link rel="stylesheet" href="bower_components/jquery-ui/themes/base/all.css" />
<!-- endbuild -->
Expand Down Expand Up @@ -132,6 +133,7 @@
<script src="bower_components/ng-sortable/dist/ng-sortable.js"></script>
<script src="bower_components/angular-elastic/elastic.js"></script>
<script src="bower_components/angular-elastic-input/dist/angular-elastic-input.min.js"></script>
<script src="bower_components/angular-xeditable/dist/js/xeditable.js"></script>
<!-- endbower -->
<!-- endbuild -->
<!-- build:js({.tmp,app}) scripts/scripts.js -->
Expand Down
3 changes: 2 additions & 1 deletion zeppelin-web/app/scripts/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@ angular
'ngTouch',
'ngDragDrop',
'monospaced.elastic',
'puElasticInput'
'puElasticInput',
'xeditable'
])
.filter('breakFilter', function() {
return function (text) {
Expand Down
151 changes: 119 additions & 32 deletions zeppelin-web/app/scripts/controllers/interpreter.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,23 @@
angular.module('zeppelinWebApp').controller('InterpreterCtrl', function($scope, $route, $routeParams, $location, $rootScope, $http) {

var remoteSettingToLocalSetting = function(settingId, setting) {
var property = {};
for (var key in setting.properties) {
property[key] = {
value : setting.properties[key]
};
}
return {
id : settingId,
name : setting.name,
group : setting.group,
properties : setting.properties,
properties : property,
interpreters : setting.interpreterGroup
}
};
};

var getInterpreterSettings = function() {
$http.get(getRestApiBase()+"/interpreter/setting").
$http.get(getRestApiBase()+'/interpreter/setting').
success(function(data, status, headers, config) {
var interpreterSettings = [];
//console.log("getInterpreterSettings=%o", data);
Expand All @@ -48,13 +54,12 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', function($scope,
$scope.interpreterSettings = interpreterSettings;
}).
error(function(data, status, headers, config) {
console.log("Error %o %o", status, data.message);
console.log('Error %o %o', status, data.message);
});
};


var getAvailableInterpreters = function() {
$http.get(getRestApiBase()+"/interpreter").
$http.get(getRestApiBase()+'/interpreter').
success(function(data, status, headers, config) {
var groupedInfo = {};
var info;
Expand All @@ -74,18 +79,75 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', function($scope,
//console.log("getAvailableInterpreters=%o", data);
}).
error(function(data, status, headers, config) {
console.log("Error %o %o", status, data.message);
console.log('Error %o %o', status, data.message);
});
};

$scope.copyOriginInterpreterSettingProperties = function(settingId) {
$scope.interpreterSettingProperties = {};
for (var i=0; i < $scope.interpreterSettings.length; i++) {
var setting = $scope.interpreterSettings[i];
if(setting.id === settingId) {
angular.copy(setting.properties, $scope.interpreterSettingProperties);
break;
}
}
console.log('%o, %o', $scope.interpreterSettings[i], $scope.interpreterSettingProperties);
};

$scope.updateInterpreterSetting = function(settingId) {
var result = confirm('Do you want to update this interpreter and restart with new settings?');
if (!result) {
return;
}

$scope.addNewInterpreterProperty(settingId);

var properties = {};
for (var i=0; i < $scope.interpreterSettings.length; i++) {
var setting = $scope.interpreterSettings[i];
if(setting.id === settingId) {
for (var p in setting.properties) {
properties[p] = setting.properties[p].value;
}
break;
}
}

$http.put(getRestApiBase()+'/interpreter/setting/'+settingId, properties).
success(function(data, status, headers, config) {
for (var i=0; i < $scope.interpreterSettings.length; i++) {
var setting = $scope.interpreterSettings[i];
if (setting.id === settingId) {
$scope.interpreterSettings.splice(i, 1);
$scope.interpreterSettings.splice(i, 0, remoteSettingToLocalSetting(settingId, data.body));
break;
}
}
}).
error(function(data, status, headers, config) {
console.log('Error %o %o', status, data.message);
});
};

$scope.resetInterpreterSetting = function(settingId){
for (var i=0; i<$scope.interpreterSettings.length; i++) {
var setting = $scope.interpreterSettings[i];
if (setting.id ===settingId) {
angular.copy($scope.interpreterSettingProperties, setting.properties);
break;
}
}
};

$scope.removeInterpreterSetting = function(settingId) {
var result = confirm('Do you want to delete this interpreter setting?');
if (!result) {
return;
}

console.log("Delete setting %o", settingId);
$http.delete(getRestApiBase()+"/interpreter/setting/"+settingId).
console.log('Delete setting %o', settingId);
$http.delete(getRestApiBase()+'/interpreter/setting/'+settingId).
success(function(data, status, headers, config) {
for (var i=0; i < $scope.interpreterSettings.length; i++) {
var setting = $scope.interpreterSettings[i];
Expand All @@ -96,7 +158,7 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', function($scope,
}
}).
error(function(data, status, headers, config) {
console.log("Error %o %o", status, data.message);
console.log('Error %o %o', status, data.message);
});
};

Expand All @@ -109,7 +171,7 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', function($scope,
property[key] = {
value : intpInfo.properties[key].defaultValue,
description : intpInfo.properties[key].description
}
};
}
}
$scope.newInterpreterSetting.properties = property;
Expand All @@ -121,7 +183,7 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', function($scope,
return;
}

$http.put(getRestApiBase()+"/interpreter/setting/restart/"+settingId).
$http.put(getRestApiBase()+'/interpreter/setting/restart/'+settingId).
success(function(data, status, headers, config) {
for (var i=0; i < $scope.interpreterSettings.length; i++) {
var setting = $scope.interpreterSettings[i];
Expand All @@ -133,21 +195,20 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', function($scope,
}
}).
error(function(data, status, headers, config) {
console.log("Error %o %o", status, data.message);
console.log('Error %o %o', status, data.message);
});

};

$scope.addNewInterpreterSetting = function() {
if (!$scope.newInterpreterSetting.name || !$scope.newInterpreterSetting.group) {
alert("Please determine name and interpreter");
alert('Please determine name and interpreter');
return;
}

for (var i=0; i<$scope.interpreterSettings.length; i++) {
var setting = $scope.interpreterSettings[i];
if (setting.name === $scope.newInterpreterSetting.name) {
alert("Name '"+setting.name+"' already exists");
alert('Name ' + setting.name + ' already exists');
return;
}
}
Expand All @@ -162,16 +223,16 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', function($scope,

for (var p in $scope.newInterpreterSetting.properties) {
newSetting.properties[p] = $scope.newInterpreterSetting.properties[p].value;
};
}

$http.post(getRestApiBase()+"/interpreter/setting", newSetting).
$http.post(getRestApiBase()+'/interpreter/setting', newSetting).
success(function(data, status, headers, config) {
$scope.resetNewInterpreterSetting();
getInterpreterSettings();
$scope.showAddNewSetting = false;
}).
error(function(data, status, headers, config) {
console.log("Error %o %o", status, data.message);
console.log('Error %o %o', status, data.message);
});
};

Expand All @@ -182,22 +243,48 @@ angular.module('zeppelinWebApp').controller('InterpreterCtrl', function($scope,
group : undefined,
properties : {}
};
$scope.newInterpreterSetting.propertyValue = "";
$scope.newInterpreterSetting.propertyKey = "";
}

$scope.removeNewInterpreterProperty = function(key) {
delete $scope.newInterpreterSetting.properties[key];
}
$scope.newInterpreterSetting.propertyValue = '';
$scope.newInterpreterSetting.propertyKey = '';
};

$scope.addNewInterpreterProperty = function() {
if (!$scope.newInterpreterSetting.propertyKey || $scope.newInterpreterSetting.propertyKey === "") {
return;
$scope.removeInterpreterProperty = function(key, settingId) {
if (settingId === undefined) {
delete $scope.newInterpreterSetting.properties[key];
}
else {
for (var i=0; i < $scope.interpreterSettings.length; i++) {
var setting = $scope.interpreterSettings[i];
if (setting.id === settingId) {
delete $scope.interpreterSettings[i].properties[key]
break;
}
}
}
};

$scope.newInterpreterSetting.properties[$scope.newInterpreterSetting.propertyKey] = { value : $scope.newInterpreterSetting.propertyValue};
$scope.newInterpreterSetting.propertyValue = "";
$scope.newInterpreterSetting.propertyKey = "";
$scope.addNewInterpreterProperty = function(settingId) {
if(settingId === undefined) {
if (!$scope.newInterpreterSetting.propertyKey || $scope.newInterpreterSetting.propertyKey === '') {
return;
}
$scope.newInterpreterSetting.properties[$scope.newInterpreterSetting.propertyKey] = { value : $scope.newInterpreterSetting.propertyValue};
$scope.newInterpreterSetting.propertyValue = '';
$scope.newInterpreterSetting.propertyKey = '';
}
else {
for (var i=0; i < $scope.interpreterSettings.length; i++) {
var setting = $scope.interpreterSettings[i];
if (setting.id === settingId){
if (!setting.propertyKey || setting.propertyKey === '') {
return;
}
setting.properties[setting.propertyKey] = { value : setting.propertyValue };
setting.propertyValue = '';
setting.propertyKey = '';
break;
}
}
}
};

var init = function() {
Expand Down
10 changes: 9 additions & 1 deletion zeppelin-web/app/styles/interpreter.css
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
font-family: 'Roboto', sans-serif;
}

.interpreterHead textarea {
.interpreterHead textarea, .interpreter textarea {
width: 100%;
display: block;
height: 20px;
Expand Down Expand Up @@ -51,7 +51,15 @@
overflow-y: auto;
}

.interpreter table tr {
height : 45px;
}

.interpreterSettingAdd {
margin : 5px 5px 5px 5px;
padding : 10px 10px 10px 10px;
}

.editable-wrap {
width : 100%;
}
Loading