【发布时间】:2020-06-08 06:04:12
【问题描述】:
我是 Cassandra 的新手/初学者。我对 Cassandra 的工作原理进行了一些研究 (https://www.scnsoft.com/blog/cassandra-performance),但我遇到了一种情况。
我有 2 个总和为 384 MB 的 CSV 和一个 Win10 虚拟机,几乎有 10 GB 的可用存储空间。我的目标是使用 IntelliJ 的 spark/scala 将 384 MB 的 CSV(7.496.735 行)存储在 Cassandra 的单个表中(所有内容都在同一个单节点虚拟机中)。我想我会消耗大约 200-400 MB 的存储空间,但实际情况却大不相同。在由于缺少磁盘而失败之前,它消耗了所有 10 GB 的磁盘。我认为“这一定是复制因素”,但它不能像键空间那样创建:
CREATE KEYSPACE IF NOT EXISTS testkeyspace WITH REPLICATION = { '类':'SimpleStrategy','replication_factor':1 } AND DURABLE_WRITES = true ;
当计算存储的行数时(它会永远持续下去,它自己在控制台上进行了几次操作),它设法保存:1.767.450 行。
第二天我意识到它“释放”了 6.38 GB 的磁盘。
我的问题是:
为什么 Cassandra 需要如此多的可用磁盘空间来存储这么少的数据(最初是 10 GB,后来是 3.5 GB 来存储不到 0.5 GB 的原始数据)?
为什么它后来释放了磁盘空间(本应使用 6.38 GB)?
最后,如何从 spark/scala 成功地将 CSV 数据存储在 Cassandra 中?
编写代码为:
val spark_cassandra = cassandra_session()
cassandra_write(spark_cassandra, joined_df_unique, "joined_df_unique", "testkeyspace")
def cassandra_write( spark_cassandra : SparkSession, df : DataFrame , df_name : String, keyspace : String ) = {
import com.datastax.spark.connector._
import com.datastax.spark.connector.cql.CassandraConnector
import org.apache.spark.sql.cassandra._
val sparkContext = spark_cassandra.sparkContext
val connector = CassandraConnector(sparkContext.getConf)
df.createCassandraTable(keyspace,df_name) //, writeConf = writeConf)
df.write.cassandraFormat(df_name,keyspace).mode(SaveMode.Append).save()
}
def cassandra_session() : SparkSession = {
val spark_cassandra = org.apache.spark.sql.SparkSession
.builder()
.master("local[*]")
.config("spark.cassandra.connection.host", "localhost")
.appName("Spark Cassandra Connector Example")
.getOrCreate()
spark_cassandra
}
// ("com.datastax.spark" %% "spark-cassandra-connector" % "2.4.3")
对不起,如果这太基本了,这是我第一次将 fon spark/scala 存储到 Cassandra。提前致谢。
【问题讨论】:
-
好吧,看起来每 1000 行,您的查询也返回大约 13000 个墓碑。这告诉我超过 90% 的磁盘被已删除的数据占用。这是我要解决的第一个问题。
标签: scala apache-spark cassandra