【问题标题】:Can I process 100 GB of data using Apache Spark on my local machine?我可以在本地机器上使用 Apache Spark 处理 100 GB 的数据吗?
【发布时间】:2020-06-10 04:15:02
【问题描述】:

我有大约 100GB 的用户数据,想在我的笔记本电脑上使用 Apache Spark 处理它。我已经安装了 Hadoop 和 Spark,为了测试,我上传了一个大约 9GB 的文件到 HDFS 并使用 pyspak

当我查询特定用户的数据时,测试文件总共有 113959238 条记录/行,即

select * from table where userid=???? 

检索该用户的记录大约需要 6 分钟,如果我在整个文件上运行,则需要很长时间。 我对该数据进行的分析是提取一个用户的记录,对其进行一些操作,然后为文件中的所有用户处理第二个用户的数据,依此类推。用户查询的数据不会太多,可以加载到内存中,可以更快的进行操作。但是从那个大文件中查询用户的记录需要时间并且会减慢这个过程。

据说 Spark 的速度很快,所以我肯定会遗漏一些东西,这就是为什么它需要这么长时间。我在执行查询时注意到的一件事是 Spark 没有使用完整的 RAM,而是几乎 100% 的 CPU。

我的机器规格是:

我也使用Spark而不是HDFS文件直接查询文本文件的数据,但时间差异不大。 我写的python代码是

 from pyspark import SparkContext, SparkConf
 from pyspark.sql import SparkSession, HiveContext,SQLContext
 import time
 conf=SparkConf()
 conf.set("spark.executor.memory", "8g")
 conf.set("spark.driver.memory", "8g")
 sparkSession = SparkSession.builder.appName("example-pyspark-read-and-write").getOrCreate()
 sc=sparkSession.sparkContext.getOrCreate(conf)
 sqlContext=SQLContext(sc)
 #df_load = sparkSession.read.format("csv").option("header","true").load("hdfs://0.0.0.0:19000/test.txt")
 df_load = sparkSession.read.format("csv").option("header","true").load("C:/Data/test_file/test.txt")
 table=df_load.registerTempTable('test')
 sp_tstart=time.time()
 df=sqlContext.sql("select * from test where user_id='12345'")
 db=df.rdd.collect()
 sp_tend=time.time()
 t_time=sp_tend-sp_tstart
 df.show()
 print(t_time/60)

鉴于我的机器规格,Spark 需要正常时间还是需要配置一些东西?我是否需要升级规格或是否足以满足这些数据?

【问题讨论】:

  • 在我的笔记本电脑上进行了测试,花了 2 分钟来完全扫描包含 1 亿条记录的 CSV。确保您使用spark.master=local[*] 并且在读取 csv 时获得足够的分区。
  • 但是2分钟还是很长的时间。
  • 我应该怎么做才能让它更快?

标签: python apache-spark hadoop pyspark


【解决方案1】:

您不需要 Hadoop 在本地处理文件。

Hadoop 的优势仅适用于您使用多台计算机的情况,因为您的文件将被分块并同时分发到多个进程。

同样,100GB 的明文并不是真正的“大数据”;它仍然适合单台机器,如果以 ORC 或 Parquet 等更好的格式存储,尺寸会明显减小

另外,为了获得更快的时间,不要使用 collect()

如果您只是想按 ID 查找数据,请使用 Redis 或 Accumulo 等键值数据库,而不是 Hadoop/Spark

【讨论】:

    【解决方案2】:

    您所描述的工作类型是一个高度占用 CPU 的进程,不幸的是,只有通过在数据集的分区上运行许多并行查询才能显着加快该进程。再加上没有足够的系统内存来保存整个数据集,现在您还受到硬盘驱动器上大量读/写的限制。

    这是 Spark 真正闪耀的任务类型。您没有体验到任何性能改进的原因是因为使用单个系统您完全失去了 Spark 的优势,即能够将数据集拆分为许多分区并将其分布在可以在许多机器上工作的许多机器上不同的用户 ID。

    集群中的每个工作节点都有一个较小的数据集可供查看,这意味着在每个节点上,它查看的整个数据集都可以轻松存储在内存中。每个查找和替换功能(每个用户 ID 一个)都可以发送到单个 CPU 内核,这意味着如果您有 5 个工作人员,每个工作人员有 16 个内核,您可以在优化的分区大小上一次从内存中处理 80 个 ID。

    Google CloudProc 和 Azure Databricks 是执行此操作的超级平台。只需选择您需要的工作人员数量以及每个节点的 CPU/内存,然后启动集群。连接到您的数据并启动您的 PySpark 代码。它可以如此快速地处理这些数据,即使您按分钟为集群付费,它最终也会非常便宜(也许 10-20 美元)。

    【讨论】:

      【解决方案3】:

      如果你的目标是使用 python 分析 100GB 的数据并且不需要 spark,你也可以看看 dask。 https://dask.org/ 使用python应该更容易设置和使用。

      例如 dask 数据框:https://docs.dask.org/en/latest/dataframe.html

      >>> import dask.dataframe as dd
      >>> df = dd.read_csv('2014-*.csv')
      >>> df.head()
         x  y
      0  1  a
      1  2  b
      2  3  c
      3  4  a
      4  5  b
      5  6  c
      
      >>> df2 = df[df.y == 'a'].x + 1
      

      【讨论】:

      • 但是会很慢
      【解决方案4】:

      Spark、Hadoop 和其他大数据提供商要理解的一件事是,它们的目标不是从单个机器获得最大可能的吞吐量。他们的目标是让您在多台机器上有效地拆分处理。他们牺牲了一定数量的单台机器吞吐量来提供水平可扩展性。

      虽然您可以仅在一台机器上运行 Spark,但这样做的主要原因是学习 Spark 或编写测试代码,然后部署以针对具有更多数据的集群运行。

      正如其他人所指出的,如果您只想在单台机器上处理数据,那么在这种情况下,有一些库会更高效。在单台机器上处理 100GB 并不是一个巨大的数量。

      从实际情况来看,最好将该数据导入数据库并添加合适的索引。要理解的另一件事是,大数据系统的许多好处是支持分析和处理大部分或全部数据。当您主要使用索引查询少量数据时,Postgres 或 SQL Server 等传统数据库系统可以很好地处理 TB 级数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-09
        • 1970-01-01
        • 2019-07-04
        • 1970-01-01
        • 1970-01-01
        • 2015-12-08
        • 1970-01-01
        相关资源
        最近更新 更多