IO基本实现原理
Input& Output
字节流
InputStream in = new FileInputStream("path")
int i = -1
while ( (i = in.read()) != -1 ) {
println(i);
}
上述为字节流 需要一个字节一个字节读取数据,读一个打印一个。功能可以实现,效率不高。
缓存流
InputStream in = new BufferedInputStream(new FileInputStream("path"))
int i = -1
while ( (i = in.read()) != -1 ) {
println(i);
}
读取完后,不会马上打印出来先放到buff缓冲区域,待到达某个阈值,一起打印出来。类似批处理
字符流
Reader in = new BufferedReader(new InpuketreamReader(new FileInputStream("path"),"UTF-8"
)
)
String s = null
while ( (s = in.readLine()) != null )
println(i);
}
IO操作体现了装饰着模式
字符流的底层逻辑 依旧是字节流,一个一个字节读取后,转换成字符。再到下面的buff 缓存区达到阈值,一起打印出来。
RDD与IO的区别
由IO操作原理可见,对RDD进行了层层的装饰。
RDD的数据处理方式类似于IO流,也有装饰者设计模式。
RDD的数据只有在调用collect方法时,才会真正执行业务这再操作。之前的操作全部是功能的扩展。
之前的RDD是不保存数据的,但是IO可以临时保存一部分数据
task 放到哪个位置合适,从下图可以看出,在分布式节点中,task可以放到上面的节点也可以放到下面的节点。但是,放到哪个节点合适呐?我们可以看到数据是在上面的节点中,逻辑计算是在下面的节点上。如果将上面的节点中的数据转移到下面的节点中,且节点的数据非常大,那么需要考虑网络延迟问题。但是将计算放到上面则不需要考虑。