Я запускаю искровую работу на кластере пряжи, читаю данные из файла паркета и записываю обратно после anylysis. Через некоторое время драйвер получит OOM и выйдет. Я обнаружил, что в драйвере есть много метаданных hadoop (jmap -histo: live $ PID | head -30).
num #instances #bytes class name
----------------------------------------------
1: 45839 409413024 [B
2: 1947930 206838976 [C
3: 1947532 46740768 java.lang.String
4: 142863 11429040 java.net.URI
5: 331654 10422648 [Ljava.lang.String;
6: 142719 10275768 org.apache.hadoop.fs.LocatedFileStatus
7: 134418 7527408 org.apache.hadoop.fs.BlockLocation
8: 29856 5254656 org.apache.hadoop.hdfs.protocol.DatanodeInfoWithStorage
9: 146047 4673504 scala.collection.mutable.LinkedEntry
10: 142724 4567168 org.apache.hadoop.fs.permission.FsPermission
11: 17556 4230704 [Ljava.lang.Object;
12: 134418 3226032 [Lorg.apache.hadoop.fs.BlockLocation;
13: 142806 2284896 org.apache.hadoop.fs.Path
14: 16777 1865704 java.lang.Class
15: 55624 1779968 java.util.concurrent.ConcurrentHashMap$Node
16: 421 1187216 [Lscala.collection.mutable.HashEntry;
17: 33501 1072032 java.util.Hashtable$Entry
18: 11491 1011208 java.lang.reflect.Method
Я запускаю sql на hdfs паркетном файле, sql похож на
"SELECT * FROM parquet.`/warehouse/TMP/USER`".
В задании будет прочитано около 1440000 файлов hdfs . Я полагаю, что spark загрузит все метаданные файла hdf в папку / warehouse / TMP / USER в драйвере, после этого искатель выполнит поиск метаданных блока hdfs из драйвера, отличного от namenode hdfs, и ускорит чтение данных.
Я должен удалить некоторые файлы hdfs, чтобы завершить свою работу, и мне интересно, почему в драйвере spark все эти метаданные хранятся постоянно, как я могу контролировать использование памяти в драйвере spark?