У меня есть кластер Hadoop в AWS с YARN, на который я подаю искровые приложения.Я работаю через REST-запросы, отправляя XML, как указано в этой документации: YARN REST API .Это прекрасно работает для обычного кластера.
В настоящее время я делаю POC для работы с кластером EMR вместо обычной, где я использую существующие команды REST и просто связываюсь с внутренней YARN EMR через SSH, как указано здесь: Веб-доступ к внутренним службам EMR .Он отлично работает для большинства команд REST, таких как POST http://<rm http address:port>/ws/v1/cluster/apps/new-application
, но когда я отправляю новое приложение, оно немедленно завершается сбоем и сообщает, что не может найти ApplicationMaster.
Тип журнала: stderr
Время загрузки журнала: Вс 3 февраля 17:18:35 +0000 2019
Длина журнала: 88
Error: Could not find or load main class org.apache.spark.deploy.yarn.ApplicationMaster
Я подозревал, что это как-то связано с classpath, и когдаЯ добавил к узлу приложения отправки REST флаг classpath с расположением EMR FS всех jar-файлов (/ usr / lib / spark / jars / *), он находит ApplicationMaster, но затем не может найти Jars в основных экземплярах, с этимжурнал странных ошибок:
Тип журнала: stderr
Время загрузки журнала: чт 31 января 15:11:21 +0000 2019
Длина журнала: 89
Error: Could not find or load main class .usr.lib.spark.jars.datanucleus-core-3.2.10.jar
Самым необычным является способ описания кувшина, который он не может найти, а не класса.После дальнейшего изучения я нашел причину: когда команда Java отправляется в экземпляр Core, он разрешает путь к классам в своих трех файлах: java -server -classpath /usr/lib/spark/jars/datanucleus-api-jdo-3.2.6.jar /usr/lib/spark/jars/datanucleus-core-3.2.10.jar /usr/lib/spark/jars/datanucleus-rdbms-3.2.9.jar ...
и поэтому пытается выполнить "/ usr / lib / spark / jars / datanucleus-core-3.2.10.jar ", как будто это работоспособный.Проблема заключается в том, что если я пытаюсь изменить путь к классу, чтобы он был более конкретным, или если я пытаюсь удалить его, приложение снова не может найти приложение ApplicationMaster.
REST-запрос, который я отправляю в YARN, выглядит так:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<application-submission-context>
<application-id>application_1549270910165_0001</application-id>
<application-name> .... some name .....</application-name>
<queue>default</queue>
<priority>0</priority>
<am-container-spec>
<local-resources>
<entry>
....... MANY MANY RESOURCES ......
</value>
</entry>
</local-resources>
<environment>
<entry>
<key>SPARK_YARN_STAGING_DIR</key>
<value>..... staging directory in our HDFS ..... </value>
</entry>
<entry>
<key>CLASSPATH</key>
<value>$PWD:$PWD/__spark_conf__:$PWD/__spark_libs__/*:/usr/lib/spark/jars/*:/usr/lib/spark/yarn/lib/*:%HADOOP_CONF_DIR%:%HAOOP_COMMON_HOME%/share/hadoop/common/*:%HADOOP_COMMON_HOME%/share/hadoop/common/lib/*:%HADOOP_HDFS_HOME%/share/hadoop/hdfs/*:%HADOOP_HDFS_HOME%/share/hadoop/hdfs/lib/*:%HADOOP_YARN_HOME%/share/hadoop/yarn/*:%HADOOP_YARN_HOME%/share/hadoop/yarn/lib/*:%HADOOP_MAPRED_HOME%/share/hadoop/mapreduce/*:%HADOOP_MAPRED_HOME%/share/hadoop/mapreduce/lib/*:$PWD/__spark_conf__/__hadoop_conf__</value>
</entry>
<entry>
<key>SPARK_USER</key>
<value>... user name ....</value>
</entry>
</environment>
<commands>
<command>command=$JAVA_HOME/bin/java -classpath '/usr/lib/spark/jars/*' -server -Xmx5120M -Djava.io.tmpdir=$PWD/tmp '-XX:hashCode=0' '-Dlog4j.configuration=log4j-client.cfg' '-Dhdp.version=2.8.4' -Dspark.yarn.app.container.log.dir=<LOG_DIR> org.apache.spark.deploy.yarn.ApplicationMaster ... some jar and arguments .... --properties-file $PWD/__spark_conf__/__spark_conf__.properties 1> <LOG_DIR>/stdout 2> <LOG_DIR>/stderr</command>
</commands>
</am-container-spec>
<unmanaged-AM>false</unmanaged-AM>
<max-app-attempts>1</max-app-attempts>
<resource>
<memory>5632</memory>
<vCores>1</vCores>
</resource>
<application-type>SPARK</application-type>
<keep-containers-across-application-attempts>false</keep-containers-across-application-attempts>
<application-tags>
<tag>.... product tag .....</tag>
</application-tags>
<log-aggregation-context/>
<attempt-failures-validity-interval>1</attempt-failures-validity-interval>
<reservation-id/>
</application-submission-context>
Буду признателен за любые выводы.