Параллельные алгоритмы для обработки BigData — подводные камни и непростые решения на примере кластеризации каталога из 10 млн. товарных позиций Александр Сербул Руководитель направления Карл… Карл, я нашел страшный подвох в MapReduce Не может быть, пап! Карл… Карл, я специалист по BigData…. Это оченьБольшинство круто, алгоритмов пап! придется изобретать заново! ЗАНОВО!!! Алгоритмическая «западня» • Большинство алгоритмов для MapReduce нужно изобретать заново • Новый технологический стек 4 «воюющих» лагеря БД • SQL на MapReduce: Hive, Pig, Spark SQL • SQL на MPP (massive parallel processing): Impala, Presto, Amazon RedShift, Vertica • NoSQL: Cassandra, Hbase, Amazon DynamoDB • Классика: MySQL, MS SQL, Oracle, … «Готовые» решения для кластеризации • Spark MLlib (scala/java/python) – много данных • scikit-learn.org (python) – мало данных •R Подходы к кластеризации - просто • Иерархическая • K-means • C-means • Spectral • Density-based (DBSCAN) • Вероятностные • Для «больших данных» Что мы кластеризуем • Описание Товара: 2-10 слов • Bag of words • Stemming, морфология? • Kernel hack? • TF/IDF • Word2Vec?! K-means • Просто, понятно • Долго!!! n = 10 000 000 (товаров) k = 1 000 000 (кластеров) d = <1 000 000 (видов слов) i = 100 (итераций) Время работы ~ 10^21 Возраст Земли ~ 1,4*10^17 сек Apache Mahout • «Туго» с алгоритмами • Нет для Spark • Нужно дописывать свои Spark MLLib • Ура, на кластере! • Увы, очень медленно • Падения «по памяти» • Зависания • Свой вариант k-means («Clustering by Bootstrap Averaging») Цитрамон – хорошо помогает от головной боли Minhash Min-wise independent permutations locality sensitive hashing scheme 1) Снижаем размерность 2) Совместима с LSH (следующий слайд) Pr[ hmin(A) = hmin(B) ] = J(A,B) Размер сигнатуры: 50-500 simhash Text shingling 1) Shingle – «черепица» 2) Устойчивость к вариантам, опечаткам «Штаны красные махровые в полоску» {«штан», «таны», «аны », «ны к», «ы кра», «крас», …} «Красные полосатые штаны» Векторизация описания Товара Текст: «Штаны красные махровые в полоску» Вектор «bag of words»: [0,0,0,1,0,…0,1,0] – ~ 10000 1000000 элементов (kernel hack) Minhash-сигнатура после shingling: [1243,823,-324,12312,…] – 100-500 элементов, совместима с LSH Locality-Sensitive Hashing (LSH) • Вероятностный метод снижения размерности • Использовали для minhashedвекторов • Banding: b – корзины, r – элементов в корзине. P{“Векторы совпадут хотя-бы в одной корзине”}: «Mining of Massive Datasets»: Leskovec, Rajaraman, Ullman (Stanford University) Кластеризация каталога • Apache Spark • 2-3 часа, 8 spot-серверов • 10 млн. Товаров => 1 млн. кластеров • Адекватные по смыслу кластера • Персональные рекомендации - стали в разы «лучше» • DynamoDB – хранение кластроидов «Простота — это то, что труднее всего на свете; это крайний предел опытности и последнее усилие гения» Леонардо да Винчи Спасибо за внимание! Вопросы? Александр Сербул @AlexSerbul serbul@1c-bitrix.ru