rdd process linux что это
Русские Блоги
Spark Study Notes 2-RDD программирования
1. RDD дизайн фона
В практических приложениях существует много итерационных алгоритмов (таких как машинное обучение, алгоритмы графов и т. Д.) И интерактивных инструментов для извлечения данных.Сходство этих сценариев применения заключается в том, что между различными этапами расчета Повторное использование промежуточных результатов То есть выход одного этапа будет использоваться как вход следующего этапа. Тем не менее, текущийКаркас MapReduce записывает промежуточные результаты в HDFS, Приносит много репликации данных, дискового ввода-вывода и сериализации накладных расходов. Хотя платформы графовых вычислений, такие как Pregel, также хранят результаты в памяти, эти платформы могут поддерживать только некоторые конкретные вычислительные режимы и не обеспечивают общую абстракцию данных. RDD появился, чтобы удовлетворить эту потребность, он предоставляет абстрактную архитектуру данных, нам не нужно беспокоиться о распределенных характеристиках базовых данных, просто выражаем логику конкретного приложения в виде последовательности обработки преобразования,Операции преобразования между различными RDD образуют зависимости, Может быть конвейерным, тем самым избегая хранения промежуточных результатов, значительно сокращая репликацию данных, дисковый ввод-вывод и издержки сериализации.
2. Концепция СДР
Следует отметить, что СДР используетЛенивый механизмТо есть во время выполнения СДР (как показано на рисунке 1), реальный расчет происходит в СДРОперация «Действие»За все до «действия»Операция «конвертировать»Spark записывает только некоторые базовые наборы данных приложения операции «преобразование» и траекторию, сгенерированную СДР, то есть взаимоотношения между ними, без запуска реального расчета.
Рисунок 1: Операции преобразования и действия Spark
Например, на рисунке 2 два RDD, A и C, логически генерируются из входа, и после серии операций «преобразования» логически генерируется F (также RDD). Так что это логично, поскольку в это время расчет не производился, Spark только регистрировал генерацию и зависимость между СДР.Когда F хочет выводить данные, то есть когда F выполняет операцию «действие», Spark сгенерирует DAG на основе зависимостей RDD и начнет реальный расчет с начальной точки.
Рисунок 2: Пример процесса выполнения СДР
Вышеуказанная последовательность обработки называется «кровная связь(Lineage) «, то естьDAG топологическая сортировкарезультат. Используя ленивые вызовы, можно выполнить серию операций RDD, связанных родственными связями (конвейер), избегая ожидания синхронизации данных между несколькими операциями преобразования, и не беспокойтесь о слишком большом количестве промежуточных данных, потому что они имеют родословную крови Операции взаимосвязи передаются по конвейеру. Результаты, полученные одной операцией, не нужно сохранять как промежуточные данные, а непосредственно передавать в следующую операцию для обработки. В то же время, этот метод проектирования конвейерного соединения ряда операций через кровное родство также делает вычисление каждой операции в конвейере относительно простым, обеспечивая единство логики обработки каждой операции, напротив, в MapReduce. Чтобы максимально сократить процесс MapReduce, в одном MapReduce будет написано слишком много сложной логики.
В интерактивной среде pyspark введите следующий код
3. Характеристики СДР
4. Зависимости между СДР
Различные операции в RDD приведут к тому, что разделы в разных RDD будут иметь разные зависимости. Зависимости в СДР делятся на Узкая зависимость (Узкая зависимость) и Широкая зависимость (Широкая зависимость), на рисунке 3 показана разница между двумя зависимостями.
Узкая зависимость показывает, что раздел родительской СДР соответствует разделу дочерней СДР, или раздел нескольких родительских СДР соответствует разделу дочерней СДР;Например, на рисунке 3 (a) RDD1 является родительским RDD RDD2, RDD2 является дочерним RDD, раздел 1 RDD1 соответствует разделу RDD2 (то есть разделу 4), для другого примера RDD6 и RDD7 оба являются родительским RDD RDD8, Раздел в RDD6 (раздел 15) и раздел в RDD7 (раздел 18) соответствуют разделу в RDD8 (раздел 21).
Широкая зависимость проявляется в существовании одного раздела родительского RDD, соответствующего нескольким разделам дочернего RDD.Например, на рисунке 3 (b) RDD9 является родительским RDD RDD12, а раздел 24 в RDD9 соответствует двум разделам в RDD12 (то есть разделу 27 и разделу 28).
Вообще говоря, если раздел родительского RDD используется только разделом дочернего RDD, это узкая зависимость, в противном случае это широкая зависимость. Типичные операции с узкими зависимостями включают map, filter и union. Типичные операции с широкими зависимостями включают groupByKey и sortByKey. Для операций соединения есть два случая.
(1) Совместное разделение входных данных относится к узкой зависимости (как показано в (a)). Так называемое разделение (разделение на части) относится ко всем «ключам» раздела нескольких родительских RDD, которые попадают в один и тот же раздел дочернего RDD, и не создает раздел одного и того же родительского RDD. В случае двух разделов ребенка RDD.
(2) Некооперативное разделение входных данных относится к широкой зависимости, как показано в (b).
Для узко зависимых СДР все родительские разделы могут быть рассчитаны конвейерным способом, не вызывая смешения данных между сетями. Для СДР с широкой зависимостью это обычно сопровождается операцией Shuffle, то есть сначала необходимо вычислить все данные родительского раздела, а затем между узлами выполняется Shuffle.
Рисунок 3 Разница между узкой и широкой зависимостями
Этот дизайн зависимостей Spark делает его по своей природе отказоустойчивым и значительно увеличивает скорость выполнения Spark. Потому что набор данных RDD запоминает, как он эволюционировал из других RDD через «кровные отношения». Кровные отношения записывают поведение операции грубого преобразования. Когда часть данных раздела RDD потеряна, он может пройти Отношения крови получают достаточно информации для пересчета и восстановления потерянного раздела данных, что повышает производительность. Условно говоря, в двух типах зависимостей восстановление после сбоя в узкой зависимости более эффективно: нужно только пересчитать потерянный раздел на основе родительского раздела RDD (не нужно пересчитывать все разделы), и оно может находиться в разных узлах параллельно. Пересчитать. Для широких зависимостей сбой одного узла обычно означает, что процесс пересчета будет включать несколько родительских разделов RDD, что является дорогостоящим. Кроме того, Spark также предоставляет контрольные точки данных и ведение журнала для сохранения промежуточных RDD, поэтому вам не нужно возвращаться к начальному этапу при выполнении восстановления после сбоя. Во время восстановления после сбоя Spark сравнивает стоимость контрольных точек данных и стоимость пересчета разделов RDD для автоматического выбора оптимальной стратегии восстановления.
5. Процесс запуска СДР
Посредством вышеприведенного введения в концепции RDD, зависимостей и разделений этапов, в сочетании с базовым процессом работы Spark, представленным ранее, приведено краткое описание процесса работы RDD в архитектуре Spark (как показано на рисунке 9-12):
(1) создать объект RDD;
(2) SparkContext отвечает за расчет зависимостей между RDD и построением DAG;
(3) DAGScheduler отвечает за декомпозицию графа DAG на несколько этапов, каждый этап содержит несколько задач, и каждая задача будет распределена планировщиком задач для каждого рабочего узла (рабочего узла) ) На Исполнителя выполнить.
6. Создание СДР
Создать RDD, загрузив данные из файловой системы
Spark использует метод textFile () для загрузки данных из файловой системы для создания RDD. Этот метод принимает URI файла в качестве параметра. Этот URI может быть адресом локальной файловой системы или адресом распределенной файловой системы HDFS или Amazon S3. Адрес и т. Д.
Далее вернитесь в окно pyspark и посмотрите, как загрузить данные из локальной файловой системы:
Давайте посмотрим, как загрузить данные из файловой системы HDFS и загрузить «/usr/local/spark/mycode/rdd/word.txt» в локальной файловой системе в каталог пользователя hadoop файловой системы HDFS. Затем в окне pyspark вы можете использовать любую из следующих команд для завершения загрузки данных из файловой системы HDFS:
Обратите внимание, что вышеприведенные три команды являются полностью эквивалентными командами, за исключением того, что используются разные форматы каталогов, и вы можете использовать любую из этих команд для завершения операции загрузки данных.
При использовании Spark для чтения файлов необходимо объяснить следующие моменты:
(1) Если используется путь локальной файловой системы, необходимо убедиться, что все рабочие узлы могут также обращаться к файлу по одному и тому же пути. Например, вы можете поместить Файл копируется на каждый рабочий узел, или вы можете использовать сеть для монтирования общей файловой системы.
(2) Входными параметрами метода textFile () могут быть имя файла, каталог или сжатый файл. Например, textFile («/ my / directory»), textFile («/ my / directory /».txt”), and textFile(“/my/directory/.gz”).
(3) Метод textFile () также может принимать второй входной параметр (необязательный), который используется для указания количества разделов. По умолчанию Spark создает раздел для каждого блока HDFS (по умолчанию каждый блок в HDFS составляет 128 МБ). Вы также можете указать значение, большее, чем количество блоков, в качестве количества разделов, но вы не можете указать значение, меньшее, чем количество блоков, в качестве количества разделов.
Создавать RDD из параллельных коллекций (массивов)
Вы можете вызвать метод параллелизации SparkContext, чтобы создать существующую коллекцию (массив) в Driver.
Пожалуйста, работайте в pyspark ниже:
Используйте список выше, чтобы создать. В Python нет базового типа данных для массивов. Для простоты понимания вы можете использовать списки в качестве массивов на других языках.
Операция 7.RDD
После создания СДР во время последующего использования обычно выполняются две операции:
* Перерабатывать (Преобразование): создание нового набора данных на основе существующего набора данных.
* действие (Действие): выполнить операцию с набором данных и вернуть рассчитанное значение.
Операция преобразования
Для СДР каждая операция преобразования будет создавать другой СДР для следующего «преобразования». Преобразованный СДР оценивается лениво, то есть весь процесс преобразования записывает только траекторию преобразования, и никаких реальных вычислений не происходит. Только когда он сталкивается с операциями действия, будут выполняться реальные вычисления, начиная с отношения крови Начиная с источника, выполните физические операции преобразования.
Вот некоторые распространенные операции преобразования (API преобразования):
* filter (func): отфильтровать элементы, которые удовлетворяют функции func, и вернуть новый набор данных
* map (func): передать каждый элемент в функцию func и вернуть результат в виде нового набора данных
* flatMap (func): аналогично map (), но каждый входной элемент может быть сопоставлен с 0 или более выходными результатами
* groupByKey (): при применении к набору данных (K, V) пар ключ-значение возвращается новый (K, Iterable) набор данных
* reduceByKey (func): при применении к набору данных из (K, V) пар ключ-значение возвращается новая (K, V) форма набора данных, каждая из которых имеет значения Передать каждый ключ функции func для агрегации
Операция действия
Ниже приведено введение в базовый API-интерфейс операций RDD:
Без параметров элементы в СДР дедуплицируются
Параметр RDD, найти общие элементы двух RDD
Параметр RDD, удалить те же элементы в исходном RDD и параметр RDD
Параметр RDD, найти декартово произведение двух RDD
Вернуть все элементы СДР
Количество элементов в СДР
Количество вхождений каждого элемента в СДР
Интегрируйте все данные RDD параллельно, например, суммирование
То же, что и функция Reduce, но сгиб имеет начальное значение
То же, что и функция Reduce, но возвращаемый тип данных RDD отличается от исходного RDD
Используйте специальные функции для каждого элемента СДР
Rdd process linux что это
RDD (Resilient Distributed Dataset) – это простая, неизменяемая, распределенная коллекция объектов во фреймворке Apache Spark. RDD представляет собой распределенный набор данных, который делится на множество частей, обрабатывающихся различными узлами в кластере. Наборы РДД могут содержать объекты с любыми типами данных на языках Python, JAVA или Scala [1].
Как устроен RDD: свойства и структура
RDD – это разновидность датасета (простого набора данных), который разделен на множество машин, работающих в кластере.
Структура RDD
RDD имеет следующие свойства:
RDD можно создавать вручную, а можно загружать из внешних источников. Источниками хранения РДД могут служить следующие источники:
Как появился RDD: краткая история Apache Spark
Работа над структурой RDD началась в 2009 году. Это было связано с идеей проекта для распределенной работы с данными – Apache Spark. Таким образом, наборы РДД стали неотъемлемой частью Spark, автором которого является румынско-канадский ученый в области информатики Матей Захария.
В 2010 году проект был опубликован под лицензией BSD (Berkeley Software Distribution), а уже в 2013 году передан фонду Apache и переведен на лицензию Apache 2.0. В 2014 году был принят в число проектов верхнего уровня Apache [2].
Основными достоинствами RDD считают отказоустойчивость и ленивые вычисления, благодаря которым возрастает скорость работы с данными, и уменьшается риск потери данных при выходе из строя одного из составляющих кластерного оборудования.
Процессы в Linux
Из состояния готовности процесс может перейти только в состояние выполнения. В состоянии выполнения может находится только один процесс на один процессор. Если у вас n-процессорная машина, у вас одновременно в состоянии выполнения могут быть n процессов.
Диаграмма модели трех состояний представлена на рисунке 1.
Рисунок 1. Модель трех состояний
Диаграмма модели пяти состояний представлена на рисунке 2.
Рисунок 2. Модель пяти состояний
Процессы создают иерархию в виде дерева. Самым «главным» предком, то есть процессом, стоящим на вершине этого дерева, является процесс init (PID=1).
Для наблюдения за процессами мы будем использовать программу top.
Полный вывод программы я по понятным причинам урезал. Рассмотрим по порядку весь вывод программы. В первой строке программа сообщает текущее время, время работы системы ( 58 min), количество зарегистрированных (login) пользователей (4 users), общая средняя загрузка системы (load average).
Примечание. Общей средней загрузкой системы называется среднее число процессов, находящихся в состоянии выполнения (R) или в состоянии ожидания (D). Общая средняя загрузка измеряется каждые 1, 5 и 15 минут.
Во второй строке вывода программы top сообщается, что в списке процессов находятся 52 процесса, из них 51 спит (состояние готовности или ожидания), 1 выполняется (у меня только 1 процессор), 0 процессов зомби и 0 остановленных процессов.
В третьей-пятой строках приводится информация о загрузке процессора, использования памяти и файла подкачки. Нас данная информация не очень интересует, поэтому переходим сразу к таблице процессов.
В таблице отображается различная информация о процессе. Нас сейчас интересуют колонки PID (идентификатор процесса), USER (пользователь, запустивший процесс), STAT (состояние процесса) и COMMAND (команда, которая была введена для запуска процесса).
Обратите внимание на колонку состояния нашего процесса. Она содержит значение R, которое означает, что в данный момент выполняется процесс с номером 4035.
Для компиляции данной программы нам нужен компилятор gcc:
Для тех, у кого не установлен компилятор, скомпилированная программа доступна отсюда.
После того, как программа будет откомпилирована, запустите ее: ./zombie. Программа выведет следующую информацию:
Мы видим, что в списке процессов появился 1 зомби (STAT=Z), который проживет аж 10 секунд.
Список процессов Linux
На сайте уже есть несколько статей про процессы Linux, в которых подробно описано как ими управлять или как завершить один или группу процессов, но это еще не все. Чтобы правильно управлять процессами и ориентироваться в них вам нужно научиться анализировать список процессов Linux, понимать что значит каждый пункт и зачем он нужен.
В этой статье мы подробно рассмотрим как посмотреть список процессов различными способами, разберем какими бывают процессы, почему так происходит и что с этим делать.
Список процессов в Linux
Я не буду подробно рассказывать про каждую команду, которую можно применять для просмотра списка запущенных процессов, вместо этого мы пройдёмся по основным утилитам для решения этой задачи, рассмотрим как посмотреть список потоков процесса, вывести процессы, которые выполняются на определённом ядре, а также как найти скрытые процессы. Но сначала надо разобраться с терминами.
1. Утилита ps
Самый простой способ посмотреть список процессов, запущенных в текущей командой оболочке, использовать команду ps без параметров:
Вот значение основных колонок в выводе утилиты:
Чтобы посмотреть список процессов в виде дерева, и понимать какой процесс имеет какие дочерние процессы, выполните команду:
Для просмотра списка процессов с потоками используйте опцию -L:
Здесь появятся ещё две дополнительных колонки:
Чтобы посмотреть список процессов определенного пользователя, например, sergiy используйте опцию -u:
Теперь давайте перейдём к другим, более интересным, интерактивным утилитам.
2. Утилита top
Утилита top не поставляется вместе с системой, поэтому вам придется её установить. Для этого в Ubuntu выполните:
sudo apt install top
Программа позволяет интерактивно просматривать список запущенных процессов Linux. Чтобы вывести список процессов Linux выполните команду:
Колонки, которые выводит программа очень похожи на ps:
Для того чтобы сделать вывод программы цветным, нажмите Z:
Чтобы вывести дерево процессов Linux нажмите сочетание клавиш Shift+V:
Для отображения потоков нажмите Shift + H:
Если вам недостаточно стандартных полей с информацией о процессах, вы можете нажать Shift + F и выбрать дополнительные поля, которые надо отображать. Для выбора или удаления поля используйте пробел:
3. Утилита htop
Это ещё более мощная утилита для просмотра запущенных процессов в Linux. Пользоваться ею намного удобнее. Здесь поддерживаются не только горячие клавиши, но и управление мышью. А ещё она выводит всё в цвете, поэтому смотреть на данные намного приятнее. Для установки программы выполните:
sudo apt install htop
Для того чтобы запустить выполните в терминале:
Колонки, которые вы увидите в выводе программы, аналогичны тем, что доступны в top, поэтому я не буду рассматривать их здесь отдельно. Для настройки выводимых данных нажмите кнопку F2, затем перейдите в раздел Display Options:
Для того чтобы настроить какие колонки будут отображаться используйте пункт меню Columns:
Тут вы можете выбрать какие колонки отображать, а какие нет, а также можете настроить их порядок.
4. Программа Gnome Monitor
Вы можете смотреть запущенные процессы не только в терминале, но и в графическом интерфейсе. Для этого можно использовать утилиту Gnome Monitor. У неё намного меньше возможностей, по сравнению даже с ps, но зато у неё есть графический интерфейс. Вы можете запустить программу из главного меню системы:
По умолчанию утилита отображает только процессы текущего пользователя. Если вы хотите получить все процессы кликните по иконке бутерброда и выберите Все процессы:
Теперь программа отображает все запущенные процессы Linux в системе. Здесь вы можете выполнять поиск по процессам, завершать их и многое другое. Но потоков и дерева процессов программа не показывает.
5. Утилита atop
sudo apt install atop
Затем запустите её:
Вот основные колонки, которые выводит утилита и их значения:
Для того чтобы включить отображение потоков процесса нажмите y:
Для просмотра информации о памяти нажмите m, если хотите вернутся обратно, нажмите g:
Выводы
В этой статье мы разобрали самые основные способы посмотреть список процессов в Linux, как видите есть простые способы, но есть и более сложные и информативные. Какими способами вы пользуетесь чаще всего? Напишите в комментариях!
Все, что вам нужно знать о процессах в Linux
Оригинал: All You Need To Know About Processes in Linux [Comprehensive Guide]
Автор: Aaron Kili
Дата публикации: 31 марта 2017 года
Перевод: А. Кривошей
Дата перевода: август 2017 г.
Типы процессов
В Linux есть два основных типа процессов:
Что такое демоны
Это специальные типы фоновых процессов, которые запускаются при загрузке системы и остаются запущенными в виде служб, они не завершаются. Демоны запускаются как системные задачи, спонтанно. Тем не менее, пользователь может контролировать их через процесс init.
Создание процессов в Linux
Обычно новый процесс создается уже существующим процессом, который делает в памяти свою точную копию. Дочерний процесс получает то же окружение, что и его родительский процесс, отличается только номер ID.
Есть два распространенных способа создания нового процесса в Linux:
Как Linux идентифицирует процессы?
Процесс Init
Процесс Init всегда получает ID 1. Он функционирует как приемный родитель для всех осиротевших процессов.
Для определения ID процесса можно использовать команду pidof:
Найти ID процесса и ID родительского процесса для системной оболочки можно с помощью команд:
Запуск процессов в Linux
При старте команды или программы (например cloudcmd – CloudCommander), она запускает процесс в системе. Вы можете запустить процесс переднего плана (интерактивный), как показано ниже, он подключится к терминалу и пользователь сможет взаимодействовать с ним:
Фоновые процессы в Linux
Для запуска фонового процесса (неинтерактивного) используется символ &, при этом процесс не сможет читать ввод от пользователя, пока не будет перемещен на передний план.
Вы также можете отправить процесс на задний план, приостановив его с помощью [Ctrl + Z], это отправит сигнал SIGSTOP процессу, тем самым прекратив его работу; он простаивает:
Для продолжения выполнения приостановленного в фоне процесса, используется команда bg:
Для перевода процесса из фонового режима на передний план используется команда fg вместе с ID:
Состояние процесса в Linux
В зависимости от различных обстоятельств состояние процесса во время работы может меняться. В Linux процесс может находиться в следующих состояниях:
Как просмотреть активные процессы в Linux
В Linux есть несколько утилит для просмотра запущенных в системе процессов, наиболее широко известны команды ps и top:
1. Команда ps
Она выводит информацию о выбранных активных процессах, как показано ниже.
2. top – утилита системного мониторинга
3. glances – утилита системного мониторинга
Есть также еще несколько полезных программ, которые вы можете использовать для просмотра списка активных процессов, почитать о них можно по ссылкам ниже.
Управление процессами в Linux
В Linux также имеются команды для управления процессами, например kill, pkill, pgrep и killall. Ниже приведено несколько примеров их использования:
Если вы хотите подробно изучить использование этих команд, информация по ссылкам ниже.
Обратите внимание, что с их помощью вы можете завршать зависшие приложения, которые тормозят вашу систему.
Отправка сигналов процессу
Для отправки сигналов процессу используются описанные выше команды kill, pkill или pgrep. Однако программа ответит на сигнал, только если она запрограммирована распознавать такой сигнал.
Большинство сигналов предназначены для использования системой или программистами при написании кода. Следующие сигналы могут быть полезны пользователю:
SIGHUP 1 – отправляется процессу при закрытии контролирующего его терминала.
SIGINT 2 – отправляется процессу контролирующим его терминалом, если пользователь прерывает работу процесса клавишами [Ctrl+C].
SIGQUIT 3 – отправляется процессу, если пользователь посылает сигнал выхода из программы [Ctrl+D].
SIGKILL 9 – этот сигнал немедленно завершает (убивает) процесс без выполнения любых операций очистки файлов, логов и т.д.
SIGTERM 15 – это сигнал завершения работы программы (он по умоланию отправляется командой kill).
SIGTSTP 20 – отправляется процессу контролирующим его терминалом с запросом на остановку (terminal stop); инициируется при нажатии [Ctrl+Z].
Ниже приведены примеры использования команд kill для завершения работы Firefox при его зависании с использованием PID:
Для завершения программы с использованием ее названия используются команды pkill или killall:
Изменение приоритета процесса
В Linux все активные процессы имеют определенное значение приоритета (nice). Процессы с более высоким приоритетом обычно получают больше процессорного времени, чем процессы с более низким приоритетом.
Однако пользователь с привилегиями root может менять приоритет с помощью команд nice и renice.
В выводе команды top столбец NI отображает значения nice для процессов.
Вы можете использовать команду nice, чтобы задать значение nice процесса. Не забывайте, что обычный пользователь может присвоить процессу значение nice от 0 до 20, только если это процесс ему принадлежит.
Отрицательные значения nice может использовать только пользователь root.
Для понижения приоритета процесса используется команда renice:
Другие статьи об управлении процессами в Linux вы найдете на странице «Процессы в Linux-системе».