apache-spark – Apache Spark如何在内存中运行?

在where子句中使用非索引列查询Cassandra时,Spark-Cassandra-Connector的 official documentation说,

To filter rows, you can use the filter transformation provided by Spark. However, this approach causes all rows to be fetched from Cassandra and then filtered by Spark.

我对此有点困惑.例如,如果我有十亿行此db结构:ID,City,State和Country,其中只有ID被索引.如果我在where子句中使用City =’Chicago’,Spark会先下载所有十亿行,然后过滤出City =’Chicago’的行吗?或者它会从Cassandra读取一些数据,运行过滤器,存储符合条件的行,然后获取更多数据块,获取与条件匹配的行,并将它们再次放在一边……并继续该过程.如果在任何时候,RAM和/或磁盘存储器运行不足,删除/卸载/删除与条件不匹配的数据,并获取新的数据块以继续该过程?

此外,有人可以告诉我一个通用的公式来计算保存一个bigdecimal列和3个文本列十亿行所需的磁盘空间多少?

过滤行可以在数据库中或在Spark中进行.文档推荐的是尽可能多地尝试过滤数据库中的记录,而不是在spark中进行.那意味着什么:

sc.cassandraTable("test", "cars")
  .select("id", "model")
  .where("color = ?", "black")

上面的语句将在Cassandra(数据库)中运行color =’black’过滤器,因此Spark不会将任何具有黑色以外颜色的记录提取到其内存中.而不是将十亿条记录存入内存,Spark可能只会加载几百万个碰巧在颜色列中具有黑色值的数据.

相反,过滤可以在spark中完成:

sc.cassandraTable("test", "cars")
  .select("id", "model")
  .filter(car -> "black".equals(car.getColor()))

最后一个版本将所有数十亿条记录加载到Spark的内存中,然后在Spark中按颜色过滤它们.显然,这不能优先于最小化Spark集群所需内存量的先前版本.因此,对于可在数据库中处理的任何简单过滤,应使用数据库/驱动程序/查询过滤器.

关于估计内存需求,还有其他问题提出了各种方法,请查看thisthis.在spark’s documentation还有一个很好的建议:

How much memory you will need will depend on your application. To determine how much your application uses for a certain dataset size, load part of your dataset in a Spark RDD and use the Storage tab of Spark’s monitoring UI (http://:4040) to see its size in memory. Note that memory usage is greatly affected by storage level and serialization format – see the tuning guide for tips on how to reduce it.

相关文章
相关标签/搜索