shell script mystery

User avatar
Сабина
Уже с Приветом
Posts: 19045
Joined: 11 Jan 2012 09:25
Location: CA

shell script mystery

Post by Сабина »

Ниче не пойму :)

Делаю вот такое дело в скрипте

Code: Select all

declare SPARK_SUBMIT_COMMAND="spark2-submit --class ${CLASS} ${SPARK_SUBMIT_COMMAND_OPTIONS} ${JAR_FILENAME}  ${KUDU_MASTERS} ${KAFKA_BROKERS} ${SCHEMA_URL}"

echo ' Running command ********* ' ${SPARK_SUBMIT_COMMAND}

${SPARK_SUBMIT_COMMAND}

падает с ошибкой class not found

потом беру и copy/paste того что распечаатно после ' Running command ********* ' в командную строку и все прекрасненько запускается :shock:

уже просмотрела весь стринг на hidden characters и все такое - ничегошеньки !

Куда бежать? Что еще проверить ?
https://www.youtube.com/watch?v=wOwblaKmyVw
User avatar
Ion Tichy
Уже с Приветом
Posts: 13460
Joined: 07 Dec 2004 04:00
Location: Москва->CO

Re: shell script mystery

Post by Ion Tichy »

Это весь скрипт целиком или там еще что-то спереди есть?
Как же это вы без гравицаппы пепелац выкатываете из гаража? Это непорядок...
helg
Уже с Приветом
Posts: 4827
Joined: 15 May 2001 09:01

Re: shell script mystery

Post by helg »

Если:

1. Скрипт пускается в дочернем shell (запуском ./script.sh), а не в текущем shell (запуском . script.sh)
2. Хоть одна из переменных окружения, используемых при вызове (как те, что в скрипте, так и используемые бинарником, например CLASSPATH), не объявлена как экспортированная в дочерний shell командой "export VAR1 VAR2 ...".

то примерно такие чудеса и будут происходить.
User avatar
Сабина
Уже с Приветом
Posts: 19045
Joined: 11 Jan 2012 09:25
Location: CA

Re: shell script mystery

Post by Сабина »

helg wrote: 03 Jan 2018 07:02 Если:

1. Скрипт пускается в дочернем shell (запуском ./script.sh), а не в текущем shell (запуском . script.sh)
2. Хоть одна из переменных окружения, используемых при вызове (как те, что в скрипте, так и используемые бинарником, например CLASSPATH), не объявлена как экспортированная в дочерний shell командой "export VAR1 VAR2 ...".

то примерно такие чудеса и будут происходить.
Похоже вы оба правы

Там все переменные экспортированы кроме одной ${CLASS}, которая передаетсч как аргументы в сам шелл скрипт

Code: Select all

declare CLASS=$1
А что исправить ? непонятно пока ....
https://www.youtube.com/watch?v=wOwblaKmyVw
helg
Уже с Приветом
Posts: 4827
Joined: 15 May 2001 09:01

Re: shell script mystery

Post by helg »

Сабина wrote: 03 Jan 2018 07:08

Code: Select all

declare CLASS=$1
А что исправить ? непонятно пока ....
Ну так написать строчку
export CLASS
сразу за упомянутым declare. Или если там bash, просто заменить "declare CLASS .." на "export CLASS .."
User avatar
Сабина
Уже с Приветом
Posts: 19045
Joined: 11 Jan 2012 09:25
Location: CA

Re: shell script mystery

Post by Сабина »

helg wrote: 03 Jan 2018 07:15
Сабина wrote: 03 Jan 2018 07:08

Code: Select all

