Hadoop / Spark 生态系统中的数据移动

Data Movement Within the Hadoop / Spark Ecosystem

我有一个基本问题,我希望能更好地理解它:

背景

假设我有一个巨大的 CSV 文件 (50 GB),我想将其提供给数据科学团队进行分析。理想情况下,团队的每个成员都能够以他们选择的语言与数据进行交互,数据不需要经常移动(考虑到它的大小)并且所有人都可以灵活地访问计算资源。

建议的解决方案

Apache Spark 似乎是满足上述要求的解决方案的当前领先者。 Scala、Python、SQL 和 R 都能够在灵活的计算资源之上(如果利用 DataBricks、Azure、AWS、Cloudera 等云提供商)访问其所在位置的数据。

问题

以Microsoft Azure / HDInsight 域为例。假设我们要将这个大型 CSV 文件上传到 Azure Data Lake。如果我们随后在 HDInsight 中利用 Spark 为该数据定义架构,我们是否需要从数据所在的位置移动/导入数据?

我的理解(可能是错误的)是一个关键的好处是数据能够以其原生的 CSV 格式驻留在数据湖中。 运行 对它的计算不需要移动它。此外,如果我们希望根据需要经常关闭/启动 Spark 集群,我们只需将它们重新指向廉价存储的 CSV 即可。

结论

如果您能就上述内容提供任何确认,或澄清误解,我们将不胜感激。 Hadoop / Spark 生态系统继续快速发展,我想确保我对其当前功能有正确的理解。

简短回答是,文件可以保留在 Azure Data Lake 存储中。您可以简单地将 Data Lake Store 作为附加存储帐户添加到您的 Spark HDInsight 集群,甚至可以在配置集群时将其设为默认存储帐户。这将使您的所有 Spark 作业都可以访问存储帐户中的数据文件。

更多信息请看这里: https://docs.microsoft.com/en-us/azure/hdinsight/hdinsight-hadoop-use-blob-storage#using-azure-data-lake-store-with-hdinsight-clusters

请注意,如果您选择拆除 HDInsight 集群并且您将 Hive 与 Spark 结合使用以实现 schema/table 持久性,请确保您使用外部数据库来托管您的 Metastore。

有关外部元存储的更多信息,请参阅此处: https://docs.microsoft.com/en-us/azure/hdinsight/hdinsight-hadoop-provision-linux-clusters#a-nameuse-hiveoozie-metastoreahive-metastore

2个注意事项:

  1. Efficient storage using Parquet:最好以Parquet格式存储数据而不是CSV,因为它节省了很多space并且使用Spark with Parquet (由于其柱状格式)由于谓词下推,将为您提供更好的查询性能。您可以使用 Parquet 将文件最多压缩 60%。
  2. Data Locality 数据驻留在执行器机器上:如果您在 Azure 上创建集群并将数据存储在 Azure Data Lake 上,那么会有一些数据从数据湖移动到执行者,除非数据是执行者的本地数据。

希望它能回答您的问题。