Я работал с автономным сервером Spark с Jobserver. По x причинам мне пришлось перейти на Ambari Cluster, а затем, поскольку у меня уже есть Livy, я думаю, что лучше использовать его вместо Jobserver.
Теперь я заблудился, пытаясь перенести мой настоящий код Java Jobserver в Livy.
Я прочитал документацию Livy, и вот что я нашел:
В Livy вы можете выполнять пакеты, которые как-то похожи на режим Ad-Hoc в Jobserver. И есть Сессии, где один Spark Context на сеанс может использоваться для выполнения операторов. Я прав?
- Есть ли способ выполнить пакет или инструкцию способом, который может быть синхронным, как в Jobserver, поэтому с помощью одного запроса вы получите результат? На самом деле я вижу только асинхронный режим.
- В Jobserver вы можете ссылаться на класс java, в котором реализованы ваши функциональные возможности, и для этого нужно только реализовать класс
JSqlJob<String>
, тогда сервер заданий узнает, что должен выполнить метод run()
этого класса. Но в Ливии я попытался выполнить вычисление Пи, но это не удалось.
Я использую следующий локон: curl -X POST -d '{ "file": "hdfs://a1:8020/user/value_iq/Livy_Pi_Example-1.0-SNAPSHOT-dep.jar", "className": "value_iq.viq.PiJob","proxyUser": "hdfs", "name": "Livy Pi Example", "conf": {"executorCores":1, "executorMemory":"2G", "driverCores":1, "driverMemory":"512m", "queue":"uno"}, "args" : ["100"] }' -H "Content-Type: application/json" -H "X-Requested-By: admin" http://ambari.value-iq.com:8999/batches
java.lang.NoSuchMethodException: value_iq.viq.PiJob.main([Ljava.lang.String;)
at java.lang.Class.getMethod(Class.java:1786)
at org.apache.spark.deploy.yarn.ApplicationMaster.startUserApplication(ApplicationMaster.scala:641)
at org.apache.spark.deploy.yarn.ApplicationMaster.runDriver(ApplicationMaster.scala:416)
at org.apache.spark.deploy.yarn.ApplicationMaster.run(ApplicationMaster.scala:282)
at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$main$1.apply$mcV$sp(ApplicationMaster.scala:768)
at org.apache.spark.deploy.SparkHadoopUtil$$anon$2.run(SparkHadoopUtil.scala:67)
at org.apache.spark.deploy.SparkHadoopUtil$$anon$2.run(SparkHadoopUtil.scala:66)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1869)
at org.apache.spark.deploy.SparkHadoopUtil.runAsSparkUser(SparkHadoopUtil.scala:66)
at org.apache.spark.deploy.yarn.ApplicationMaster$.main(ApplicationMaster.scala:766)
at org.apache.spark.deploy.yarn.ApplicationMaster.main(ApplicationMaster.scala)
Что мне нужно реализовать в таком основном методе?
Это мой класс Java:
package value_iq.viq;
import java.util.*;
import org.apache.spark.api.java.function.*;
import org.apache.livy.*;
public class PiJob implements Job<Double>, Function<Integer, Integer>,
Function2<Integer, Integer, Integer> {
private final int samples;
public PiJob(int samples) {
this.samples = samples;
}
@Override
public Double call(JobContext ctx) throws Exception {
List<Integer> sampleList = new ArrayList<Integer>();
for (int i = 0; i < samples; i++) {
sampleList.add(i + 1);
}
Integer max = ctx.sqlctx().sql("select max(id) from livy_test").takeAsList(1).get(0).getInt(0) + 1;
ctx.sqlctx().sql("insert into livy_test values("+max+", now())");
return 4.0d * ctx.sc().parallelize(sampleList).map(this).reduce(this) / samples;
}
@Override
public Integer call(Integer v1) {
double x = Math.random();
double y = Math.random();
return (x*x + y*y < 1) ? 1 : 0;
}
@Override
public Integer call(Integer v1, Integer v2) {
return v1 + v2;
}
Я получил этот класс от https://livy.incubator.apache.org/docs/latest/programmatic-api.html и там написано: Чтобы отправить этот код с помощью Livy, создайте экземпляр LivyClient. Должен ли я создать другой файл JAR, чтобы загрузить файл с Pi Job ??? Разве я не могу сделать это, просто загрузив jar и указав класс java в curl, как я пытаюсь?