关于spark离线程序读写本地文件的问题

关于spark离线程序读写本地文件的问题

问题描述:

我目前在学着写spark离线程序,用Java写的
目前我要做的是:在java代码里读取服务器上的/root/config.properties配置文件,
然后我处理完之后会生成一个文件file.txt,我希望将这个file.txt也放到该服务器的特定目录下。
目前我读取配置文件的做法是:先将config.properties上传到hdfs,
然后java代码中写prop.load("hdfs:///root/config.properties");
这样是可以达到效果的,但事实上我不可能每次都手动将配置文件放一下hdfs。
生成的文件在哪目前我还没测试。。。
请大佬指点下这个需要怎么做。包括java代码里和sh脚本里。谢谢。
大佬给代码的时候请详细点,因为不会,能顺带加点注释就最好了。
我测试能用的话保证立马采纳。
环境是jdk1.8和spark2.2,linux系统

读取数据文件的接口不是有SparkContext的textFile么,读取本地文件只是需要指明file://即可(但是要保证所有节点本地上都有该文件,路径一致),
所以一般不会去读取本地的数据文件,而是读取hdfs文件。对于你说的是不是想要加载自己的配置文件,一种是直接打包到jar中去,一种是加载
本地配置文件的话,可以使用SparkContext的addFile接口,然后获取时使用SparkFiles.get()接口即可获取到

首先我来理解一下你的目的:
你现在是有一份properties格式的配置文件,在项目启动的时候你需要加载这份文件,当前你把这份配置文件放在了hdfs上。最终结果也是一个文件,你当前也存在hdfs上。
你的问题是properties文件放在哪里更为合适。
我推荐的做法:
1、像properties文件直接放在项目中,不要把配置文件放在其他地方,除非该文件有特殊需求(比如安全)或者框架需要或者动态配置
2、这样你可以在代码中直接访问到这个配置文件
2.1 如果你的项目是基于spring框架,你可以:

 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
        <list> 
            <value>classpath:system.properties</value> 
        </list> 
    </property> 
</bean>

2.2 如果只是一般工程,你可以:

 <dependency>
    <groupId>commons-configuration</groupId>
     <artifactId>commons-configuration</artifactId>
     <version>1.10</version>
</dependency>
 /**
 * 把配置文件读出来
 */
private static void readBaseDir() {
     String file = Resources.getResource("conf.properties").getFile();
     try {
         PropertiesConfiguration configuration = new PropertiesConfiguration(file);
         TEMP_FILE_DIR = configuration.getString("temp_file_dir");
     } catch (ConfigurationException e) {
         e.printStackTrace();
     }
 }

类似这种方式:
图片说明

可以同时提交作业的,没必要每次先手动放配置文件的。写好spark运行时的配置信息后,接着编写其他模块嘛,最后一同提交任务。因为我们每次想要做的
操作不尽相同,每次可能都需要配置一下才能正常运行,不能一劳永逸的,您也是懒得话,自己写一个工具类吧。

简单点说我就是想知道spark程序里怎么读写linux系统里的文件