Spark将数据拉入RDD或数据框或数据集

时间:2016-08-20 03:38:27

标签: hadoop apache-spark apache-spark-sql spark-dataframe data-ingestion

当火花通过驱动程序提取数据时,我试图用简单的术语,然后当火花不需要通过驱动程序提取数据时。

我有3个问题 -

  1. 让你有一个存储在HDFS中的20 TB平面文件文件,并从驱动程序中将其拉入数据框或RDD,使用相应的库之一'开箱即用的功能(sc.textfile(path)sc.textfile(path).toDF等)。如果驱动程序只运行32 GB内存,它会导致驱动程序有OOM吗?或者至少对司机吉姆进行掉期交易?或者spark和hadoop是否足够聪明,可以将数据从HDFS分发到一个火花执行器,以便在不通过驱动程序的情况下制作数据帧/ RDD?
  2. 除了外部RDBMS之外,与1完全相同的问题?
  3. 除了特定节点文件系统(只是Unix文件系统,20 TB文件但不是HDFS)之外,与1完全相同的问题?

1 个答案:

答案 0 :(得分:4)

关于1

Spark使用分布式数据结构运行,如RDD和Dataset(以及2.0之前的Dataframe)。以下是您应该了解的有关此数据结构的事实,以获得您的问题的答案:

  1. 所有转换操作(如map,filter等)都是惰性的。 这意味着除非您需要,否则不会执行任何读数 具体的操作结果(如减少,折叠或保存) 结果到一些文件)。
  2. 在HDFS上处理文件时,Spark会运行 带文件分区。分区是最小逻辑批量数据 可以处理。通常一个分区等于一个HDFS 块和分区的总数永远不会少于 文件中的块数。公共(和默认的)HDFS块大小为128Mb
  3. RDD和中的所有实际计算(包括从HDFS读取) 数据集在执行程序内部执行,从不在驱动程序上执行。司机 创建DAG和逻辑执行计划并将任务分配给 执行人员进一步处理。
  4. 每个执行者都运行以前的执行者 为特定的数据分区分配任务。因此,通常如果只为执行程序分配一个核心,它将同时处理不超过128Mb(默认HDFS块大小)的数据。
  5. 所以基本上当你调用sc.textFile时,不会发生实际的阅读。所有提到的事实都解释了为什么在处理20 Tb数据时不会发生OOM。

    有一些特殊情况,例如join操作。但即使在这种情况下,所有执行程序都会将其中间结果刷新到本地磁盘以进行进一步处理。

    关于2

    如果是JDBC,您可以决定表的分区数。并在表中选择适当的分区键,将数据正确地分割为分区。由您决定将多少数据同时加载到内存中。

    关于3

    本地文件的块大小由fs.local.block.size属性控制(我猜默认为32Mb)。因此它基本上与1(HDFS文件)相同,除了您将从一台机器和一个物理磁盘驱动器读取所有数据(在20TB文件的情况下效率极低)。