我是新来的。。。在学习基础知识时,有些基本的东西我不太清楚:
查询1。对于分布式处理—可以在没有hdfs的情况下激发工作—集群上的hadoop文件系统(比如创建自己的分布式文件系统),或者它是否需要一些基本的分布式文件系统,比如hdfs、gpfs等。
查询2。如果我们已经在hdfs中加载了一个文件(作为分布式块),那么spark将再次将其转换为块并在其级别重新分发(用于分布式处理),或者只使用haddop hdfs集群中的块分发。
问题3。除了定义dag之外,spark是否也会像mapreduce那样创建分区,并将分区洗牌到reducer节点以供进一步计算?我同样感到困惑,直到dag创建,很明显,在每个工作节点上工作的spark executor将数据块作为rdd加载到内存中,并根据dag应用计算。。。。但是,按照键对数据进行分区并将它们带到其他节点执行reducer任务(就像mapreduce一样)所需的部分在哪里呢?在内存中是如何完成的??
4条答案
按热度按时间t98cgbkg1#
这最好是作为单独的问题提出,问题3很难理解。无论如何:
不,spark不需要分布式文件系统。
默认情况下,spark将为每个hdfs块创建一个分区,并尽可能将计算和数据放在同一位置。
你问的是洗牌。shuffle在Map器上创建块,还原器将从Map器中获取这些块。这个
spark.shuffle.memoryFraction
参数控制分配给无序块文件的内存量(默认情况下为20%。)spark.shuffle.spill
参数控制内存用完时是否将无序块溢出到本地磁盘。gywdnpxw2#
查询1:-对于simple spark,由于抽象rdd(resilent distribute dataset),因此提供分布式处理,而没有hdfs,则无法提供分布式存储。
查询2:-不,它不会重新创建。这里spark将提供每个块作为分区(这意味着引用该块),所以它在同一块上启动yarn
问题3:不知道。
kyvafyod3#
查询1。是的,它也可以和其他人一起工作。spark与rdd一起工作,如果你实现了相应的rdd,那就是它。当你通过在hdfs中打开一个文件来创建rdd时,它本质上会创建一个hadoop rdd,它有理解hdfs的实现,如果您编写自己的分布式文件系统,您可以为相同的文件系统编写自己的实现,并示例化完成的类。但是将连接器rdd写入我们自己的dfs是一个挑战。更多信息,您可以查看spark代码中的rdd接口
查询2。它不会重新创建,而是我的hadoop/hdfs-rdd连接器,它知道块在哪里,它还会尝试使用相同的yarn节点来运行jvm任务来进行处理。
问题3。我不确定
ldfqzlk84#
查询1。对于分布式处理-spark可以在没有hdfs的情况下工作吗?
对于分布式处理,spark不需要hdfs。但它可以从hdfs系统读写数据。对于某些用例,它可能会将数据写入hdfs。对于teragen排序世界记录程序,它使用hdfs来排序数据,而不是在内存中使用。
spark不提供分布式存储。但与
HDFS
是存储的一种选择。但是spark可以使用其他存储系统,如Cassnara等。请参阅本文了解更多详细信息:https://gigaom.com/2012/07/11/because-hadoop-isnt-perfect-8-ways-to-replace-hdfs/查询2。如果我们已经在hdfs中加载了一个文件(作为分布式块),那么spark会再次将其转换为块并在其级别重新分发吗
我同意daniel darabos的回答。spark将为每个hdfs块创建一个分区。
问题3:洗牌
根据数据的大小,洗牌将在内存中进行,也可以使用磁盘(例如teragen排序),也可以同时使用两者。看看这篇关于spark shuffle的优秀文章。
没问题。如果没有足够的内存来存储整个“Map”输出呢?您可能需要将中间数据溢出到磁盘。参数spark.shuffle.spill负责启用/禁用溢出,默认情况下启用溢出
在将“map”输出溢出到磁盘之前,可用于存储这些输出的内存量是“jvm heap size”spark.shuffle.memoryfractionspark.shuffle.safetyfraction,默认值是“jvm heap size”0.20.8=“jvm heap size”*0.16。