spark系统有几处与磁盘交换的地方:
1,spark的shuffle依然要将map的数据存储在磁盘上,所以在spark的环境变量中可以设置"spark.local.dir"的值保存spark的shuffle数据存储的位置,如果没有设置,shuffle的数据默认将放在"java.io.tmpdir"中,这段代码在core当中为:
def getLocalDir(conf: SparkConf): String = {
/*if the spark.local.dir is not set, get the default value from java.io.temdir..casa*/
conf.get("spark.local.dir", System.getProperty("java.io.tmpdir")).split(',')(0)
}
其中的get函数为:
/** Get a parameter, falling back to a default if not set */
def get(key: String, defaultValue: String): String = {
settings.getOrElse(key, defaultValue)
}
在spark-env.sh中定义的方式如下(在环境变量spark.io.dir中如果有多个目录用逗号隔开,这样如果用多块硬盘可以减少shuffle写磁盘的时间):
export SPARK_JAVA_OPTS=" -Dspark.local.dir=/home/NewHadoop/data/shuffle,/mnt/disk2 "
2,spark系统与磁盘交换的还有日志和work中存储的app日志的目录
3,spark作业在运行的时候会依赖jar包和file,这些jar和file都要存储在磁盘上,我觉得应该也是存储在work中,但是现在写的作业还没有遇到那种复杂的情况,以后遇到再补上
4,spark中还有与磁盘交互的当然就是加载数据了,比如读磁盘上的文件,读hdfs,还可从hbase和sequence file加载数据,其中读hdfs和写hdfs如下:
val rdd2 = sc.textFile("hdfs://10.11.1.190:9000/home/zhanglei/storage/testData.1");
val data1 = rdd2.map(line => line.split(" "));//map是一对一
val data2 = rdd2.flatMap(line => line.split(" "));//flatMap是一对多
data2.saveAsTextFile("hdfs://10.11.1.190:9000/home/zhanglei/storage/testData.2");