NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Вы должны написать свои паркетные файлы с меньшим размером блока. Значение по умолчанию - 128 Мб на блок, но его можно настроить, установив конфигурацию parquet.block.size
в записи.
Источник ParquetOuputFormat здесь , если вы хотите вникнуть в детали.
Размер блока - это минимальный объем данных, которые вы можете прочитать из файл паркета, который является логически читаемым (поскольку паркет столбчатый, вы не можете просто разделить по строке или что-то тривиальное, как это), поэтому вы не можете иметь больше потоков чтения, чем входные блоки.
Новый способ сделать это (Spark 2.x) устанавливает
spark.sql.files.maxPartitionBytes
Источник: https://issues.apache.org/jira/browse/SPARK-17998 (официальная документация еще не верна, пропускает .sql)
По моему опыту настройки Hadoop больше не действуют.
Возможно, ваш файл паркета занимает только один блок HDFS. Создайте большой файл паркета с большим количеством блоков HDFS и загрузите его.
val k = sc.parquetFile("the-big-table.parquet")
k.partitions.length
Вы увидите то же количество разделов, что и блоки HDFS. Это работало отлично для меня (spark-1.1.0)
Вы упомянули, что хотите контролировать распределение во время записи в паркет. При создании паркета из паркета RDD сохраняются разделы RDD. Итак, если вы создадите RDD и укажите 100 разделов и из фреймворка с паркетным форматом, тогда он будет писать 100 отдельных паркетных файлов в fs. Для чтения вы можете указать параметр spark.sql.shuffle.partitions
.
Чтобы достичь этого, вы должны использовать SparkContext
для установки свойства конфигурации Hadoop (sc.hadoopConfiguration
) mapreduce.input.fileinputformat.split.maxsize
.
Установив это свойство на меньшее значение, чем hdfs.blockSize, вы получите столько же разделов, сколько количество разделов.
Например: Когда hdfs.blockSize
= 134217728 (128 МБ) и один файл считывается, который содержит ровно один полный блок, а mapreduce.input.fileinputformat.split.maxsize
= 67108864 (64 МБ)
Тогда будут два раздела, в которые будут считываться данные расщепления.
parquet.block.size
(иDataset
s), который пишет паркет для копий людей и вставить нужды :) – samthebest 10 August 2016 в 07:41