Nice job, happy to see you here with the presto interperter. You should try posting to dev alias and not user Eran
On יום ד׳, 22 באפר 2015, 14:28 Daniel Haviv <[email protected]> wrote: > Hi, > I wrote a simple Interpreter, basically just changing Hive's to Presto but > it doesn't get loaded for some reason on startup. > I can see it's getting picked up on the log: > zeppelin-root-hdname.todacell.com.log: INFO [2015-04-22 11:16:04,272] > ({main} InterpreterFactory.java[init]:112) - Reading > /tmp/zeppelin/incubator-zeppelin-master/interpreter/presto > > so I'm guessing it's something with my code (Can be seen in a readable > version here http://pastebin.com/1VqCMEgS) : > package org.apache.zeppelin.presto; > > import java.sql.*; > import java.util.List; > import java.util.Properties; > > import org.apache.zeppelin.interpreter.*; > import org.apache.commons.lang.StringUtils; > import org.slf4j.Logger; > import org.slf4j.LoggerFactory; > > import org.apache.zeppelin.interpreter.InterpreterResult.Code; > import org.apache.zeppelin.scheduler.Scheduler; > import org.apache.zeppelin.scheduler.SchedulerFactory; > > /** > * Presto interpreter for Zeppelin. > */ > public class PrestoInterpreter extends Interpreter { > Logger logger = LoggerFactory.getLogger(PrestoInterpreter.class); > int commandTimeOut = 600000; > > static final String PRESTOSERVER_URL = "presto.url"; > static final String PRESTOSERVER_USER = "presto.user"; > static final String PRESTOSERVER_PASSWORD = "presto.password"; > > static { > Interpreter.register( > "presto", > "presto", > PrestoInterpreter.class.getName(), > new InterpreterPropertyBuilder() > .add(PRESTOSERVER_URL, "jdbc:presto://localhost:8089", "The URL > for Presto") > .add(PRESTOSERVER_USER, "Presto", "The Presto user") > .add(PRESTOSERVER_PASSWORD, "", "The password for the Presto > user").build()); > } > > public PrestoInterpreter(Properties property) { > super(property); > } > > Connection jdbcConnection; > Exception exceptionOnConnect; > > //Test only method > public Connection getJdbcConnection() > throws SQLException { > String url = getProperty(PRESTOSERVER_URL); > String user = getProperty(PRESTOSERVER_USER); > String password = getProperty(PRESTOSERVER_PASSWORD); > > return DriverManager.getConnection(url, user, password); > } > > @Override > public void open() { > logger.info("Jdbc open connection called!"); > try { > String driverName = "org.apache.Presto.jdbc.PrestoDriver"; > Class.forName(driverName); > } catch (ClassNotFoundException e) { > logger.error("Can not open connection", e); > exceptionOnConnect = e; > return; > } > try { > jdbcConnection = getJdbcConnection(); > exceptionOnConnect = null; > logger.info("Successfully created Jdbc connection"); > } > catch (SQLException e) { > logger.error("Cannot open connection", e); > exceptionOnConnect = e; > } > } > > @Override > public void close() { > try { > if (jdbcConnection != null) { > jdbcConnection.close(); > } > } > catch (SQLException e) { > logger.error("Cannot close connection", e); > } > finally { > jdbcConnection = null; > exceptionOnConnect = null; > } > } > > Statement currentStatement; > private InterpreterResult executeSql(String sql) { > try { > if (exceptionOnConnect != null) { > return new InterpreterResult(Code.ERROR, > exceptionOnConnect.getMessage()); > } > currentStatement = jdbcConnection.createStatement(); > StringBuilder msg = null; > if (StringUtils.containsIgnoreCase(sql, "EXPLAIN ")) { > //return the explain as text, make this visual explain later > msg = new StringBuilder(); > } > else { > msg = new StringBuilder("%table "); > } > ResultSet res = currentStatement.executeQuery(sql); > try { > ResultSetMetaData md = res.getMetaData(); > for (int i = 1; i < md.getColumnCount() + 1; i++) { > if (i == 1) { > msg.append(md.getColumnName(i)); > } else { > msg.append("\t" + md.getColumnName(i)); > } > } > msg.append("\n"); > while (res.next()) { > for (int i = 1; i < md.getColumnCount() + 1; i++) { > msg.append(res.getString(i) + "\t"); > } > msg.append("\n"); > } > } > finally { > try { > res.close(); > currentStatement.close(); > } > finally { > currentStatement = null; > } > } > > InterpreterResult rett = new InterpreterResult(Code.SUCCESS, > msg.toString()); > return rett; > } > catch (SQLException ex) { > logger.error("Can not run " + sql, ex); > return new InterpreterResult(Code.ERROR, ex.getMessage()); > } > } > > @Override > public InterpreterResult interpret(String cmd, InterpreterContext > contextInterpreter) { > logger.info("Run SQL command '" + cmd + "'"); > return executeSql(cmd); > } > > @Override > public void cancel(InterpreterContext context) { > if (currentStatement != null) { > try { > currentStatement.cancel(); > } > catch (SQLException ex) { > } > finally { > currentStatement = null; > } > } > } > > @Override > public FormType getFormType() { > return FormType.SIMPLE; > } > > @Override > public int getProgress(InterpreterContext context) { > return 0; > } > > @Override > public Scheduler getScheduler() { > return SchedulerFactory.singleton().createOrGetFIFOScheduler( > PrestoInterpreter.class.getName() + this.hashCode()); > } > > @Override > public List<String> completion(String buf, int cursor) { > return null; > } > > } > > Thanks, > Daniel >
