• Spark动态加载外部资源文件


    之前做一个关于Spark的项目时,因项目中需要读取某个静态资源文件,然后在本地IDEA测试一切皆正常,但是传到服务器上时,一直显示找不到该静态资源文件,后尝试了两三种方法解决问题。

    本地测试时,通过

    val is: InputStream = this.getClass.getResourceAsStream(“./xxx.sql”)
    

    来获取的静态资源文件,传至服务器后,找不到该静态资源文件。

    遂尝试将文件传至HDFS,然后通过读取hdfs的文件来获取静态资源文件。

    val gs = sc.textFile("hdfs://master:9000/user/resources/xxx.txt").first()
    

    下部分原文作者:大葱拌豆腐
    原文地址:spark-submit --files 动态加载外部资源文件


    1、spark-submit --files 动态加载外部资源文件

    spark时,有些时候需要加载资源文件,需要在driver或者worker端访问。在client模式下可以使用IO流直接读取,但是在cluster模式下却不能直接读取,需要如下代码:

    val is: InputStream = this.getClass.getResourceAsStream(“./xxx.sql”)
    val bufferSource = Source.fromInputStream(is)
    

    这是直接读取classPath路径下的文件,但是cluster模式下,driver有可能不再程序提交的客户端上,以上代码会发生空指针异常。这是,就需要通过–files把外部资源文件加载到classpath路径下。正常情况加载—files filename1,filename2…,当知道外部源文件都是有哪些时,直接列举出来就可以。但是在某些情况下,开发者开发的是一个通用工具,不知到所要加载的是一个什么文件。这时就需要动态加载,我曾尝试过使用–files …/xxx/*.sql,这个可以动态加载指定目录下数据。但是后来发现,这样加载只能加载一个文件,文件夹中超过多余一个文件就会报错。试了很多种方式也没有测试成功。最后通过shell脚本列举文件夹中的文件拼装成字符串,才算完成。

    程序打包目录如下:
    在这里插入图片描述
    代码实现如下:

    ##########################################################################################
    ####由于spark2_submit --files /../*.sql 不能加载多个文件所以只能拼装script路径下的文件####
    ##########################################################################################
    ###获取当前项目绝对路径###
    #project_home=$(dirname $(readlink -f "$0"))"/.."
    project_home="$(readlink -f $(cd "`dirname "$0"`"/..; pwd))"
    ###获取script绝对路径###
    script_path=${project_home}"/script/"
    ###获取项目中script目录下所有的脚本文件
    files=$(ls $script_path);
    files=${files// / };
    file_arr=($files);
    files_str=""
    for ele in ${file_arr[*]}
    do
      file_str=${file_str}${script_path}${ele},
    done
    len=`expr ${#file_str} - 1`
    file_str=`expr substr "$file_str" 1 $len`
    echo $file_str
    
    /usr/bin/spark2-submit  --executor-memory 15G   
            --master yarn    
            --queue dataengine 
            --files $project_home/script/* 
            --executor-cores 5      
            --driver-cores 3  
            --name AutoScript  
            --deploy-mode cluster   
            --class xx.xx.xxx       
            --driver-memory 10G      
            --conf "spark.dynamicAllocation.executorIdleTimeout=300"   
            --conf "spark.shuffle.file.buffer=16k"  
            --conf "spark.yarn.appMasterEnv.JAVA_HOME=/opt/jdk1.8.0_45"     
            --conf "spark.dynamicAllocation.minExecutors=11" 
            --conf "spark.dynamicAllocation.maxExecutors=11" 
            --conf "spark.speculation.quantile=0.85"        
            --conf "spark.executorEnv.JAVA_HOME=/opt/jdk1.8.0_45"   
            --conf "spark.executor.extraJavaOptions=-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintTenuringDistribution -XX:+UseG1GC "     
            --conf "spark.executor.extraJavaOptions=-XX:+UseG1GC "     
            --conf "spark.driver.extraClassPath=/home/sunkl/hive-exec-1.1.0-cdh5.7.6.jar" 
            --conf "spark.speculation=true" 
            --conf "spark.rpc.askTimeout=400" 
            --conf "spark.shuffle.service.enabled=true"     
            $project_home/lib/******.jar
    
  • 相关阅读:
    深入理解flex布局的flexgrow、flexshrink、flexbasis
    443端口
    C# 元组和弃元的用法
    腾讯三面:进程写文件过程中,进程崩溃了,文件数据会丢吗?
    60 个神级 VS Code 插件!!
    面试官:HashSet 的实现原理是怎样的?底层是什么数据结构?被问到了。。
    微信为什么使用 SQLite 保存聊天记录?(来长长见识了!)
    Nacos 2.1.1 正式发布,真心强!
    为何 JetBrains 公司做 IDE 就可以养活自己,而国内公司却很难做到?
    阿里一面:Spring Bean 默认是单例的,高并发情况下,如何保证并发安全?
  • 原文地址:https://www.cnblogs.com/aixing/p/13327303.html
Copyright © 2020-2023  润新知