Spark modus
SparkDataset
SparkDataset
datasett brukes til å representere statistiske tabeller i en Java-applikasjon som bruker Trevas i Spark-modus.
Importer Spark-modul fra Trevas
<dependency>
<groupId>fr.insee.trevas</groupId>
<artifactId>vtl-spark</artifactId>
<version>1.7.0</version>
</dependency>
Session Spark
For å kjøre VTL via Trevas i Spark-modus, må du instansiere en Spark-økt.
Økten kan være :
- lokal (kjører på Java-serveren)
- statisk (kjører på en Spark-forekomst som tidligere er installert på en server)
- dynamisk (kjører dynamisk i en Kubernetes-klynge)
SparkSession spark = SparkSession.builder().master("local").getOrCreate();
Eksempel
ScriptEngine engine = new ScriptEngineManager().getEngineByName("vtl");
Bindings bindings = new SimpleBindings();
SparkDataset dataset = new SparkDataset(spark.read().parquet("folder_path"));
bindings.put("myDataset", dataset);
engine.getContext().setBindings(bindings, ScriptContext.ENGINE_SCOPE);
engine.put("$vtl.engine.processing_engine_names", "spark");
engine.put("$vtl.spark.session", spark);
String script = "res := myDataset[filter var3 > 6];";
try {
engine.eval(script);
} catch (ScriptException e) {
e.printStackTrace();
}
Bindings outputBindings = engine.getContext().getBindings(ScriptContext.ENGINE_SCOPE);
SparkDataset result = (SparkDataset) outputBindings.get("res");
// Ensure direct resolution because of spark lazy mechanism (performance warning!)
InMemoryDataset imResult = new InMemoryDataset(
result.getDataPoints(),
result.getDataStructure()
);
Distribuert utførelse
Enten i statisk eller dynamisk modus, den distribuerte utførelse av prosessering krever at eksekutørene instansiert av masteren er i stand til å løse VTL-behandlingen.
Det er da nødvendig å gi Trevas-krukkene til utførerne via spark.jars
alternativet til SparkConf
objektet :
SparkSession.Builder sparkBuilder = SparkSession.builder()
SparkConf conf = new SparkConf();
conf.set("spark.jars", String.join(",",
"/vtl-spark.jar",
"/vtl-model.jar",
"/vtl-parser.jar",
"/vtl-engine.jar",
));
sparkBuilder.config(conf);
...
SparkSession spark = sparkBuilder.getOrCreate();
Kjører i en Kubernetes klynge
Mange alternativer er beskrevet i den offisielle dokumentasjonen
Blant disse er ett alternativ spesielt viktig: Docker-bildet som vil tillate eksekutører å løse VTL-behandling.
Et tilpasset bilde er tilgjengelig her.
SparkSession.Builder sparkBuilder = SparkSession.builder()
SparkConf conf = new SparkConf();
conf.set("spark.kubernetes.container.image", "inseefrlab/spark-hadoop:trevas-0.4.7-spark-3.2.1-hadoop-3.3.1-postgresql-42.3.3-postgis-2021.1.0");
conf.set("spark.kubernetes.container.pullPolicy", "IfNotPresent");
sparkBuilder.config(conf);
sparkBuilder.master("k8s://...")
...
SparkSession spark = sparkBuilder.getOrCreate();