当数据很大时,如何将数据从cassandra缓存到spark?

时间:2015-11-24 10:55:00

标签: apache-spark cassandra spark-cassandra-connector

我从cassandra获取一些数据来激发火花,当数据足够大并且无法在内存中缓存一次时,我必须使用spark.cassandra.input.split.size_in_mb来设置一次机器有多大的数据get.But我也想使用缓存数据更多时间,代码喜欢这个:

val conf = new SparkConf().setAppName("CassandraLogAnalyse")
  .set("spark.cassandra.connection.host", "xxx")
  .set("spark.cassandra.auth.username", "xxx")
  .set("spark.cassandra.auth.password", "xxx")
  .set("spark.cassandra.input.split.size_in_mb",'512')
//Select Data from cassandra
val sc = new SparkContext(conf)

val loggly_http_in = sc.cassandraTable("loggly", "http_in").select("uid", "cjj_id", "request_uri", "request_body").where("app_context = ? and log_time > ?", "news", batch_time)

loggly_http_in.cache()

val rdd1 = loggly_http_in.map(...).filter(...)......
val rdd2 = loggly_http_in.map(...).filter(...)......

这是对的吗? 如果它是正确的,它是如何工作的? 当它错了,什么是正确的方式?

1 个答案:

答案 0 :(得分:1)

spark.cassandra.input.split.size_in_mb设置与缓存无关。此设置确定每个Spark分区的大小。如果将其设置得太大,则可能会执行的任务太少而某些节点可能仍未使用。如果将其设置得太低,您将从任务调度中获得更多开销。

Spark可以缓存RDD(和多个RDD)的多个分区。因此,当您调用cache()时,这将尝试缓存尽可能多的RDD分区,因为它可以找到空闲内存。如果您需要缓存超过实际缓存,唯一的方法是为您的应用程序分配更多Spark群集内存。

您对cache的使用看起来不错。

不要忘记您也可以缓存任何已转换的RDD。例如。过滤后缓存RDD可能需要比缓存从Cassandra获取的原始RDD更少的内存。