<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE article PUBLIC "-//NLM/DTD JATS (Z39.96) Journal Publishing DTD v1.2 20120330//EN" "http://jats.nlm.nih.gov/publishing/1.2/JATS-journalpublishing1.dtd">
    <!--<?xml-stylesheet type="text/xsl" href="article.xsl">-->
<article xmlns:ns0="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" article-type="research-article" dtd-version="1.2" xml:lang="en">
	<front>
		<journal-meta>
			<journal-id journal-id-type="issn">2303-9868</journal-id>
			<journal-id journal-id-type="eissn">2227-6017</journal-id>
			<journal-title-group>
				<journal-title>Международный научно-исследовательский журнал</journal-title>
			</journal-title-group>
			<issn pub-type="epub">2303-9868</issn>
			<publisher>
				<publisher-name>ООО Цифра</publisher-name>
			</publisher>
		</journal-meta>
		<article-meta>
			<article-id pub-id-type="doi">10.60797/IRJ.2025.162.81</article-id>
			<article-categories>
				<subj-group>
					<subject>Brief communication</subject>
				</subj-group>
			</article-categories>
			<title-group>
				<article-title>Архитектура системы сбора и хранения метрик использования ресурсов Spark-приложений в кластерных системах обработки больших данных</article-title>
			</title-group>
			<contrib-group>
				<contrib contrib-type="author" corresp="yes">
					<contrib-id contrib-id-type="orcid">https://orcid.org/0009-0006-1802-6956</contrib-id>
					<name>
						<surname>Разумовский</surname>
						<given-names>Дмитрий Андреевич</given-names>
					</name>
					<email>diman-rraazz@mail.ru</email>
					<xref ref-type="aff" rid="aff-2">2</xref>
				</contrib>
				<contrib contrib-type="author">
					<contrib-id contrib-id-type="orcid">https://orcid.org/0000-0001-8259-3206</contrib-id>
					<contrib-id contrib-id-type="rinc">https://elibrary.ru/author_profile.asp?id=141726</contrib-id>
					<contrib-id contrib-id-type="rid">https://publons.com/researcher/E-4100-2014</contrib-id>
					<name>
						<surname>Стучилин</surname>
						<given-names>Владимир Валерьевич</given-names>
					</name>
					<email>stuchilin.vv@misis.ru</email>
					<xref ref-type="aff" rid="aff-1">1</xref>
				</contrib>
				<contrib contrib-type="author">
					<contrib-id contrib-id-type="orcid">https://orcid.org/0009-0005-9347-6888</contrib-id>
					<name>
						<surname>Волков</surname>
						<given-names>Денис Дмитриевич</given-names>
					</name>
					<email>volkov.deenis@gmail.com</email>
					<xref ref-type="aff" rid="aff-2">2</xref>
				</contrib>
			</contrib-group>
			<aff id="aff-1">
				<label>1</label>
				<institution>Национальный исследовательский технологический университет МИСиС</institution>
			</aff>
			<aff id="aff-2">
				<institution-wrap>
					<institution-id institution-id-type="ROR">https://ror.org/019vsm959</institution-id>
					<institution content-type="education">Национальный исследовательский технологический университет МИСиС</institution>
				</institution-wrap>
			</aff>
			<pub-date publication-format="electronic" date-type="pub" iso-8601-date="2025-12-17">
				<day>17</day>
				<month>12</month>
				<year>2025</year>
			</pub-date>
			<pub-date pub-type="collection">
				<year>2025</year>
			</pub-date>
			<volume>10</volume>
			<issue>162</issue>
			<fpage>1</fpage>
			<lpage>10</lpage>
			<history>
				<date date-type="received" iso-8601-date="2025-11-23">
					<day>23</day>
					<month>11</month>
					<year>2025</year>
				</date>
				<date date-type="accepted" iso-8601-date="2025-12-12">
					<day>12</day>
					<month>12</month>
					<year>2025</year>
				</date>
			</history>
			<permissions>
				<copyright-statement>Copyright: &amp;#x00A9; 2022 The Author(s)</copyright-statement>
				<copyright-year>2022</copyright-year>
				<license license-type="open-access" xlink:href="http://creativecommons.org/licenses/by/4.0/">
					<license-p>
						This is an open-access article distributed under the terms of the Creative Commons Attribution 4.0 International License (CC-BY 4.0), which permits unrestricted use, distribution, and reproduction in any medium, provided the original author and source are credited. See 
						<uri xlink:href="http://creativecommons.org/licenses/by/4.0/">http://creativecommons.org/licenses/by/4.0/</uri>
					</license-p>
					.
				</license>
			</permissions>
			<self-uri xlink:href="https://research-journal.org/archive/12-162-2025-december/10.60797/IRJ.2025.162.81"/>
			<abstract>
				<p>Объектом исследования является процесс сбора и анализа вычислительных метрик Apache Spark-приложений в условиях обработки больших объемов данных на кластерах. Целью работы является разработка и обоснование архитектуры системы сбора, передачи и хранения метрик использования вычислительных ресурсов Spark-приложений для последующего анализа и поддержки оптимизации их конфигураций. В работе проанализированы существующие подходы к мониторингу Spark-приложений и сформулированы требования к системе сбора метрик в условиях промышленного кластера. Сформирован минимально достаточный набор метрик, отражающих ключевые аспекты поведения приложений и загрузки ресурсов. Предложено архитектурное решение, включающее использование GraphiteSink, Logstash, Kafka и ClickHouse, позволяющее реализовать интервальный сбор метрик с шагом 10 секунд. Проведена опытная эксплуатация системы в условиях реального вычислительного кластера, подтвердившая её надежность, масштабируемость и применимость для промышленных задач. Представленная система может служить основой для оптимизации распределенных вычислений.</p>
			</abstract>
			<kwd-group>
				<kwd>Apache Spark</kwd>
				<kwd> утилизация ресурсов</kwd>
				<kwd> большие данные</kwd>
				<kwd> система мониторинга</kwd>
				<kwd> метрики</kwd>
			</kwd-group>
		</article-meta>
	</front>
	<body>
		<sec>
			<title>HTML-content</title>
			<p>1. Введение</p>
			<p>С ростом объемов данных в различных областях по данным IDC на 2025 [1], их обработка становится все более важной частью современных информационных систем. По оценкам IDC, общий объем данных в мире достигнет 175 зеттабайт к концу 2025 году, по сравнению с 33 ЗБ в 2018 году [2]. Сокращение времени обработки, минимизация накладных расходов может быть достигнута путем эффективного использования вычислительных ресурсов приложений, работающих в рамках кластеров. Apache Spark — это унифицированный вычислительный движок и набор библиотек для массовой параллельной обработки данных на компьютерных кластерах. Spark поддерживает несколько широко используемых языков программирования (Python, Java, Scala и R), включает библиотеки для различных задач, обеспечивает выполнение SQL запросов, потоковою обработку данных, а также используется в рамках машинного обучения. Несмотря на развитые механизмы параллельных вычислений, обеспечение эффективного использования ресурсов остается одной из наиболее распространенных проблем в Spark-приложениях, что рассмотрено в статье [3]. Неправильная настройка используемых ресурсов приложениями может привести к значительной деградации производительности, увеличению времени выполнения как самого приложения, так и других приложений, работающие на кластере. Совокупное влияние перечисленных факторов способствует увеличению инфраструктурных затрат и снижению общей эффективности эксплуатации вычислительных ресурсов. </p>
			<p>Для решения задачи оптимизации используемых ресурсов приложениями Spark на кластере требуется получать достоверную информацию о нагрузке на систему и о количестве потребляемых ресурсов. Формирование устойчивого и масштабируемого подхода к сбору и структуризации метрик представляет собой ключевую задачу при работе с большими объемами данных. </p>
			<p>Цель данной работы состоит в разработке и обосновании архитектуры системы сбора, передачи и хранения вычислительных метрик Apache Spark-приложений в кластерной среде для последующего анализа и оптимизации использования ресурсов. </p>
			<p>Для достижения поставленной цели требуется решить следующие задачи: </p>
			<p>- определить минимально необходимый набор метрик, отражающих поведение Spark-приложений и использование ресурсов; </p>
			<p>- выполнить анализ существующих методов и инструментов мониторинга Spark-приложений с точки зрения применимости в условиях высоконагруженных кластеров; </p>
			<p>- разработать архитектуру системы сбора метрик; </p>
			<p>- провести промышленную проверку архитектуры, включая анализ зависимости между частотой сбора метрик и точностью анализа, выбрав компонентов системы (источник метрик, протокол передачи, брокер сообщений, СУБД для хранения) с учетом ограничений на нагрузку и масштаб кластера.</p>
			<p>Объектом исследования является процесс мониторинга вычислительных характеристик Spark-приложений в распределенных средах. Предметом исследования выступают методы сбора, передачи и хранения вычислительных метаданных с целью их последующего использования для оптимизации выполнения приложений и управления ресурсами. </p>
			<p>2. Методы и принципы исследования</p>
			<p>2.1. Определение необходимого набора метрик </p>
			<p>Для полноценного анализа методов сбора метрик, необходимо определить их минимально достаточный набор, обеспечивающий репрезентативную оценку поведения Spark-приложений и использования ресурсов вычислительного кластера. </p>
			<p>Apache Spark представляет собой распределенную платформу обработки данных, основанную на модели RDD. Все вычисления над данными производятся на процессоре, с хранением промежуточных результатов вычислений в оперативной памяти. Ключевой особенностью Spark является его ленивая модель вычислений: операции над данными не выполняются в момент вызова. На этапе планирования Spark разбивает всю цепочку вычислений на стадии, каждая из которых состоит из параллельно исполняемых задач. Задачи, в свою очередь, могут быть запущены на различных исполнителях, которые расположены на разных узлах кластера. Несмотря на масштабируемость, данная модель порождает ряд существенных проблем: </p>
			<p>Наличие повторных трансформаций, кэширование больших объемов данных, неоптимальные стратегии соединений, неверные параметры shuffle — все это приводит к неоптимальному расходу ресурсов и замедлению работы приложений [4], [5]; </p>
			<p>Неправильно выбранные параметры приложений приводят либо к переутилизации отдельных исполнителей, что влечет за собой снижение скорости обработки данных [6], либо к простою больших объемов ресурсов, что приводит к неоправданному увеличению эксплуатационных затрат на инфраструктуру; </p>
			<p>Избыточная нагрузка на систему хранения данных [5]. </p>
			<p>Исходя из представленных проблем, необходимо собирать информацию об использовании оперативной памяти, утилизации NameNode кластера, а также о spill данных в память и на диск. Согласно статье [7] в Spark 3.0 были существенно расширены средства мониторинга памяти, что дает возможность наиболее полного и детального анализа утилизации ресурсов приложениями: введены новые метрики, позволяющие отслеживать использование heap и off-heap памяти на уровне исполнителей и задач, а также события disk spill, в случае нехватки оперативной памяти, что критично для оптимизации ресурсоемких приложений.</p>
			<p>Согласно официальной документации Spark [8], при работе приложений Spark автоматически собирает и публикует более 100 различных метрик, охватывающих уровни задач (task), стадий (stage), исполнителей (executor), драйвера (driver) и JVM. Для решения обозначенных в работе проблем были выделены и классифицированы пять ключевых категорий метрик, охватывающих наиболее критичные аспекты производительности Spark-приложений. </p>
			<p>В Spark 3.0 добавлены точные метрики для мониторинга heap и off-heap памяти (memory.OnHeapStorageMemory, memory.OffHeapStorageMemory и др.), а также динамики использования памяти в JVM (jvm.heap.used, jvm.non-heap.used). Эти показатели позволяют своевременно выявлять утечки памяти, избыточное кэширование и неэффективные конфигурации выделяемой оперативной памяти. </p>
			<p>Метрики memoryBytesSpilled и diskBytesSpilled фиксируют моменты, когда данные не помещаются в память и вынужденно сбрасываются на диск (disk spill). Это позволяет выявлять узкие места в конфигурации памяти при выполнении shuffle, join и sort операций и избегать дорогостоящих I/O-операций. </p>
			<p>Метрики filesystem.hdfs.read_bytes, filesystem.hdfs.read_ops, filesystem.hdfs.write_bytes, filesystem.hdfs.write_ops позволяют оценить объем данных, проходящих через задачи и стадии. Эти данные используются для оценки влияния на файловое хранилище. Позволяют выявлять чрезмерную нагрузку на файловую систему при работе с большими объемами данных. </p>
			<p>Метрики shuffleReadMetrics и shuffleWriteMetrics фиксируют объемы и распределение данных между узлами, включая долю локальных и удаленных блоков. Они критически важны для анализа распределения нагрузки и выбора оптимальной стратегии операции join. </p>
			<p>Метрики task.executorRunTime, task.executorCpuTime, task.jvmGCTime, task.duration, task.peakExecutionMemory позволяют определить узкие места на уровне отдельных задач, исправить неравномерная нагрузка между исполнителями, ускорить долгие задачи, снизить перерасход CPU и время на ожидание ресурсов.</p>
			<p>В рамках данного исследования необходимо определить в каждой группе минимальный набор базовых метрик, достаточный для: </p>
			<p>- оценки загрузки ресурса; </p>
			<p>- диагностики типовых проблем, таких как spill, data skew, перегруз памяти/GC [4]. </p>
			<p>Подобный подход соответствует практике работ по подстройке параметров для повышения быстродействия процессов, где для построения моделей производительности и автонастройки конфигураций выбирается ограниченный набор наиболее информативных параметров, покрывающих ресурсы CPU, памяти и диска [9]. </p>
			<p>В результате из исходного множества метрик был сформирован минимально достаточный набор из 35 показателей, список которых приведён в табл. 1. Данный набор обеспечивает покрытие всех выделенных ресурсов и стадий выполнения приложений и служит основой для дальнейшего анализа и визуализации производительности Spark-приложений. Расширение набора за счёт дополнительных счётчиков, дублирующих информацию по смыслу, было признано нецелесообразным с точки зрения объёма хранимых данных и сложности последующей обработки. </p>
			<table-wrap id="T1">
				<label>Table 1</label>
				<caption>
					<p>Ключевые метрики мониторинга нагрузки Spark-приложения </p>
				</caption>
				<table>
					<tr>
						<td>Категория </td>
						<td>Метрика </td>
						<td>Описание </td>
					</tr>
					<tr>
						<td>Использование памяти </td>
						<td>jvm.heap.used </td>
						<td>Объем используемой heap-памяти JVM </td>
					</tr>
					<tr>
						<td>jvm.heap.committed </td>
						<td>Объем выделенной heap-памяти JVM </td>
					</tr>
					<tr>
						<td>jvm.heap.max </td>
						<td>Максимально доступный объем heap-памяти JVM </td>
					</tr>
					<tr>
						<td>jvm.non-heap.used </td>
						<td>Объем используемой non-heap памяти JVM </td>
					</tr>
					<tr>
						<td>jvm.non-heap.committed </td>
						<td>Объем выделенной non-heap памяти JVM </td>
					</tr>
					<tr>
						<td>jvm.non-heap.max </td>
						<td>Максимально доступный объем non-heap памяти JVM </td>
					</tr>
					<tr>
						<td>ExecutorMetrics.OnHeapStorageMemory </td>
						<td>Используемая on-heap память для хранения данных </td>
					</tr>
					<tr>
						<td>ExecutorMetrics.OffHeapStorageMemory </td>
						<td>Используемая off-heap память для хранения данных </td>
					</tr>
					<tr>
						<td>ExecutorMetrics.OnHeapExecutionMemory </td>
						<td>Общий объем on-heap памяти для хранения </td>
					</tr>
					<tr>
						<td>ExecutorMetrics.OffHeapExecutionMemory </td>
						<td>Общий объем off-heap памяти для хранения </td>
					</tr>
					<tr>
						<td>Spill </td>
						<td>executor.memoryBytesSpilled.count </td>
						<td>Объем данных, сброшенных из памяти на диск на уровне executor </td>
					</tr>
					<tr>
						<td>executor.diskBytesSpilled.count </td>
						<td>Объем данных, сброшенных на диск на уровне executor </td>
					</tr>
					<tr>
						<td>task.memoryBytesSpilled.count </td>
						<td>Объем данных, сброшенных из памяти на диск на уровне задачи </td>
					</tr>
					<tr>
						<td>task.diskBytesSpilled.count </td>
						<td>Объем данных, сброшенных на диск на уровне задачи </td>
					</tr>
					<tr>
						<td>Ввод/вывод </td>
						<td>executor.filesystem.hdfs.largeRead_ops </td>
						<td>Количество больших операций чтения данных executor из hdfs </td>
					</tr>
					<tr>
						<td>executor.filesystem.hdfs.read_bytes </td>
						<td>Объем данных, прочитанных executor из hdfs </td>
					</tr>
					<tr>
						<td>executor.filesystem.hdfs.read_ops </td>
						<td>Количество операций чтения данных executor из hdfs </td>
					</tr>
					<tr>
						<td>executor.filesystem.hdfs.write_bytes </td>
						<td>Объем данных, записанных executor из hdfs </td>
					</tr>
					<tr>
						<td>executor.filesystem.hdfs.write_ops </td>
						<td>Количество операций записи данных executor из hdfs </td>
					</tr>
					<tr>
						<td>task.outputMetrics.bytesWritten </td>
						<td>Объем данных, записанных задачей </td>
					</tr>
					<tr>
						<td>Задачи </td>
						<td>task.duration </td>
						<td>Продолжительность выполнения задачи </td>
					</tr>
					<tr>
						<td>task.jvmGCTime </td>
						<td>Время на сборку мусора во время выполнения задачи </td>
					</tr>
					<tr>
						<td>task.resultSize </td>
						<td>Размер результата задачи </td>
					</tr>
					<tr>
						<td>task.executorRunTime </td>
						<td>Время выполнения задачи на executor </td>
					</tr>
					<tr>
						<td>task.executorCpuTime </td>
						<td>Время использования CPU задачей </td>
					</tr>
					<tr>
						<td>task.peakExecutionMemory </td>
						<td>Пиковое использование памяти задачей </td>
					</tr>
					<tr>
						<td>Shuffle-чтение </td>
						<td>shuffleReadMetrics.totalBlocksFetched </td>
						<td>Количество блоков, полученных в shuffle-чтении </td>
					</tr>
					<tr>
						<td>shuffleReadMetrics.localBlocksFetched </td>
						<td>Локальные блоки, полученные в shuffle-чтении </td>
					</tr>
					<tr>
						<td>shuffleReadMetrics.remoteBlocksFetched </td>
						<td>Удаленные блоки, полученные в shuffle-чтении </td>
					</tr>
					<tr>
						<td>shuffleReadMetrics.totalBytesRead </td>
						<td>Общий объем байт, прочитанных в shuffle-чтении </td>
					</tr>
					<tr>
						<td>shuffleReadMetrics.localBytesRead </td>
						<td>Объем байт, прочитанных локально в shuffle-чтении </td>
					</tr>
					<tr>
						<td>shuffleReadMetrics.remoteBytesRead </td>
						<td>Объем байт, прочитанных удаленно в shuffle-чтении </td>
					</tr>
					<tr>
						<td>shuffleWriteMetrics.bytesWritten </td>
						<td>Объем байт, записанных в shuffle-записи </td>
					</tr>
					<tr>
						<td>shuffleWriteMetrics.recordsWritten </td>
						<td>Количество записей, записанных в shuffle-записи </td>
					</tr>
					<tr>
						<td>shuffleWriteMetrics.writeTime </td>
						<td>Время записи в shuffle (в наносекундах) </td>
					</tr>
				</table>
			</table-wrap>
			<p>2.2. Анализ существующих решений </p>
			<p>Современные исследования в области мониторинга Apache Spark-приложений охватывают широкий спектр решений — от базовых инструментов визуализации (Spark UI, Ganglia) до комплексных систем потоковой аналитики на базе Prometheus, Kafka и Grafana [10], [11]. Вместе с тем, подобные решения зачастую не адаптированы к промышленной эксплуатации в высоконагруженных кластерах, что отмечается в работе [12]. Кроме того, в литературе слабо представлены вопросы агрегации и оптимизации хранения метрик в условиях высокой частоты сбора. По данным «ieeexplore» на 2025 год, по ключевым словам, «Spark», «Memory» и «Optimization» было найдено 5 релевантных статей выпущенных позднее 2020 года. </p>
			<p>Для построения архитектуры введем требования к высоконагруженной системе: </p>
			<p>- Масштабируемость. Возможность горизонтального расширения как всей системы, так и отдельных ее компонент.</p>
			<p>- Доступность. Обеспечивать непрерывность работы системы с минимальным временем простоя.</p>
			<p>- Минимальная нагрузка. Иметь минимальное влияние на вычислительные процессы кластера, включая в себя необходимость поддержания сложной внешней инфраструктуры. </p>
			<p>В данной работе сделан акцент на построении отказоустойчивой архитектуры с минимальной нагрузкой на вычислительные ресурсы кластера, что позволяет восполнить существующий пробел между теоретическими разработками и практическими потребностями промышленной эксплуатации Spark-приложений. </p>
			<p>В рамках дальнейшего анализа предлагаю следующую систему классов источников получения метрик от Spark-приложений: </p>
			<p>- Spark UI; </p>
			<p>- Listener; </p>
			<p>- Встроенные в Spark коннекторы. </p>
			<p>Первым классом источников является Spark UI, а также Spark Rest API. Они представляют агрегированные сведения, включая длительность стадий, объемы обрабатываемых данных и уровень загруженности ресурсов. Данный подход предоставляет обобщенную картину без разбивки по интервалам времени, что является минусом при анализе утилизации ресурсов приложениями. В свою очередь, вычисления в рамках Spark-приложений характеризуются тем, что могут динамически изменять используемые ресурсы в пределах выделенного пользователем максимального их объема. </p>
			<p>Следующий класс источников основывается на отдельном сопроцессе Listener в рамках основного Spark-приложения. Пользователь может как реализовать свой сопроцесс позволяющий проводить операции по сбору и отправке метрик в систему потребитель, так и в самом Spark уже есть встроенный EventLoggingListener, сохраняющий всю информацию о событиях выполнения приложения: задания, стадии, задачи, операции ввода-вывода, использование памяти и другие параметры. Такой подход позволяет анализировать использование различных операций и их влияние на ресурсоемкость выполнения [3]. Обработка Event Log в таком случае выполняется внешним инструментом. Существуют готовые решения, которые позволяют получать метрики, считаемые автоматически Spark-приложениями. Например, использование PrometheusServletSink в таких решениях описано в [11], [13]. Он занимается обработкой Event Log сообщений после завершения работы приложения. Представляет собой готовое решение, которое выполняет собственный анализ и выводит результат пользователю в виде UI представления. Но требует отдельной инфраструктуры, плохо ложится на существующий on-prem стек, ориентирован на Kubernetes-окружение [11], [13].</p>
			<p>Еще одним инструментом сбора метрик являются реализованные в Apache Spark коннекторы для отправки. Они заменяют требующие собственной реализации Listener, а также позволяют реализовать анализ приложения уже во время его работы, посредством выгрузки уже посчитанных Spark`ом метрик в систему потребитель. Настройка интеграции сводится к заданию двух конфигурационных параметров в Spark-приложении и не предполагает необходимость развертывания дополнительной инфраструктуры, обладающей высокой степенью сложности, в отличие от готовых систем мониторинга на основе Event Log. Сводный обзор методов оформлен в виде таблицы 2. </p>
			<table-wrap id="T2">
				<label>Table 2</label>
				<caption>
					<p>Сводное сравнение подходов сбора метрик Spark-приложений</p>
				</caption>
				<table>
					<tr>
						<td>Подход </td>
						<td>Уровень детализации </td>
						<td>Нагрузка на систему </td>
						<td>Гибкость настройки </td>
						<td>Требования к инфраструктуре </td>
					</tr>
					<tr>
						<td>Spark UI / Spark Rest API </td>
						<td>Низкий </td>
						<td>Низкая </td>
						<td>Низкая </td>
						<td>Инфраструктура хранения, сервис сбора метрик </td>
					</tr>
					<tr>
						<td>Listener </td>
						<td>Высокий </td>
						<td>Средняя </td>
						<td>Высокая </td>
						<td>Инфраструктура хранения, требуется реализация слушателя и подключение ко всем приложениям </td>
					</tr>
					<tr>
						<td>Встроенный Connector </td>
						<td>Высокий </td>
						<td>Низкая </td>
						<td>Средняя </td>
						<td>Требуется инфраструктура для приема и хранения </td>
					</tr>
				</table>
			</table-wrap>
			<p>2.3. Методика и архитектура предлагаемого подхода </p>
			<p>Выбор конкретного способа сбора и отправки метрик зависит от объема метрик, количества узлов, ядер на каждом узле, объемов оперативной памяти каждого узла кластера, а также от количества работающих Spark-приложений. Введем характеристики кластера: </p>
			<p>- 200 узлов, с характеристиками 100 Гб оперативной памяти и 20 ядер на каждом; </p>
			<p>- ежедневная работа минимум 3000 Spark-приложений. </p>
			<p>Совокупный объем данных определяется частотой сбора метрик и размерностью результирующего набора параметров. Наиболее сбалансированным решением представляется интервальных сбор метрик с приложения, ввиду отсутствия реактивных вычислений и для снижения нагрузки как на само приложение, так и на систему приемщик. Эмпирические исследования показывают, что оптимизация частоты сбора напрямую влияет на нагрузку системы хранения [12]. Возможность интервального сбора реализована как во встроенных коннекторах Spark, так и при использовании пользовательских Listener-компонентов. Наиболее оптимальным в базовом ключе является готовый коннектор Spark, так как не требует никаких доработок со стороны приложений и кластера. Использование Listener предполагает разработку отдельного механизма сбора и маршрутизации метрик, а также является инфраструктурно ограниченным — его требуется подключить ко всем приложениям кластера. В рамках предлагаемого решения использовался метод интервального сбора метрик с шагом 10 секунд посредством GraphiteSink. Интервал в 10 секунд между отправками, был выбран экспериментальным путем, результаты чего представлены на рисунке 1. Он позволяет соблюсти баланс между упущенными релевантными метриками и объемом отправляемых метрик из Spark-приложений, который растет линейно в зависимости от частоты.</p>
			<fig id="F1">
				<label>Figure 1</label>
				<caption>
					<p>Зависимость пропущенных релевантных метрик от частоты отправки из Spark-приложения</p>
				</caption>
				<alt-text>Зависимость пропущенных релевантных метрик от частоты отправки из Spark-приложения</alt-text>
				<graphic ns0:href="/media/images/2025-11-21/7786ed50-27bb-4d8e-a4f5-3d40866b5a94.png"/>
			</fig>
			<p>В базовом сценарии взаимодействия с данным коннектором требуется развернутый Graphite, что является слишком дорогим в эксплуатации за счет большого объема дискового пространства необходимого для Graphite в рамках кластера с большими объемами данных. Поэтому требуется потребитель, способный выдерживать большой объем хранимых логов в рамках кластера. Из вариантов можно рассмотреть хранение в HDFS и Clickhouse. HDFS недостаточно эффективен в контексте рассматриваемой архитектуры, так как под каждую метрику будет требовать создания отдельного файла, что может вызвать деградацию производительности или сбои в функционировании кластера. Либо же для использования потребуется создание дополнительного процесса, который будет сжимать несколько отдельных файлов и сохранять их в единый файл большего объема. Данный подход сопряжён с рядом архитектурных ограничений, снижающих его применимость в производственных условиях:</p>
			<p>- на промежуточном этапе неизбежно образуется значительное число мелких файлов; </p>
			<p>- дополнительные вычислительные ресурсы на работу потока; </p>
			<p>- недоступность данных на время перезаписи. </p>
			<p>Указанные ограничения существенно снижают применимость HDFS в качестве системы хранения метрик в рассматриваемом сценарии. </p>
			<p>Clickhouse представляет собой более предпочтительное решение с точки зрения производительности и устойчивости хранения. Примеры успешного применения ClickHouse для потоковой аналитики приведены в [14], [15]. Учитывая значительное количество метрик и характерную стабильность их значений на протяжении фиксированных временных интервалов, требуется реализация механизма агрегации, позволяющего эффективно минимизировать объём сохраняемой информации, в результате чего повторяющиеся значения агрегируются в единственное представление в пределах заданного окна, на котором они имеют эффект. Для реализации агрегации применяется движок AggregatingMergeTree, обеспечивающий свёртку всех строк с одинаковыми ключами в единую запись, представляющую агрегированное состояние по заданным функциям в пределах одного сегмента данных. Такой подход способствует сокращению объема хранимых данных и снижению нагрузки на систему визуализации. </p>
			<p>Последним элементом, который необходимо выбрать — это система передачи данных от Spark-приложения к системе хранения данных. В GraphiteSink отсутствует возможность прямой интеграции с ClickHouse по стандартным интерфейсам передачи данных. Коннектор поддерживает передачу метрик по протоколу UDP в систему, которая имеет возможность принимать такого вида сообщения. Наиболее используемыми такими инструментами являются Logstash [16] и Ni-Fi. Ni-Fi требует больших вычислительных ресурсов и является кластерным решением, характеризующимся высокой сложностью развертывания и сопровождения. Logstash представляет собой легковесное решение для маршрутизации и трансформации потоков данных между компонентами распределенной системы. В контексте рассматриваемой архитектуры данный инструмент обеспечивает оптимальный баланс между производительностью и гибкостью настройки. При этом Logstash требует наличия приёмника данных. Возможна прямая запись в ClickHouse, однако такой подход не обеспечивает необходимого уровня отказоустойчивости из-за потенциальной недоступности ClickHouse в периоды обслуживания или при пиковых нагрузках. Потеря метрик в подобной конфигурации приведёт к нарушению целостности исторических данных, что может привести к снижению достоверности и полноты последующего анализа метрик. Необходимо использовать брокер для минимизации недоступности, а также для дальнейшей балансировки нагрузки при записи в Clickhouse. Для задач в области обработки больших данных целесообразно применение Kafka, зарекомендовавшей себя как промышленный стандарт брокеров сообщений. </p>
			<p>В результате сформирована следующая архитектура системы: </p>
			<p>- Spark-приложение — в режиме выполнения вычислений считает метрики использования ресурсов, а также метрик о сути вычислений; </p>
			<p>- GraphiteSink — встроенный подпроцесс в Spark, позволяющий экспортировать метрики во внешнюю систему, в данном случае по протоколу UDP; </p>
			<p>- Logstash — инструмент для маршрутизации и преобразования сообщений между источниками и приемниками данных; </p>
			<p>- Kafka — брокер сообщений, для балансировки нагрузки и минимизации риска неуспешности вставки данных; </p>
			<p>- AggregatingMergeTree Clickhouse – база данных для хранения метрик, для дальнейшего анализа и визуализации. </p>
			<p>Взаимодействие в рамках архитектуры системы представлено на рисунке 2. </p>
			<fig id="F2">
				<label>Figure 2</label>
				<caption>
					<p>Архитектура системы сбора и хранения метрик</p>
				</caption>
				<alt-text>Архитектура системы сбора и хранения метрик</alt-text>
				<graphic ns0:href="/media/images/2025-11-21/1bdbf039-8873-4194-9dbb-fc385c835ac3.png"/>
			</fig>
			<p>3. Оценка эффективности и практическая применимость</p>
			<p>В целях верификации работоспособности и оценки применимости разработанной архитектуры была проведена её опытная эксплуатация в условиях реального кластера, включающего 200 вычислительных узлов, каждый из которых обладает 100 Гб оперативной памяти и 20 вычислительными ядрами. Система использовалась в течение рабочего дня при запуске более 3000 Spark-приложений, функционирующих в рамках типичной загрузки производственной среды. </p>
			<p>Сбор метрик осуществлялся с использованием встроенного коннектора GraphiteSink с интервалом в 10 секунд. Передача данных происходила через Logstash с маршрутизацией через Kafka в ClickHouse, где происходила агрегация и долговременное хранение информации с использованием движка AggregatingMergeTree. </p>
			<p>Результаты эксперимента были представлены в виде интерактивных дашбордов, включающих ключевые метрики: </p>
			<p>- Executor HDFS reads / writes — отображают динамику операций чтения и записи с HDFS в разрезе по исполнителям, отражая фрагментированную и конкурентную нагрузку на систему хранения, представлены на рисунке 3; </p>
			<p>- HDFS Read Rate — демонстрирует пиковые значения пропускной способности при интенсивной фазе чтения, что позволяет выявлять узкие места в I/O, также представлены на рисунке 3; </p>
			<p>- Executor Heap Usage / Driver Heap Usage — позволяют анализировать использование кучи в динамике, как на уровне отдельных исполнителей, так и на уровне управляющего драйвера и представлены на рисунке 4.</p>
			<fig id="F3">
				<label>Figure 3</label>
				<caption>
					<p>Визуализация метрик input-output операций случайного приложения</p>
				</caption>
				<alt-text>Визуализация метрик input-output операций случайного приложения</alt-text>
				<graphic ns0:href="/media/images/2025-11-24/5d5c07c0-7a6b-422b-b5bf-74dd06623d4e.png"/>
			</fig>
			<fig id="F4">
				<label>Figure 4</label>
				<caption>
					<p>Визуализация метрик утилизации оперативной памяти случайного приложения</p>
				</caption>
				<alt-text>Визуализация метрик утилизации оперативной памяти случайного приложения</alt-text>
				<graphic ns0:href="/media/images/2025-11-24/662e1b9d-13cf-4ac0-9515-61d5c824f657.png"/>
			</fig>
			<p>Представленные графики демонстрируют корректную работу системы мониторинга: данные поступают с заданной частотой, покрывают ключевые аспекты поведения приложений и инфраструктуры, а также отображаются в удобной для анализа форме. Максимальные зафиксированные значения использования памяти (12.3 GiB для исполнителей и 1.20 GiB для драйвера) подтверждают возможность мониторинга ресурсоемких задач. </p>
			<p>Практическая применимость разработанного решения подтверждается следующими наблюдениями: </p>
			<p>- стабильная работа при высокой интенсивности поступления метрик (свыше 3000 приложений в сутки); </p>
			<p>- снижение числа утраченных метрик за счет использования промежуточного брокера Kafka; </p>
			<p>- повышению эффективности визуального анализа благодаря предварительной агрегации данных в ClickHouse и интеграции с системой визуализации. </p>
			<p>Таким образом, разработанная архитектура демонстрирует высокую степень масштабируемости, устойчивость к нагрузке и пригодность для внедрения в промышленные системы мониторинга вычислительных процессов. Полученные результаты также создают предпосылки для построения надстройки в виде рекомендательной системы по оптимизации параметров Spark-приложений на основе анализа собранных вычислительных метаданных.</p>
			<p>4. Заключение</p>
			<p>В данной работе рассмотрена проблема оптимизации использования вычислительных ресурсов в Apache Spark-приложениях при обработке больших объемов данных в условиях кластерных вычислений. На основе анализа существующих решений в области мониторинга и анализа вычислительных метрик предложена интегрированная архитектура сбора, передачи и хранения метаинформации о вычислениях, направленная на повышение эффективности эксплуатации кластерных ресурсов. </p>
			<p>Научная новизна исследования заключается в следующем: </p>
			<p>- обоснован выбор метрик, отражающих ключевые характеристики ресурсопотребления и поведенческой логики Spark-приложений, включая информацию о DAG, spill, утилизацию памяти и узлов кластера; </p>
			<p>- предложена архитектура отказоустойчивой системы сбора метрик с минимальной нагрузкой на вычислительные ресурсы кластера с использованием GraphiteSink и Logstash с маршрутизацией через Kafka в ClickHouse, что обеспечивает надежность, отказоустойчивость и масштабируемость системы; </p>
			<p>- экспериментально определен и обоснован оптимальный интервал сбора метрик (10 секунд), обеспечивающий баланс между точностью наблюдений и снижением нагрузки на инфраструктуру хранения. </p>
			<p>Реализация предложенной архитектуры позволяет сформировать устойчивую систему мониторинга и анализа, пригодную для интеграции в среду промышленных кластеров с высокой интенсивностью выполнения приложений. Система обеспечивает не только сбор, но и структурированное представление данных, пригодное для последующего автоматического анализа и визуализации. </p>
			<p>В то же время работа имеет ряд ограничений, которые необходимо учитывать при дальнейшем развитии: </p>
			<p>- в рамках исследования не проводилось формализованное сравнение производительности предложенного решения с существующими промышленными реализациями (например, Prometheus + Thanos); </p>
			<p>- система предполагает единый протокол передачи метрик (UDP), что может потребовать дополнительных мер по обеспечению надежности при масштабировании; </p>
			<p>- архитектура ориентирована на статический набор метрик и требует ручного обновления при изменении требований к мониторингу; </p>
			<p>- агрегирование метрик на стороне ClickHouse требует тонкой настройки для конкретных сценариев анализа, особенно при построении сложных витрин. </p>
			<p>В дальнейшем данную систему сбора и хранения метрик вычислений Spark-приложений можно будет использовать для построения систем автоматизированного анализа производительности Spark-приложений и принятия решений по их настройке. </p>
			<p>Таким образом, представленная система может быть рассмотрена как универсальная основа для создания интеллектуальной инфраструктуры мониторинга и оптимизации вычислительных процессов в распределенных средах. </p>
		</sec>
		<sec sec-type="supplementary-material">
			<title>Additional File</title>
			<p>The additional file for this article can be found as follows:</p>
			<supplementary-material xmlns:xlink="http://www.w3.org/1999/xlink" id="S1" xlink:href="https://doi.org/10.5334/cpsy.78.s1">
				<!--[<inline-supplementary-material xlink:title="local_file" xlink:href="https://research-journal.org/media/articles/22470.docx">22470.docx</inline-supplementary-material>]-->
				<!--[<inline-supplementary-material xlink:title="local_file" xlink:href="https://research-journal.org/media/articles/22470.pdf">22470.pdf</inline-supplementary-material>]-->
				<label>Online Supplementary Material</label>
				<caption>
					<p>
						Further description of analytic pipeline and patient demographic information. DOI:
						<italic>
							<uri>https://doi.org/10.60797/IRJ.2025.162.81</uri>
						</italic>
					</p>
				</caption>
			</supplementary-material>
		</sec>
	</body>
	<back>
		<ack>
			<title>Acknowledgements</title>
			<p/>
		</ack>
		<sec>
			<title>Competing Interests</title>
			<p/>
		</sec>
		<ref-list>
			<ref id="B1">
				<label>1</label>
				<mixed-citation publication-type="confproc">Большие данные (Big Data) мировой рынок // Tadviser. — 2025. — URL: https://clck.ru/3Qsj4R (дата обращения: 18.10.25)</mixed-citation>
			</ref>
			<ref id="B2">
				<label>2</label>
				<mixed-citation publication-type="confproc">IDC: Expect 175 zettabytes of data worldwide by 2025 // Virstor. — 2025 — URL: https://virstor.co.uk/idc-data-growth-predictions/ (дата обращения: 27.09.2025) [in English]</mixed-citation>
			</ref>
			<ref id="B3">
				<label>3</label>
				<mixed-citation publication-type="confproc">Nicholls B. Benchmarking Resource Usage of Underlying Datatypes of Apache Spark / B. Nicholls, M. Adangwa, R. Estes, H. Iradukunda, Q. Zhang, T. Zhu // arXiv. — 2020. — 2012.04192v1. DOI: 10.48550/arXiv.2012.04192. [in English]</mixed-citation>
			</ref>
			<ref id="B4">
				<label>4</label>
				<mixed-citation publication-type="confproc">Dessokey M.. Memory Management Approaches in Apache Spark: A Review / M. Dessokey, S. Saif, S. Salem, E. Saad // Proceedings of the International Conference on Advanced Intelligent Systems and Informatics; — Вып. 1261. — Cham: Springer, 2020. — с. 394–403. DOI: 10.1007/978-3-030-58669-0_36. [in English]</mixed-citation>
			</ref>
			<ref id="B5">
				<label>5</label>
				<mixed-citation publication-type="confproc">Zhai M.. Query optimization Approach with Shuffle Intermediate Cache Layer for Spark SQL / M. Zhai, A. Song, J. Qiu, X. Ji, Q. Wu // 38th International Performance Computing and Communications Conference (IPCCC); — London: IEEE, 2019. — с. 1–6. DOI: 10.1109/IPCCC47392.2019.8958719. [in English]</mixed-citation>
			</ref>
			<ref id="B6">
				<label>6</label>
				<mixed-citation publication-type="confproc">Chen S.. Optimizing Performance and Computing Resource Management of In-memory Big Data Analytics with Disaggregated Persistent Memory / S. Chen, W. Wang, X. Wu, Z. Fan, K. Huang, P. Zhuang, Y. Li, I. Rodero, M. Parashar, D. Weng // 19th IEEE/ACM International Symposium on Cluster, Cloud and Grid Computing (CCGRID); — Larnaca: IEEE, 2019. — с. 21–30. DOI: 10.1109/CCGRID.2019.00012. [in English]</mixed-citation>
			</ref>
			<ref id="B7">
				<label>7</label>
				<mixed-citation publication-type="confproc">Apache Spark 3.0 Memory Monitoring Improvements // CERN. — 2020 — URL: https://db-blog.web.cern.ch/blog/luca-canali/2020-08-spark3-memory-monitoring (дата обращения: 29.09.2025) [in English]</mixed-citation>
			</ref>
			<ref id="B8">
				<label>8</label>
				<mixed-citation publication-type="confproc">Monitoring and Instrumentation // Apache Spark. — 2025 — URL: https://spark.apache.org/docs/latest/monitoring.html#executor-task-metrics (дата обращения: 23.10.2025) [in English]</mixed-citation>
			</ref>
			<ref id="B9">
				<label>9</label>
				<mixed-citation publication-type="confproc">Li Y. Towards General and Efficient Online Tuning for Spark / Y. Li, H. Jiang, Y. Shen, Y. Fang, X. Yang, D. Huang, X. Zhang, W. Zhang, Ce. Zhang, P. Chen, B. Cui // arXiv. — 2023. — 2309.01901v1. DOI: 10.48550/arXiv.2309.01901. [in English]</mixed-citation>
			</ref>
			<ref id="B10">
				<label>10</label>
				<mixed-citation publication-type="confproc">Castro D. Apache Spark usage and deployment models for scientific computing / D. Castro, P. Kothuri, P. Mrowczynski et al. // EPJ Web Conf. — 2019. — № 214. — 07020. — URL: https://doi.org/10.1051/epjconf/201921407020 (accessed: 02.10.25) — DOI: 10.1051/epjconf/201921407020</mixed-citation>
			</ref>
			<ref id="B11">
				<label>11</label>
				<mixed-citation publication-type="confproc">Bhavya J. Monitoring Apache Spark Metrics with Prometheus / J. Bhavya // Medium. — 2024 — URL: https://medium.com/@bhavya.joshi1901/monitoring-apache-spark-metrics-with-prometheus-a2846fe94028 (дата обращения: 07.10.2025) [in English]</mixed-citation>
			</ref>
			<ref id="B12">
				<label>12</label>
				<mixed-citation publication-type="confproc">Mehdi A. Unleashing the Potential of Grafana: A Comprehensive Study on Real-Time Monitoring and Visualization / A. Mehdi, M. Bali, S. Abbas et al. // 14th International Conference on Computing Communication and Networking Technologies (ICCCNT). — Delhi: Indian Institute of Technology, 2023. — URL: https://clck.ru/3QsjDP (accessed: 07.10.25). — DOI: 10.1109/ICCCNT56998.2023.10306699</mixed-citation>
			</ref>
			<ref id="B13">
				<label>13</label>
				<mixed-citation publication-type="confproc">Molnar B. Monitoring Apache Spark with Prometheus on Kubernetes / B. Molnar // Outshift by Cisco. — 2017 — URL: https://outshift.cisco.com/blog/spark-monitoring (дата обращения: 13.10.2025) [in English]</mixed-citation>
			</ref>
			<ref id="B14">
				<label>14</label>
				<mixed-citation publication-type="confproc">Dahimene R. Real-time data for real-time analytics with Kafka and ClickHouse / R. Dahimene, D. McDiarmid // Confluent. — 2023 — URL: https://www.confluent.io/events/current/2023/real-time-real-time-data-for-real-time-analytics-with-kafka-and-clickhouse/ (дата обращения: 06.10.2025) [in English]</mixed-citation>
			</ref>
			<ref id="B15">
				<label>15</label>
				<mixed-citation publication-type="confproc">Schulze R. ClickHouse - Lightning Fast Analytics for Everyone / R. Schulze, T. Schreiber, I. Yatsishin, R. Dahimene, A. Milovidov // Proceedings of the VLDB Endowment. — 2024. — № 17. DOI: 10.14778/3685800.3685802. [in English]</mixed-citation>
			</ref>
			<ref id="B16">
				<label>16</label>
				<mixed-citation publication-type="confproc">Tokar D.. The IoT Applications Productivity: Data Management Model and ELK Tool Based Monitoring and Research / D. Tokar, O. Morozova, V. Kharchenko // IEEE 16th International Conference on Advanced Trends in Radioelectronics, Telecommunications and Computer Engineering (TCSET); — Lviv-Slavske: IEEE, 2022. — с. 162–167. DOI: 10.1109/TCSET55632.2022.9766930. [in English]</mixed-citation>
			</ref>
		</ref-list>
	</back>
	<fundings/>
</article>