Zeppelin adalah buku catatan interaktif yang disukai para insinyur data. Dia tahu cara bekerja dengan Spark dan sangat bagus untuk analisis data interaktif.
Proyek ini baru-baru ini mencapai versi 0.9.0-preview2 dan secara aktif berkembang, namun demikian, banyak hal yang masih belum diimplementasikan dan menunggu di sayap.
Salah satunya adalah API untuk mendapatkan lebih banyak informasi tentang apa yang terjadi di dalam notebook. Di satu sisi, ada sebuah API yang benar-benar memecahkan masalah manajemen laptop-tingkat tinggi. Tetapi jika Anda menginginkan sesuatu yang tidak sepele, itu berita buruk.

Masalah ini dihadapi oleh pengembang Big Data Tools , sebuah plugin untuk IntelliJ IDEA yang menyediakan integrasi dengan Spark, Hadoop dan memungkinkan untuk mengedit dan menjalankan notebook di Zeppelin. Kemampuan untuk membuat dan menghapus laptop tidak cukup untuk berfungsi sepenuhnya di IDE. Anda perlu membongkar seluruh gerobak informasi yang memungkinkan Anda melakukan hal-hal seperti pelengkapan otomatis pintar.
, API Zeppelin. , GitHub. , . -, , Zeppelin. -, - โ , - . , API .
ZTools โ , Zeppelin, API. "" GitHub Apache License 2.0. 90% Scala, โ Java.
( , Scala REPL, Zeppelin).
, ZTools, Variables View Big Data Tools. IntelliJ Ultimate Edition, , , . ZTools , , .
Big Data Tools, ZTools. :

, ? ?
, , , - .
. - sql.DataFrame, !

.
ZTools. , .
:
, Zeppelin .
. ( GitHub), ( ).
: , , . , . , , Zeppelin.
, mitmproxy Wireshark. , โ .
- Zeppelin โ "Spark Basic Features".
mitmproxy , Zeppelin API /api/notebook ( ).

, . , ? , WebSocket?
Wireshark :

, , , JSON . .
- . Big Data Tools, IntelliJ IDEA, :

, .
%spark
// It is generated code for integration with Big Data Tools plugin
// Please DO NOT edit it.
import org.jetbrains.ztools.spark.Tools
Tools.init($intp, 3, true)
println(Tools.getEnv.toJsonObject.toString)
println("----")
println(Tools.getCatalogProvider("spark").toJson)"
, . ZTools, , GitHub.
.
, : , โ .
, .
- , Zeppelin ZTools: , ZTools, ( ). Big Data Tools.
- Tools. ZTools.
: ZTools
ZTools GitHub
: "scala-repl" "spark".

:
%spark
// It is generated code for integration with Big Data Tools plugin
// Please DO NOT edit it.
import org.jetbrains.ztools.spark.Tools
Tools.init($intp, 3, true)
println(Tools.getEnv.toJsonObject.toString)
println("----")
println(Tools.getCatalogProvider("spark").toJson)"
, . Catalog.listTables(), Catalog.listTables(), JSON .
, . Tools, VariablesView, . .
, , :
@Test
def testSimpleVarsAndCollections(): Unit = {
withRepl { intp =>
intp.eval("val x = 1")
val view = intp.getVariablesView()
assertNotNull(view)
var json = view.toJsonObject
println(json.toString(2))
val x = json.getJSONObject("x")
assertEquals(2, x.keySet.size)
assertEquals(1, x.getInt("value"))
assertEquals("Int", x.getString("type"))
assertEquals(1, json.keySet.size)
}
Scala .
, ( ), Scala, โ scala.tools.nsc.interpreter.
def withRepl[T](body: Repl => T): T = {
// ...
val iLoop = new ILoop(None, new JPrintWriter(Console.out, true))
iLoop.intp = new IMain(iLoop.settings)
// ...
}
ILoop โ , IMain โ . IMain interpret(code). .
:
trait VariablesView {
def toJson: String
def toJsonObject: JSONObject
def toJsonObject(path: String, deep: Int): JSONObject
def variables(): List[String]
def valueOfTerm(id: String): Option[Any]
def registerTypeHandler(handler: TypeHandler): VariablesView
def typeOfExpression(id: String): String
}
. . Scala, iMain: \
override def variables(): List[String] =
iMain.definedSymbolList.filter { x => x.isGetter }.map(_.name.toString).distinct
JSON, " " โ . toJsonObject() , .
-, โ 100 โ 400 . , ( Big Data Tools ) . , , - .
ZTools Tools, . $intp, sc, spark, sqlContext, z engine. , .
- ZTools Zeppelin API;
- , ;
- Zeppelin, Scala โ . REPL ZTools. ZTools, - ;
- , Tools, : 400 , 100 JSON.
:
, ZTools IntelliJ IDEA . GitHub.
, Java, JavaScript (, TypeScript) Node.js. HTTP Axios โ .
-, - , โSpark Basic Featuresโ .
const notes = await <em>axios</em>.get(NOTE_LIST_URL);
let noteId: string = null;
for (let item: Object of notes.data.body) {
if ( item.path.indexOf('Spark Basic Features') >= 0 ) {
noteId = item.id;
break;
}
}
, :
const PAR_TEXT = `%spark
import org.jetbrains.ztools.spark.Tools
Tools.init($intp, 3, true)
println(Tools.getEnv.toJsonObject.toString)
println("----")
println(Tools.getCatalogProvider("spark").toJson)`;
:
const CREATE_PAR_URL = `${Z_URL}/api/notebook/${noteId}/paragraph`;
const par: Object = await axios.post(CREATE_PAR_URL, {
title: 'temp',
text: PAR_TEXT,
index: 0
});
:
const RUN_PAR_URL = `${Z_URL}/api/notebook/run/${noteId}/${parId}`;
await axios.post(RUN_PAR_URL);
:
const INFO_PAR_URL = `${Z_URL}/api/notebook/${noteId}/paragraph/${parId}`;
const { data } = await axios.get(INFO_PAR_URL);
:
const DEL_PAR_URL = `${Z_URL}/api/notebook/${noteId}/paragraph/${parId}`;
await axios.delete(DEL_PAR_URL);
JSON:
const [varInfoData, dbInfoData] = (data.body.results.msg[0].data)
.replace('\nimport org.jetbrains.ztools.spark.Tools\n', '')
.split('\n----\n');
const varInfo = JSON.parse(varInfoData);
const dbInfo = JSON.parse(dbInfoData);
:
for (const [key, {type}] of Object.entries(varInfo)) {
console.log(`${key} : ${type}`);
}
:
for (const [key, database] of Object.entries(dbInfo.databases)) {
console.log(`Database: ${database.name} (${database.description})`);
for (const table of database.tables) {
const columnsJoined = table.columns.map(val => `${val.name}/${val.dataType}`).join(', ');
Logger.direct(`${table.name} : [${columnsJoined}]`);
}
}
, , .
:
Zeppelin โ Zeppelin, ZTools.
, , , . . .
, ZTools , , Maven JAR-.
- : https://repo.labs.intellij.net/big-data-ide
- : org.jetbrains.ztools:ztools-spark-all:0.0.13
- JAR-: https://dl.bintray.com/jetbrains/zeppelin-dependencies/org/jetbrains/ztools/ztools-spark-all/0.0.13/ztools-spark-all-0.0.13.jar
ZTools , Gradle, JAR- Apache License 2.0.
Big Data Tools ZTools Zeppelin. โ , .
- ZTools Zeppelin API;
- , โ , Apache License 2.0;
- โ , ;
- . " " Big Data Tools.