我可以使用Apache Spark在本地处理100 GB的数据吗?

4
我有大约100GB的用户数据想要在我的笔记本上使用Apache Spark处理。我已经安装了Hadoop和Spark,并为测试上传了一个大小约为9GB的文件到HDFS,使用pyspak访问并查询它。
测试文件总共有113959238条记录/行,当我查询特定用户的数据时,如下:
select * from table where userid=???? 

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

据说 Spark 是非常快速的,所以肯定有什么我忽略了,导致它花费了那么长时间。在执行查询时,我注意到一个问题,即 Spark 没有充分利用 RAM,而是几乎占用了 100% 的 CPU。

我的机器规格如下:

enter image description here

我还直接使用 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花费的时间是否正常?我需要进行一些配置吗?我需要升级规格吗,还是现有规格足够应对这些数据?


1
测试在我的笔记本上,用2分钟完全扫描了一个包含1亿条记录的CSV文件。请确保使用spark.master=local[*],并在读取CSV时获取足够的分区。 - Raphael Roth
但是两分钟仍然是非常长的时间。 - Ayaz49
我该怎么做才能让它更快? - Ayaz49
4个回答

8
理解 Spark、Hadoop 和其他大数据提供商的一个重要问题是,它们不旨在从单台计算机获得最大可能的吞吐量。它们旨在让您有效地将处理工作跨越多台计算机分割。它们为提供水平可伸缩性而牺牲一定量的单个计算机吞吐量。
虽然可以在单个计算机上运行 Spark,但主要原因是学习 Spark 或编写测试代码,然后部署到针对更多数据的群集中运行。
正如其他人所指出的,如果您只想在单台计算机上处理数据,则在这种情况下会有更高效的库可用。在单个计算机上处理100GB的数据并不算太大的数据量。
听起来您最好将该数据导入数据库并添加适当的索引。另一个需要了解的事情是,大数据系统的很多好处是支持分析和处理大多数或所有数据。传统的数据库系统(如Postgres或SQL Server)在使用索引查询少量数据时处理数TB的数据可以很好地工作。

1
您所描述的工作类型是高度CPU密集型的过程,不幸的是,只有在对数据集的许多并行查询上运行时才能显著加快速度。再加上没有足够的系统内存来容纳整个数据集,现在您还受到硬盘大量读写的限制。
这是Spark真正发挥作用的任务类型。您没有体验到性能提升的原因是,使用单个系统,您完全错过了Spark的好处,即将数据集分成许多分区并将其分布在许多机器上,这些机器可以同时处理许多不同的用户ID。
您群集中的每个工作节点将有一个较小的数据集要查看,这意味着在每个节点上,它正在查看的整个数据集可以轻松地存储在内存中。每个查找和替换函数(每个用户ID一个)都可以发送到单个CPU核心,这意味着如果您有5个具有16个核心的工作程序,则可以一次处理80个ID,从内存中进行优化的分区大小。

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


1
如果你的目标是使用Python分析100GB的数据,并且没有对Spark的需求,你也可以看一下Dask。 https://dask.org/ 它应该更容易设置和使用Python。
例如Dask DataFrame: 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

但它会相当慢。 - Ayaz49

0

在本地处理文件时,您不需要使用Hadoop。

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

同样,100GB的纯文本并不是真正的“大数据”;它仍适合单个计算机,并且如果以更好的格式(如ORC或Parquet)存储,则大小会显着减小。

此外,为了获得更快的时间,请勿使用collect()。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接