Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 有效读取数据分区大小10GB_Apache Spark_Cassandra_Apache Spark Sql_Datastax_Datastax Enterprise - Fatal编程技术网

Apache spark 有效读取数据分区大小10GB

Apache spark 有效读取数据分区大小10GB,apache-spark,cassandra,apache-spark-sql,datastax,datastax-enterprise,Apache Spark,Cassandra,Apache Spark Sql,Datastax,Datastax Enterprise,我们使用的是Cassandra DataStax 6.0和Spark。我们每天都有10GB的数据。所有查询都基于日期。我们有一张40列的大桌子。我们计划使用Spark生成报告。设置此数据的最佳方法是什么。因为我们每天都在获取数据,并在一个表中保存大约1年的数据 我们尝试使用不同的分区,但大多数密钥都基于日期 没有代码只是需要建议 我们的查询应该足够快。我们有256GB的Ram和9个节点。44核心CPU。将数据组织在日常分区中不是很好的设计-在这种情况下,只有RF节点在白天写入数据时处于活动状态,

我们使用的是Cassandra DataStax 6.0和Spark。我们每天都有10GB的数据。所有查询都基于日期。我们有一张40列的大桌子。我们计划使用Spark生成报告。设置此数据的最佳方法是什么。因为我们每天都在获取数据,并在一个表中保存大约1年的数据

我们尝试使用不同的分区,但大多数密钥都基于日期

没有代码只是需要建议


我们的查询应该足够快。我们有256GB的Ram和9个节点。44核心CPU。

将数据组织在日常分区中不是很好的设计-在这种情况下,只有RF节点在白天写入数据时处于活动状态,然后在生成报告时处于活动状态

因为您将仅从Spark访问该数据,所以您可以使用以下方法-使用一些bucket字段作为分区键,例如,使用统一生成的随机数,使用timestamp作为集群列,或者使用另一个
uuid
列来保证记录的唯一性,类似这样:

create table test.sdtest (
  b int,
  ts timestamp,
  uid uuid,
  v1 int,
  primary key(b, ts, uid));
其中,
b
的generatio的最大值应选择为不太大也不太小的分区,以便我们可以有效地读取它们

然后我们可以像这样运行Spark代码:

create table test.sdtest (
  b int,
  ts timestamp,
  uid uuid,
  v1 int,
  primary key(b, ts, uid));
import org.apache.spark.sql.cassandra_
val data=spark.read.cassandraFormat(“sdtest”,“test”).load()
val filtered=data.filter(“ts>=cast('2019-03-10T00:00:00+0000'作为时间戳)和ts
这里的诀窍是,我们使用随机分区键跨节点分发数据,因此所有节点都将在写入数据和生成报告期间处理负载

如果我们研究Spark代码的物理计划(格式化为可读性):

==物理计划==
*扫描org.apache.spark.sql.cassandra.CassandraSourceRelation[b#23,ts#24,v1#25]
推式过滤器:[*大于或等于(ts,2019-03-10 00:00:00.0),
*LessThan(ts,2019-03-11 00:00:00.0)],ReadSchema:struct
我们可以看到,这两个条件都将在CQL级别推送到DSE—这意味着Spark不会将所有数据加载到内存中并对其进行过滤,而是所有过滤都将在Cassandra中进行,并且只返回必要的数据。由于我们在多个节点之间分散请求,读取速度可能比读取一个巨大分区更快(需要测试)。这种设计的另一个好处是,使用Spark可以轻松删除旧数据,如下所示:

create table test.sdtest (
  b int,
  ts timestamp,
  uid uuid,
  v1 int,
  primary key(b, ts, uid));
val toDel=sc.cassandraTable(“测试”、“sdtest”)。其中(“ts<'2019-08-10T00:00:00+0000”)
toDel.deleteFromCassandra(“test”,“sdtest”,keyColumns=SomeColumns(“b”,“ts”))
在这种情况下,Spark将执行非常有效的范围/行删除,从而生成更少的墓碑

另外,建议使用DSE版本的Spark连接器,因为它可能有更多优化


p.p.S.理论上,我们可以将
ts
uid
合并到一个
timeuuid
列中,但我不确定它是否可以处理数据帧。

您是仅通过Spark处理数据,还是也通过其他API访问数据?仅通过Spark处理正在进行