Aya*_*z49 4 python hadoop apache-spark pyspark
我有大约 100GB 的用户数据,想要在我的笔记本电脑上使用 Apache Spark 处理它。我已经安装了 Hadoop 和 Spark,为了测试,我将大约 9 GB 的文件上传到 HDFS 并使用pyspak访问和查询它。
当我查询特定用户的数据时,测试文件共有 113959238 条记录/行,即
select * from table where userid=????
Run Code Online (Sandbox Code Playgroud)
检索该用户的记录大约需要 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)
Run Code Online (Sandbox Code Playgroud)
鉴于我的机器规格,Spark 是否需要正常时间或者我需要配置什么?我是否需要升级规格,或者这些数据是否足够?
对于 Spark、Hadoop 和其他大数据提供商,需要了解的一件事是,他们的目标并不是从单个机器获得最大可能的吞吐量。他们的目标是让您在多台机器上有效地分割处理。他们牺牲一定量的单个机器吞吐量来提供水平可扩展性。
虽然您可以在一台机器上运行 Spark,但这样做的主要原因是学习 Spark 或编写测试代码,然后部署以针对具有更多数据的集群运行。
正如其他人所指出的,如果您只想在一台机器上处理数据,那么有些库在这种情况下会更有效。在单台机器上处理 100GB 并不是一个巨大的数据量。
从声音来看,您最好将该数据导入数据库并添加合适的索引。另一件需要理解的事情是,大数据系统的很多好处是支持分析和处理大部分或全部数据。当您主要使用索引查询少量数据时,Postgres 或 SQL Server 等传统数据库系统可以很好地处理 TB 级的数据。