测试文件总共有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花费的时间是否正常?我需要进行一些配置吗?我需要升级规格吗,还是现有规格足够应对这些数据?
spark.master=local[*]
,并在读取CSV时获取足够的分区。 - Raphael Roth