Поддерживаемая платформа: только Linux ®.
В этом примере показано, как развернуть автономное приложение для Spark™ с помощью API MATLAB ® for Spark. Приложение можно развернуть против Spark с помощью одного из двух поддерживаемых менеджеров кластера: локального и Hadoop ® YARN. В этом примере показано, как развернуть приложение с помощью обоих менеджеров кластера. Обсуждение менеджеров кластеров см. в разделе Менеджеры кластеров, поддерживаемые Spark.
Цель: Подсчитать количество уникальных авиакомпаний в данном наборе данных.
| Набор данных: | airlinesmall.csv |
| Описание: |
Информация о вылете и прилете авиакомпании из 1987-2008. |
| Расположение: | /usr/local/MATLAB/R2021a/toolbox/matlab/demos |
Вспомогательная функция
Создание файла MATLAB с именем carrierToCount.m со следующим кодом:
function results = carrierToCount(input) tbl = input{1}; intermKeys = tbl.UniqueCarrier; [intermKeys, ~, idx] = unique(intermKeys); intermValues = num2cell(accumarray(idx, ones(size(idx)))); results = cellfun( @(x,y) {x,y} , ... intermKeys, intermValues, ... 'UniformOutput',false);
Примечание
При использовании Spark версии 1.6 или выше необходимо увеличить размер кучи Java ® в MATLAB как минимум до 512MB. Дополнительные сведения об увеличении размера кучи Java в MATLAB см. в разделе Настройки памяти кучи Java.
Локальный диспетчер кластеров представляет псевдо-кластер с поддержкой Spark и работает в неразрешенном режиме на одной машине. Его можно настроить на использование одного рабочего потока или нескольких рабочих потоков на многоядерном компьютере. В приложениях обозначается словом local. Локальный диспетчер кластеров удобен для отладки приложения до полного развертывания в кластере Hadoop с поддержкой Spark.
Начните этот пример с создания новой рабочей папки, видимой в пути поиска MATLAB.
Создание вспомогательной функции carrierToCount.m упомянутый выше.
Укажите свойства искры.
Использовать containers.Map для задания свойств искры.
sparkProp = containers.Map(... {'spark.executor.cores',... 'spark.matlab.worker.debug'},... {'1',... 'true'});
Свойства искры указывают среду выполнения искры развертываемого приложения. Для развертывания каждого приложения необходимо настроить определенные свойства Spark.
Дополнительные сведения о свойствах искры см. в разделе prop значение 'SparkProperties' пара имя-значение в разделе Входные аргументы SparkConf класс.
Создать SparkConf объект.
Использовать класс matlab.compiler.mlspark.SparkConf для создания SparkConf объект. A SparkConf объект сохраняет параметры конфигурации развертываемого приложения в Spark. Параметры конфигурации приложения передаются в кластер Spark через SparkContext.
conf = matlab.compiler.mlspark.SparkConf(... 'AppName', 'mySparkAppDepLocal', ... 'Master', 'local[1]', ... 'SparkProperties', sparkProp );
Дополнительные сведения о SparkConf см. в разделе matlab.compiler.mlspark.SparkConf.
Создать SparkContext объект.
Использовать класс matlab.compiler.mlspark.SparkContext с SparkConf объект в качестве входных данных для создания SparkContext объект.
sc = matlab.compiler.mlspark.SparkContext(conf);
A SparkContext объект служит точкой входа в Spark путем инициализации подключения к кластеру Spark. Он принимает SparkConf объект в качестве входного аргумента и использует параметры, указанные в этом объекте, для настройки внутренних служб, необходимых для установления подключения к среде выполнения Spark.
Дополнительные сведения о SparkContext см. в разделе matlab.compiler.mlspark.SparkContext.
Создание RDD объект из данных.
Использование функции MATLAB datastore для создания datastore объект, указывающий на файл airlinesmall.csv. Затем используйте метод SparkContext datastoreToRDD для преобразования datastore объект для искры RDD объект.
% Create a MATLAB datastore (LOCAL) ds = datastore('airlinesmall.csv',... 'TreatAsMissing','NA', ... 'SelectedVariableNames','UniqueCarrier'); % Convert MATLAB datastore to Spark RDD rdd = sc.datastoreToRDD(ds);
Как правило, входные RDD могут быть созданы с помощью следующих методов: SparkContext класс: parallelize, datastoreToRDD, и textFile.
Выполнение операций на RDD объект.
Использовать метод Spark RDD, например flatMap для применения функции ко всем элементам RDD объект и выровнять результаты. Функция carrierToCount созданный ранее служит функцией, которая будет применяться к элементам РДД. Дескриптор функции для функции carrierToCount передается в качестве входного аргумента в flatMap способ.
maprdd = rdd.flatMap(@carrierToCount); redrdd = maprdd.reduceByKey( @(acc,value) acc+value ); countdata = redrdd.collect(); % Count and display carrier occurrences count = 0; for i=1:numel(countdata) count = count + countdata{i}{2}; fprintf('\nCarrier Name: %s, Count: %d', countdata{i}{1}, countdata{i}{2}); end fprintf('\n Total count : %d\n', count); % Delete Spark Context delete(sc)
Как правило, в качестве входных аргументов методов Spark RDD используются функции MATLAB или анонимные функции, известные как преобразования и действия. Эти дескрипторы функций и анонимные функции выполняются сотрудниками развернутого приложения.
Список поддерживаемых преобразований и действий RDD см. в разделе Преобразования и действия в разделе Методы документа RDD класс.
Дополнительные сведения о преобразованиях и действиях см. в разделе Основные сведения о искрах Apache.
Создайте автономное приложение.
Используйте mcc с помощью команды -m для создания автономного приложения. -m флаг создает стандартный исполняемый файл, который может быть запущен из командной строки. -a флаг включает зависимый набор данных airlinesmall.csv из папки <matlabroot>/toolbox/matlab/demos. mcc команда автоматически забирает зависимый файл carrierToCount.m при условии, что он находится в одной и той же рабочей папке.
>> mcc -m deployToSparkMlApiLocal.m -a <matlabroot>/toolbox/matlab/demos/airlinesmall.csv
mcc команда создает сценарий оболочки run_deployToSparkMlApiLocal.sh для запуска исполняемого файла deployToSparkMlApiLocal.
Дополнительные сведения см. в разделе mcc.
Запустите автономное приложение из оболочки Linux с помощью следующей команды:
$ ./run_deployToSparkMlApiLocal.sh /share/MATLAB/MATLAB_Runtime/v91 |
/share/MATLAB/MATLAB_Runtime/v91 является аргументом, указывающим местоположение среды выполнения MATLAB.
Перед выполнением вышеуказанной команды убедитесь, что javaclasspath.txt находится в той же папке, что и сценарий оболочки и исполняемый файл.
Приложение не будет выполнено, если не удается найти файл javaclasspath.txt.
Приложение также может не быть выполнено, если необязательная строка, содержащая расположение папки файлов конфигурации Hadoop, является незафиксированной. Для выполнения приложения на local менеджер кластера, эта строка должна быть прокомментирована. Эта строка не должна комментироваться, только если вы планируете запустить приложение с помощью yarn-client в качестве диспетчера кластера в кластере Hadoop с поддержкой Spark.
Вы увидите следующие выходные данные:
Carrier Name: 9E, Count: 521 Carrier Name: AA, Count: 14930 Carrier Name: AQ, Count: 154 Carrier Name: AS, Count: 2910 Carrier Name: B6, Count: 806 Carrier Name: CO, Count: 8138 ... ... ... Carrier Name: US, Count: 13997 Carrier Name: WN, Count: 15931 Carrier Name: XE, Count: 2357 Carrier Name: YV, Count: 849 Total count : 123523
Код:
Менеджер кластера «пряжа-клиент» представляет кластер Hadoop с поддержкой Spark. Менеджер кластера YARN был представлен в Hadoop 2.0. Обычно он устанавливается на тех же узлах, что и HDFS™. Поэтому запуск Spark на YARN позволяет Spark легко получать доступ к данным HDFS. В приложениях обозначается с помощью слова yarn-client.
После выполнения шагов по развертыванию приложения с помощью yarn-client поскольку ваш диспетчер кластеров аналогичен использованию локального диспетчера кластеров, показанного выше, шаги представлены с минимальным обсуждением. Подробное описание каждого шага см. в приведенном выше случае Local.
Примечание
Чтобы развернуть приложения Spark, созданные с помощью API MATLAB для Spark в Cloudera ® CDH, следуйте тем же инструкциям. Для просмотра примера на Answers™ MATLAB нажмите здесь.
Для использования зон шифрования Cloudera CDH добавьте JAR-файл commons-codec-1.9.jar в статический путь к классам среды выполнения MATLAB. Расположение файла: $HADOOP_PREFIX/lib/commons-codec-1.9.jar, где $ HADOOP _ PREFIX - расположение, в котором установлен Hadoop.
Начните этот пример с создания новой рабочей папки, видимой в пути поиска MATLAB.
Установите среду выполнения MATLAB в папку, доступную каждому рабочему узлу кластера Hadoop. В этом примере используется /share/MATLAB/MATLAB_Runtime/v91 в качестве расположения папки среды выполнения MATLAB.
Если у вас нет среды выполнения MATLAB, вы можете загрузить ее с веб-сайта по адресу: https://www.mathworks.com/products/compiler/mcr.
Копировать airlinesmall.csv в папку распределенной файловой системы (HDFS) Hadoop /user/<username>/datasets. Здесь <username> ссылается на имя пользователя в HDFS.
$ ./hadoop fs -copyFromLocal airlinesmall.csv hdfs://host:54310/user/<username>/datasets |
Настройка переменной среды, HADOOP_PREFIX указывает на папку установки Hadoop. Эти свойства необходимы для отправки заданий в кластер Hadoop.
setenv('HADOOP_PREFIX','/share/hadoop/hadoop-2.6.0')
HADOOP_PREFIX при использовании MATLAB должна быть установлена переменная среды datastore для указания на данные в HDFS. Установка этой переменной среды не имеет ничего общего со Spark. Дополнительные сведения см. в разделе Взаимосвязь между искрой и Hadoop.
Укажите свойства искры.
Использовать containers.Map для задания свойств искры.
sparkProperties = containers.Map( ... {'spark.executor.cores',... 'spark.executor.memory',... 'spark.yarn.executor.memoryOverhead',... 'spark.dynamicAllocation.enabled',... 'spark.shuffle.service.enabled',... 'spark.eventLog.enabled',... 'spark.eventLog.dir'}, ... {'1',... '2g',... '1024',... 'true',... 'true',... 'true',... 'hdfs://hadoop01glnxa64:54310/user/<username>/sparkdeploy'});
Дополнительные сведения о свойствах искры см. в разделе prop значение 'SparkProperties' пара имя-значение в разделе Входные аргументы SparkConf класс.
Создать SparkConf объект.
Использовать класс matlab.compiler.mlspark.SparkConf для создания SparkConf объект.
conf = matlab.compiler.mlspark.SparkConf( ... 'AppName','myApp', ... 'Master','yarn-client', ... 'SparkProperties',sparkProperties);
Дополнительные сведения о SparkConf см. в разделе matlab.compiler.mlspark.SparkConf.
Создать SparkContext объект.
Использовать класс matlab.compiler.mlspark.SparkContext с SparkConf объект в качестве входных данных для создания SparkContext объект.
sc = matlab.compiler.mlspark.SparkContext(conf);
Дополнительные сведения о SparkContext см. в разделе matlab.compiler.mlspark.SparkContext.
Создание RDD объект из данных.
Использование функции MATLAB datastore для создания datastore объект, указывающий на файл airlinesmall.csv в HDFS. Затем используйте метод SparkContext datastoreToRDD для преобразования datastore объект для искры RDD объект.
% Create a MATLAB datastore (HADOOP) ds = datastore(... 'hdfs:///user/<username>/datasets/airlinesmall.csv',... 'TreatAsMissing','NA',... 'SelectedVariableNames','UniqueCarrier'); % Convert MATLAB datastore to Spark RDD rdd = sc.datastoreToRDD(ds);
Как правило, входные RDD могут быть созданы с помощью следующих методов: SparkContext класс: parallelize, datastoreToRDD, и textFile.
Выполнение операций на RDD объект.
Использовать метод Spark RDD, например flatMap для применения функции ко всем элементам RDD объект и выровнять результаты. Функция carrierToCount созданный ранее служит функцией, которая будет применяться к элементам РДД. Дескриптор функции для функции carrierToCount передается в качестве входного аргумента в flatMap способ.
maprdd = rdd.flatMap(@carrierToCount); redrdd = maprdd.reduceByKey( @(acc,value) acc+value ); countdata = redrdd.collect(); % Count and display carrier occurrences count = 0; for i=1:numel(countdata) count = count + countdata{i}{2}; fprintf('\nCarrier Code: %s, Count: %d', countdata{i}{1}, countdata{i}{2}); end fprintf('\n Total count : %d\n', count); % Save results to MAT file save('countdata.mat','countdata'); % Delete Spark Context delete(sc);
Список поддерживаемых преобразований и действий RDD см. в разделе Преобразования и действия в разделе Методы документа RDD класс.
Дополнительные сведения о преобразованиях и действиях см. в разделе Основные сведения о искрах Apache.
Создайте автономное приложение.
Используйте mcc с помощью команды -m для создания автономного приложения. -m создает автономное приложение, которое может быть запущено из командной строки. Нет необходимости присоединять набор данных airlinesmall.csv поскольку он находится в HDFS. mcc команда автоматически забирает зависимый файл carrierToCount.m при условии, что он находится в одной и той же рабочей папке.
>> mcc -m deployToSparkMlApiHadoop.m
mcc команда создает сценарий оболочки run_deployToSparkMlApiHadoop.sh для запуска исполняемого файла deployToSparkMlApiHadoop.
Дополнительные сведения см. в разделе mcc.
Запустите автономное приложение из оболочки Linux с помощью следующей команды:
$ ./run_deployToSparkMlApiHadoop.sh /share/MATLAB/MATLAB_Runtime/v91 |
/share/MATLAB/MATLAB_Runtime/v91 является аргументом, указывающим местоположение среды выполнения MATLAB.
Перед выполнением вышеуказанной команды убедитесь, что javaclasspath.txt находится в той же папке, что и сценарий оболочки и исполняемый файл.
Приложение не будет выполнено, если не удается найти файл javaclasspath.txt.
Приложение также может не выполняться, если дополнительная строка, содержащая расположение папки файлов конфигурации Hadoop, комментируется. Для выполнения приложения в менеджере кластеров «пряжа-клиент» эта строка должна быть незакомментированной. Эту строку следует комментировать только в том случае, если планируется запуск приложения с помощью локального диспетчера кластеров.
Вы увидите следующие выходные данные:
Carrier Name: 9E, Count: 521 Carrier Name: AA, Count: 14930 Carrier Name: AQ, Count: 154 Carrier Name: AS, Count: 2910 Carrier Name: B6, Count: 806 Carrier Name: CO, Count: 8138 ... ... ... Carrier Name: US, Count: 13997 Carrier Name: WN, Count: 15931 Carrier Name: XE, Count: 2357 Carrier Name: YV, Count: 849 Total count : 123523
Примечание
Если развертываемое приложение является функцией MATLAB, а не сценарием MATLAB, используйте следующий синтаксис выполнения:
$ ./run_<applicationName>.sh \ <MATLAB_Runtime_Location> \ [Spark arguments] \ [Application arguments]
$ ./run_deployToSparkMlApiHadoop.sh.sh \ /usr/local/MATLAB/MATLAB_Runtime/v91 \ yarn-client \ hdfs://host:54310/user/<username>/datasets/airlinesmall.csv \ hdfs://host:54310/user/<username>/result
Код: