matlab.io.datastore.HadoopFileBased class

Пакет: matlab.io.datastore

(Не рекомендуемый) Добавить поддержку файлов Hadoop в datastore

matlab.io.datastore.HadoopFileBased не рекомендуется. Использовать matlab.io.datastore.HadoopLocationBased вместо этого.

Описание

matlab.io.datastore.HadoopFileBased является абстрактным классом mixin, который добавляет Hadoop® поддержка пользовательского datastore.

Чтобы использовать этот класс mixin, вы должны наследовать от matlab.io.datastore.HadoopFileBased класс в дополнение к наследованию от matlab.io.Datastore базовый класс. Введите следующий синтаксис в качестве первой линии файла определения класса:

classdef MyDatastore < matlab.io.Datastore & ...
                             matlab.io.datastore.HadoopFileBased 
    ...
end

Чтобы добавить поддержку Hadoop наряду с поддержкой параллельной обработки, используйте следующие линии в файле определения класса:

classdef MyDatastore < matlab.io.Datastore & ...
                             matlab.io.datastore.Partitionable & ...
                             matlab.io.datastore.HadoopFileBased 
    ...
end

Чтобы добавить поддержку Hadoop в пользовательский datastore, необходимо:

Для получения дополнительной информации и шагов по созданию пользовательского datastore с поддержкой Hadoop, смотрите Разработку Пользовательского Datastore.

Методы

getLocation(Не рекомендуемый) Расположение файлов в Hadoop
initializeDatastore(Не рекомендуемый) Инициализируйте datastore с информацией от Hadoop
isfullfile(Не рекомендуемый) Проверить, считывает ли datastore полные файлы

Признаки

Sealedfalse

Для получения информации об атрибутах класса см. раздел «Атрибуты класса».

Примеры

свернуть все

Реализуйте datastore с параллельной обработкой и поддержкой Hadoop и используйте его, чтобы перенести ваши данные с сервера Hadoop в MATLAB®. Затем используйте tall и gather функций на этих данных.

Создайте новую .m файл определения класса, который содержит код, реализующий пользовательский datastore. Необходимо сохранить этот файл в рабочей папке или в папке, расположенной в пути MATLAB. Область имени .m файл должен совпадать с именем функции конструктора объектов. Для примера, если вы хотите, чтобы ваша функция конструктора имела имя MyDatastoreHadoop, тогда имя файла скрипта должно быть MyDatastoreHadoop.m. The .m файл определения класса должен содержать следующие шаги:

  • Шаг 1. Наследование от классов datastore.

  • Шаг 2: Определите конструктор и необходимые методы.

  • Шаг 3: Задайте свою пользовательскую функцию чтения файлов.

Этот код показывает три шага в примере реализации пользовательского datastore, который может считать двоичные файлы с сервера Hadoop.

%% STEP 1: INHERIT FROM DATASTORE CLASSES
classdef MyDatastoreHadoop < matlab.io.Datastore & ...
        matlab.io.datastore.Partitionable & ...
        matlab.io.datastore.HadoopFileBased
    
    properties (Access = private)
        CurrentFileIndex double
        FileSet matlab.io.datastore.DsFileSet
    end

         
