Details
-
Improvement
-
Status: Resolved
-
Major
-
Resolution: Later
-
1.3.1, 1.4.1, 1.5.0
-
None
Description
Currently we use `RDD[Vector]` to store point cost during k-means|| initialization, where each `Vector` has size `runs`. This is not storage-efficient because `runs` is usually 1 and then each record is a Vector of size 1. What we need is just the 8 bytes to store the cost, but we introduce two objects (DenseVector and its values array), which could cost 16 bytes. That is 200% overhead. Thanks Grace Huang and Jiayin Hu from Intel for reporting this issue!
There are several solutions:
1. Use `RDD[Array[Double]]` instead of `RDD[Vector]`, which saves 8 bytes per record.
2. Use `RDD[Array[Double]]` but batch the values for storage, e.g. each `Array[Double]` object covers 1024 instances, which could remove most of the overhead.
Besides, using MEMORY_AND_DISK instead of MEMORY_ONLY could prevent cost RDDs kicking out the training dataset from memory.
Attachments
Issue Links
- is related to
-
SPARK-10354 First cost RDD shouldn't be cached in k-means|| and the following cost RDD should use MEMORY_AND_DISK
- Resolved
-
SPARK-12450 Un-persist broadcasted variables in KMeans
- Resolved
- relates to
-
SPARK-11358 Deprecate `runs` in k-means
- Resolved
- links to