我正在尝试使用Hive表上的Spark运行一些基本数据探索(通过DataStax 4.6在CFS上托管)。我的数据集大约是3.1GO,我使用dse spark运行spark-shell --executor-memory 16g(是的,我的执行器上有16g可用)。所以基本上我会写入spark-shell,如下:
val dataset = hc.sql("SELECT * FROM my_hive_table") ;
val data_sample = dataset.sample(false,.01,0) ;
data_sample.cache
然后我会尝试计算实际缓存某些东西
data_sample.count
但是当我检查spark-shell web UI时,我发现没有RDD持续存在,如果我再次尝试计数,我的整个数据集将再次从CFS读取。
所以我尝试通过CFS直接访问我的数据集作为文本文件
textFile.type = cfs:/user/hive/warehouse/my_hive_table/aaaammjj=20150526
并调整前面的代码来计算缓存RDD后的行数,这次RDD确实在两个工作者之间使用7 GB进行缓存!来自网络用户界面:
cfs:/ user / hive / warehouse / my_hive_table / aaaammjj = 20150526内存反序列化1x复制
我的schemaRDD没有使用Hive进行缓存的原因吗?由于schemaRDD提供了......很好的架构,这将是非常实际的。
请求任何帮助。
答案 0 :(得分:1)
因此,基于我与eliasah的讨论,我最终可能会以某种方式缓存表格:
val dataset = hc.sql("SELECT * FROM autori_daily_import")
dataset.registerTempTable("data")
hc.cacheTable("data")
hc.sql("select count(*) from data")
res22: Array[org.apache.spark.sql.Row] = Array([6409331])
hc.sql("select sens,count(*) from data group by sens").collect().foreach(println)
[A,3672249]
[E,2737082]
在缓存中确实有一个RDD,名称为" HiveTableScan的RDD存储信息......"
对于我来说,什么是模糊的是为什么我需要在我有一个schemaRDD时注册一个临时表,我有一个.cache()方法。如果我针对schemaRDD运行查询(使用.select(' sens).countByValue()),则Spark会再次扫描Hive表,并且不使用临时内存表。
答案 1 :(得分:0)
根据Spark 1.2的official documentation,Spark SQL可以通过调用sqlContext.cacheTable(“tableName”)使用内存中的列式格式来缓存表。
然后,Spark SQL将仅扫描所需的列,并自动调整压缩以最小化内存使用和GC压力。您可以调用sqlContext.uncacheTable(“tableName”)从内存中删除表。
请注意,如果您调用$this->Form->postLink("<i class='fa fa-remove'></i>", ['action' => 'delete', $role->id], ['escape' => false],['title' => 'Delete', 'class' => 'users'])]);
而不是schemaRDD.cache()
,则不会使用内存中的列式格式缓存表,因此强烈建议使用sqlContext.cacheTable(...)
用于此用例。 / p>
可以使用SQLContext上的setConf方法或使用SQL运行SET key = value命令来完成内存中缓存的配置。
实际上,您需要使用sqlContext.cacheTable(...)