【发布时间】: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