У меня есть датафрейм, который выглядит так:
+--------------------++-------------
| feature| id |
+--------------------++-------------
|[2.23668528E8, 1....| image1 |
|[2.23668528E8, 1....| image2 |
|[2.23668528E8, 1....| image3 |
|[2.23668528E8, 1....| image4 |
|[2.23668528E8, 1....| image5 |
Я пытаюсь найти сходство во всех парах. Эти функции в основном представляют собой простые векторы, извлеченные из модели vgg16. Количество строк составляет около 1 миллиона, и все функции хранятся в s3. Я использую pyspark для достижения этой цели. Я попробовал два подхода для этого, используя BucketedRandomProjectionLSH из ml модуля в искре.
Подход 1:
- Скопируйте все функции из s3 на диск с драйвером.
- Считать функции в список Python
- Apply sc.parallelize (список функций, 200)
- Преобразовать rdd в фрейм данных
- Наконец, вызовите LSH на этом кадре данных, который работает нормально. (Время, затрачиваемое на вычисление подобия, составляет около 20 минут, и это здорово)
Подход 2:
- Получить все пути к файлам из s3 в списке.
- Распределите все пути, используя sc.parallelize (список путей к файлам), а затем вызовите функцию, которая загрузит функцию из s3 в каждом из исполнителей для каждого из путей.
- Преобразовать rdd в датафрейм
- Наконец, вызовите LSH на этом кадре данных.
Проблема в том, что в этом случае работа продолжает терпеть неудачу.
Если я вижу журналы исполнителей, я вижу только какое-то соединение с журналами s3 и выполнение сигнала SIGTERM.
Я также пытался скопировать все функции в HDFS и следовать подходу 2, но ничего не работает.
Я хочу использовать подход 2, потому что я не хочу перенести все функции в память драйвера. Я хочу использовать искривление распараллеливания для достижения этой цели. Любая помощь будет принята с благодарностью.