declare CLASS=$1
А что исправить ? непонятно пока ....
Ну так написать строчку
export CLASS
сразу за упомянутым declare. Или если там bash, просто заменить "declare CLASS .." на "export CLASS .."
Не помогает :(
Да, я забыла упомянуть что такая фигня только если я scp оба - jar file and shell script to remote server and run
Когда локально запускаю - все работает

Вот весь скрипт если что

Code: Select all

export SPARK_CONF_DIR=conf
export SPARK_LOG_DIR=var/log/spark
export JAR_FILENAME=.......
export KUDU_MASTERS=.....
export KAFKA_BROKERS=.....
export SCHEMA_URL=.....

if [[ $# -eq 0 ]] ; then
    echo 'Usage: ./runProducerDev.sh <CLASS> <YARN_DEBUG>'
    exit 0
fi

# --- Checking parameters
export CLASS=$1
export YARN_DEBUG=$2
declare SPARK_CONF_FILE=${SPARK_CONF_DIR}\spark.conf

# --- Submit Spark job to Yarn

# To run фы single yarn-client use true, in cluster mode set it to false
if [ "${YARN_DEBUG}" == "true" ]; then
    SPARK_SUBMIT_COMMAND_OPTIONS="--master yarn-client "
else
    SPARK_SUBMIT_COMMAND_OPTIONS="--master yarn --deploy-mode cluster "
fi

declare SPARK_SUBMIT_COMMAND="spark2-submit --class ${CLASS} ${SPARK_SUBMIT_COMMAND_OPTIONS} ${JAR_FILENAME}  ${KUDU_MASTERS} ${KAFKA_BROKERS} ${SCHEMA_URL}"

echo ' Running command ********* ' ${SPARK_SUBMIT_COMMAND}

${SPARK_SUBMIT_COMMAND}

retval=$?
if [ $retval -ne 0 ]; then
    echo "[ERROR] $1  (err=$?)."
fi
https://www.youtube.com/watch?v=wOwblaKmyVw
helg
Уже с Приветом
Posts: 4827
Joined: 15 May 2001 09:01

Re: shell script mystery

Post by helg »

Насколько я понял, все переменные, определённые в скрипте, передаются spark2-submit через командную строку, а не через окружение. В таком случае экспортировать их не обязательно. Но может что-то таки передаётся через окружение. Это можно поймать, нарисовав скрипт из одной строки, значения ${SPARK_SUBMIT_COMMAND}. Вы сказали, что copypaste этого в командную строку работает. Если copypaste его же в скрипт и запуск скрипта ./script.sh не работает, значит какая-то требуемая переменная окружения таки непроэкспортирована.

Кстати, в Unix пути разделяются косой чертой - '/'. Поправьте ..DIR}\spark.conf
User avatar
Сабина
Уже с Приветом
Posts: 19045
Joined: 11 Jan 2012 09:25
Location: CA

Re: shell script mystery

Post by Сабина »

helg wrote: 03 Jan 2018 07:50 Насколько я понял, все переменные, определённые в скрипте, передаются spark2-submit через командную строку, а не через окружение. В таком случае экспортировать их не обязательно. Но может что-то таки передаётся через окружение. Это можно поймать, нарисовав скрипт из одной строки, значения ${SPARK_SUBMIT_COMMAND}. Вы сказали, что copypaste этого в командную строку работает. Если copypaste его же в скрипт и запуск скрипта ./script.sh не работает, значит какая-то требуемая переменная окружения таки непроэкспортирована.

Кстати, в Unix пути разделяются косой чертой - '/'. Поправьте ..DIR}\spark.conf
export - это потому что скрипт по хорошему будет из Дженкинса запускаться, а там один из вариантов внешней конфигурации через env
Спасибо за идеи, теперь хоть понятно примерно куда копать :great:
https://www.youtube.com/watch?v=wOwblaKmyVw
mskmel
Уже с Приветом
Posts: 947
Joined: 24 Sep 2013 05:58
Location: US\GA

Re: shell script mystery

Post by mskmel »

Сабина wrote: 03 Jan 2018 07:20 Да, я забыла упомянуть что такая фигня только если я scp оба - jar file and shell script to remote server and run
Когда локально запускаю - все работает

Вот весь скрипт если что
Увы, это не скрипт, а текстовый файл с неверными правами. Скрипт в самой своей первой строчке говорит кем себя выполнять.

Code: Select all

#!/bin/sh

Code: Select all

#!/bin/bash
И не верьте что sh и bash и ksh одинаковые, они разные.
Palych
Уже с Приветом
Posts: 13989
Joined: 16 Jan 2001 10:01

Re: shell script mystery

Post by Palych »

Радом с
echo ' Running command ********* '

Поставить
pwd
env
Palych
Уже с Приветом
Posts: 13989
Joined: 16 Jan 2001 10:01

Re: shell script mystery

Post by Palych »

Сабина wrote: 03 Jan 2018 07:20
Да, я забыла упомянуть что такая фигня только если я scp оба - jar file and shell script to remote server and run
Когда локально запускаю - все работает
То есть - на одной машине работает, а на другой - нет?
helg
Уже с Приветом
Posts: 4827
Joined: 15 May 2001 09:01

Re: shell script mystery

Post by helg »

Если оно до сих пор непонятно, наберите перед запуском скрипта команду:
set -a
Это проэкспортирует все переменные окружения, определённые на момент запуска команды. Наберите предварительно "help set", дабы убедиться, что ключик -a делает что требуется.
Если после этого всё запустится, надо искать неэкспортированную переменную.
User avatar
Сабина
Уже с Приветом
Posts: 19045
Joined: 11 Jan 2012 09:25
Location: CA

Re: shell script mystery

Post by Сабина »

Palych wrote: 03 Jan 2018 23:27
Сабина wrote: 03 Jan 2018 07:20
Да, я забыла упомянуть что такая фигня только если я scp оба - jar file and shell script to remote server and run
Когда локально запускаю - все работает
То есть - на одной машине работает, а на другой - нет?
Скрипт as-is запускается на маке локально.
На edge ноде хадуп кластера не запускается as-is. Но если распечатанную команду copy paste в command prompt, то и на edge node в кластере все запускается.
Last edited by Сабина on 04 Jan 2018 03:42, edited 1 time in total.
https://www.youtube.com/watch?v=wOwblaKmyVw
User avatar
Сабина
Уже с Приветом
Posts: 19045
Joined: 11 Jan 2012 09:25
Location: CA

Re: shell script mystery

Post by Сабина »

mskmel wrote: 03 Jan 2018 21:37
Сабина wrote: 03 Jan 2018 07:20 Да, я забыла упомянуть что такая фигня только если я scp оба - jar file and shell script to remote server and run
Когда локально запускаю - все работает

Вот весь скрипт если что
Увы, это не скрипт, а текстовый файл с неверными правами. Скрипт в самой своей первой строчке говорит кем себя выполнять.

Code: Select all

#!/bin/sh

Code: Select all

#!/bin/bash
И не верьте что sh и bash и ksh одинаковые, они разные.
Обижаете :)
Текстовый файл нигде бы не запускался, просто не скопипейстила эту то часть сюда вот и все
https://www.youtube.com/watch?v=wOwblaKmyVw
User avatar
Сабина
Уже с Приветом
Posts: 19045
Joined: 11 Jan 2012 09:25
Location: CA