%% STEP 2: DEFINE THE CONSTRUCTOR AND THE REQUIRED METHODS
    methods
        % Define your datastore constructor
        function myds = MyDatastoreHadoop(location,altRoots)
            myds.FileSet = matlab.io.datastore.DsFileSet(location,...
                'FileExtensions','.bin', ...
                'FileSplitSize',8*1024);
            myds.CurrentFileIndex = 1;
             
            if nargin == 2
                 myds.AlternateFileSystemRoots = altRoots;
            end
            
            reset(myds);
        end
        
        % Define the hasdata method
        function tf = hasdata(myds)
            % Return true if more data is available
            tf = hasfile(myds.FileSet);
        end
        
        % Define the read method
        function [data,info] = read(myds)
            % Read data and information about the extracted data
            % See also: MyFileReader()
            if ~hasdata(myds)
                error(sprintf(['No more data to read.\nUse the reset ',... 
                     'method to reset the datastore to the start of ' ,...
                     'the data. \nBefore calling the read method, ',...
                     'check if data is available to read ',...
                     'by using the hasdata method.'])) 
            end
            
            fileInfoTbl = nextfile(myds.FileSet);
            data = MyFileReader(fileInfoTbl);
            info.Size = size(data);
            info.FileName = fileInfoTbl.FileName;
            info.Offset = fileInfoTbl.Offset;
            
            % Update CurrentFileIndex for tracking progress
            if fileInfoTbl.Offset + fileInfoTbl.SplitSize >= ...
                    fileInfoTbl.FileSize
                myds.CurrentFileIndex = myds.CurrentFileIndex + 1 ;
            end
        end
        
        % Define the reset method
        function reset(myds)
            % Reset to the start of the data
            reset(myds.FileSet);
            myds.CurrentFileIndex = 1;
        end
        
        
        % Define the partition method
        function subds = partition(myds,n,ii)
            subds = copy(myds);
            subds.FileSet = partition(myds.FileSet,n,ii);
            reset(subds);
        end
    end      

     
    methods (Hidden = true)   

        % Define the progress method
        function frac = progress(myds)
            % Determine percentage of data read from datastore
            if hasdata(myds) 
               frac = (myds.CurrentFileIndex-1)/...
                             myds.FileSet.NumFiles; 
            else 
               frac = 1;  
            end 
        end
 
        % Define the initializeDatastore method
        function initializeDatastore(myds,hadoopInfo)
            import matlab.io.datastore.DsFileSet;
            myds.FileSet = DsFileSet(hadoopInfo,...
                'FileSplitSize',myds.FileSet.FileSplitSize,...
                'IncludeSubfolders',true, ...
                'FileExtensions','.bin');
            reset(myds);
        end
        
        % Define the getLocation method
        function loc = getLocation(myds)
            loc = myds.FileSet;
        end
        
        % Define the isfullfile method
        function tf = isfullfile(~)
            tf = isequal(myds.FileSet.FileSplitSize,'file'); 
        end

    end
        
    methods (Access = protected)
        % If you use the  FileSet property in the datastore,
        % then you must define the copyElement method. The
        % copyElement method allows methods such as readall
        % and preview to remain stateless 
        function dscopy = copyElement(ds)
            dscopy = copyElement@matlab.mixin.Copyable(ds);
            dscopy.FileSet = copy(ds.FileSet);
        end
        
        % Define the maxpartitions method
        function n = maxpartitions(myds)
            n = maxpartitions(myds.FileSet);
        end
    end
end

%% STEP 3: IMPLEMENT YOUR CUSTOM FILE READING FUNCTION
function data = MyFileReader(fileInfoTbl)
% create a reader object using FileName
reader = matlab.io.datastore.DsFileReader(fileInfoTbl.FileName);

% seek to the offset
seek(reader,fileInfoTbl.Offset,'Origin','start-of-file');

% read fileInfoTbl.SplitSize amount of data
data = read(reader,fileInfoTbl.SplitSize);
end

Этот шаг завершает реализацию пользовательского datastore.

Затем создайте объект datastore с помощью пользовательского конструктора datastore. Если ваши данные расположены по адресу hdfs:///path_to_files, тогда вы можете использовать этот код.

setenv('HADOOP_HOME','/path/to/hadoop/install');
ds = MyDatastoreHadoop('hdfs:///path_to_files');

Как использовать tall массивы и gather функцию на Apache Spark™ с параллельным строением кластера, установите mapreducer и прикрепить MyDatastoreHadoop.m в кластер.

mr = mapreducer(cluster);
mr.Cluster.AttachedFiles = 'MyDatastoreHadoop.m';

Создайте длинный массив из datastore.

t = tall(ds);

Соберите голову длинный массив.

 hd = gather(head(t));

См. также

| | | |

Темы

Введенный в R2017b