Сбой Spark-Submit в кластерном режиме при передаче файлов с использованием --files - PullRequest
0 голосов
/ 01 марта 2019

У меня есть Java-искровой код, который читает определенные файлы свойств.Эти свойства передаются с spark-submit как:

spark-submit 
--master yarn \
--deploy-mode cluster \
--files /home/aiman/SalesforceConn.properties,/home/aiman/columnMapping.prop,/home/aiman/sourceTableColumns.prop \
--class com.sfdc.SaleforceReader \
--verbose \
--jars /home/ebdpbuss/aiman/Salesforce/ojdbc-7.jar /home/aiman/spark-salesforce-0.0.1-SNAPSHOT-jar-with-dependencies.jar SalesforceConn.properties columnMapping.prop sourceTableColumns.prop

Код, который я написал:

SparkSession spark = SparkSession.builder().master("yarn").config("spark.submit.deployMode","cluster").getOrCreate();
JavaSparkContext jsc = new JavaSparkContext(spark.sparkContext());
Configuration config = jsc.hadoopConfiguration();
FileSystem fs = FileSystem.get(config);

//args[] is the file names that is passed as arguments.
String connDetailsFile = args[0];
String mapFile = args[1];
String sourceColumnsFile = args[2];

String connFile = SparkFiles.get(connDetailsFile);
String mappingFile = SparkFiles.get(mapFile);
String srcColsFile = SparkFiles.get(sourceColumnsFile);

Properties prop = loadProperties(fs,connFile);
Properties mappings = loadProperties(fs,mappingFile);
Properties srcColProp = loadProperties(fs,srcColsFile);

Метод loadProperties(), который я использовал выше:

private static Properties loadProperties(FileSystem fs, String path)
{
    Properties prop = new Properties();
    FSDataInputStream is = null;
    try{
        is = fs.open(new Path(path));
        prop.load(is);
    } catch(Exception e){
        e.printStackTrace();
        System.exit(1);
    }

    return prop;        
}

И это дает мне исключение:

Exception in thread "main" org.apache.spark.SparkException: Application application_1550650871366_125913 finished with failed status
        at org.apache.spark.deploy.yarn.Client.run(Client.scala:1187)
        at org.apache.spark.deploy.yarn.Client$.main(Client.scala:1233)
        at org.apache.spark.deploy.yarn.Client.main(Client.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:782)
        at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:180)
        at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:205)
        at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:119)
        at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
19/03/01 14:34:00 INFO ShutdownHookManager: Shutdown hook called

1 Ответ

0 голосов
/ 02 марта 2019

Когда вы передаете путь к файлам, используя --files, они хранятся в локальном каталоге (временном) для каждого исполнителя.Поэтому, если имена файлов не меняются, вы можете просто использовать их следующим образом вместо полного пути, указанного в аргументах.

String connDetailsFile = "SalesforceConn.properties";
String mapFile = "columnMapping.prop";
String sourceColumnsFile = "sourceTableColumns.prop";

Если имена файлов меняются каждый раз, вам нужно удалитьПуть к файлу и просто используйте имя файла.Это потому, что spark не распознает это как путь, а считает всю строку именем файла.Например, / home / aiman / SalesforceConn.properties будет считаться именем файла, а искра выдаст исключение, сказав, что не может найти файл с именем / home / aiman / SalesforceConn.properties

Таким образом, ваш код должен выглядеть примерно так.

String connDetailsFile = args[0].split("/").last
String mapFile = args[1].split("/").last
String sourceColumnsFile = args[2].split("/").last
...