Объект не создан при доступе из искровой UDF в кластере - PullRequest
0 голосов
/ 30 апреля 2020

Мы разрешаем ip адрес в город, используя базу данных maxmind. Объект читателя инициализируется и используется для получения города. Разрешение ip to city заключено в UDF, упомянутый в spark sql (resolIP (ip)), который обращается к объекту reader и получает город (reader.city (ip)).

Мы не хотим загружать файл размером 100+ МБ каждый раз в UDF. Таким образом, это обернуто вокруг как val. Это делается следующим образом:

val reader = {
    val database:File = BlobConnect.downloadFile("..location of mmdb file..")
    val reader: DatabaseReader = new DatabaseReader.Builder(database).build()
    reader
}

Переменная Reader инициализируется в том же объекте scala, где упоминается UDF. Согласно журналам исполнителя, читатель не был инициализирован и выдал исключение нулевого указателя. Мы подумали, что существует проблема с сериализацией ридера, поэтому добавили аннотацию @transient для каждого работника. Это не могло инициализировать читателя и выдало исключение нулевого указателя. @transient с отложенной оценкой также не работает.

Идея состояла в том, чтобы создать DatabaseReader в качестве широковещательной переменной и затем использовать его в UDF. Возникли проблемы с сериализацией объекта DatabaseReader. Даже базовой c инициализации Reader не происходит. Нет проблем при выполнении на локальном узле . Ошибка инициализации считывателя происходит во время выполнения на кластере. Пожалуйста, помогите нам понять проблему и понять, в чем мы виноваты.

...