Параллельная обработка XML-дампа данных Википедии с помощью Storm

Я пытаюсь обработать дамп википедии, найденный здесь. Конкретно с файлом enwiki-latest-pages-articles-multistream.xml.bz2. Это около 46 ГБ без сжатия. В настоящее время я использую анализатор STAX на Java (xerces) и могу извлекать 15 000 элементов страницы в секунду. Однако узким местом, похоже, является синтаксический анализатор, и я играл с aalto-xml, но это не помогло.

Поскольку я анализирую каждый элемент страницы в носике Storm, это узкое место. Однако я подумал, что могу просто выделить текст между тегами ... и несколько болтов обрабатывают каждый из этих элементов страницы параллельно. Это уменьшит объем работы, которую должен выполнять Грозовой носик. Однако я не уверен в конкретном подходе, который следует использовать здесь. Если я использую синтаксический анализатор для извлечения содержимого между тегами, это будет означать, что он будет анализировать каждый отдельный элемент от начала тега до конца. Есть ли способ устранить эти накладные расходы в стандартном синтаксическом анализаторе SAX/STAX?


person Dinesh    schedule 19.10.2014    source источник
comment
Я не знаю, как это могло быть. Чтобы узнать, что тег, в котором вы хотите получить необработанный XML, закрыт, я думаю, что ему нужно будет проанализировать весь XML-контент внутри. В противном случае конечный тег, с которым он сталкивается, может быть неоднозначным с тем, который вы действительно хотите, и другим, который действует из-за введенного пространства имен, например. Похоже, что для этого потребуются в целом небезопасные предположения, которые, возможно, можно применять только в определенных ситуациях.   -  person Carl G    schedule 05.11.2014
comment
Xerces НЕ является парсером Stax; может быть, вы имеете в виду SAX? Что касается использования Аалто; поскольку он по крайней мере в 2 раза быстрее, чем Xerces, если вы не наблюдаете изменений, вы можете либо использовать его неправильно (например, не использовать повторно XMLInputFactory - создание их очень дорого), либо, возможно, узкое место не в синтаксическом анализе и/или генерации XML ?   -  person StaxMan    schedule 01.04.2016


Ответы (2)


Я пробовал что-то подобное в попытке распараллелить.

в любом случае, поскольку я использую данные Википедии для многих задач, было просто проще создать дамп с одной статьей на строку, который затем я мог бы проводить много экспериментов параллельно. Запуск занимает всего несколько минут, затем у меня есть дамп, который я могу очень легко передать в Spark (в вашем случае Storm).

Если вы хотите использовать наши инструменты, проверьте: https://github.com/idio/wiki2vec

person David Przybilla    schedule 19.02.2015

Невозможно выполнить произвольный доступ к XML-документу, но многие синтаксические анализаторы Java XML имеют несколько более эффективный пропуск неиспользуемого содержимого: например, Aalto и Woodstox откладывают декодирование значений String (и построение объектов String), так что, если токены пропущены, выделения не нужны.

Одна вещь, которую нужно убедиться в Stax, это НЕ использовать Event API, если нет особой необходимости буферизовать содержимое — он не предлагает много функций по сравнению с базовым Streaming API (XMLStreamReader), но добавляет значительные накладные расходы, поскольку каждый XMLEvent создается независимо от того, нужен ли он. Потоковый API, с другой стороны, указывает только тип события/токена и позволяет вызывающей стороне решить, нужен ли контент (атрибуты, текстовое значение), и может избежать выделения большинства объектов.

person StaxMan    schedule 01.04.2016