Re: shell script mystery

Post by Сабина »

Palych wrote: 03 Jan 2018 23:25 Радом с
echo ' Running command ********* '

Поставить
pwd
env
pwd показывает в текущую директорию
env печатает все нужные переменные окружения

дала chmod ugo+rwx файлу ради прикола

нет все то же самое. Экспешен падает из spark submit, что-то не тое, может spark пытается читать доп аргументы из какого нибульь spark-defaults.conf ? Или джар сам почему то не может прочесть? Jar там же, пермишены я ему тоже всевозможные дала для теста - проблема не исчезла. Может classpath не включает . когда из скрипта запускаешь ?
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream

at org.apache.spark.deploy.SparkSubmitArguments.handleUnknown(SparkSubmitArguments.scala:460)

at org.apache.spark.launcher.SparkSubmitOptionParser.parse(SparkSubmitOptionParser.java:178)

at org.apache.spark.deploy.SparkSubmitArguments.<init>(SparkSubmitArguments.scala:98)

at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:119)

at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.fs.FSDataInputStream

at java.net.URLClassLoader.findClass(URLClassLoader.java:381)

at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)

at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
https://www.youtube.com/watch?v=wOwblaKmyVw
helg
Уже с Приветом
Posts: 4827
Joined: 15 May 2001 09:01

Re: shell script mystery

Post by helg »

Сабина wrote: 03 Jan 2018 07:20 declare SPARK_CONF_FILE=${SPARK_CONF_DIR}\spark.conf
1. Значение SPARK_CONF_FILE, по-видимому, таки используется системой.
2. Значение SPARK_CONF_FILE не передаётся параметром командной строки. Стало быть, оно должно передаваться через переменную окружения.
3. Переменная окружения SPARK_CONF_FILE не проэкспортирована. Стало быть, до дочернего процесса, где её значение, по-видимому, требуется, она не доходит.

В связи в этим, заменяем declare в вышеупомянутой строке на export. Заодно меняем \spark.conf на /spark.conf - и пробуем ещё раз.
Palych
Уже с Приветом
Posts: 13989
Joined: 16 Jan 2001 10:01

Re: shell script mystery

Post by Palych »

Сабина wrote: 04 Jan 2018 03:55
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream
Этот класс внутри ${JAR_FILENAME}?
User avatar
Сабина
Уже с Приветом
Posts: 19045
Joined: 11 Jan 2012 09:25
Location: CA

Re: shell script mystery

Post by Сабина »

Palych wrote: 04 Jan 2018 16:09
Сабина wrote: 04 Jan 2018 03:55
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream
Этот класс внутри ${JAR_FILENAME}?
да
https://www.youtube.com/watch?v=wOwblaKmyVw
Palych
Уже с Приветом
Posts: 13989
Joined: 16 Jan 2001 10:01

Re: shell script mystery

Post by Palych »

Сабина wrote: 05 Jan 2018 05:41
Palych wrote: 04 Jan 2018 16:09
Сабина wrote: 04 Jan 2018 03:55
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream
Этот класс внутри ${JAR_FILENAME}?
да
Плучается от джар не находит?
Судя по названию переменной - имя файла не включат полный путь.
А текущая директория разная...
User avatar
Сабина
Уже с Приветом
Posts: 19045
Joined: 11 Jan 2012 09:25
Location: CA

Re: shell script mystery

Post by Сабина »

Palych wrote: 05 Jan 2018 06:25
Сабина wrote: 05 Jan 2018 05:41
Palych wrote: 04 Jan 2018 16:09
Сабина wrote: 04 Jan 2018 03:55
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/fs/FSDataInputStream
Этот класс внутри ${JAR_FILENAME}?
да
Плучается от джар не находит?
Судя по названию переменной - имя файла не включат полный путь.
А текущая директория разная...
мимо, полный путь к джару уже пробовала. не помогает :(
https://www.youtube.com/watch?v=wOwblaKmyVw

Return to “Вопросы и новости IT”