exponenta event banner

matlab.io.datastore.HadoopFileBased класс

Пакет: matlab.io.datastore

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

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

Описание

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

Чтобы использовать этот класс 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 в пользовательское хранилище данных, необходимо:

Дополнительные сведения и шаги по созданию пользовательского хранилища данных с поддержкой Hadoop см. в разделе Разработка пользовательского хранилища данных.

Методы

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

Признаки

Sealedfalse

Сведения об атрибутах класса см. в разделе Атрибуты класса.

Примеры

свернуть все

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

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

  • Шаг 1. Наследование из классов хранилища данных.

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

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

Этот код показывает три шага в примере реализации пользовательского хранилища данных, которое может считывать двоичные файлы с сервера 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

На этом этапе завершается реализация пользовательского хранилища данных.

Затем создайте объект хранилища данных с помощью пользовательского конструктора хранилища данных. Если данные расположены по адресу 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';

Создание массива высокого уровня из хранилища данных.

t = tall(ds);

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

 hd = gather(head(t));

Представлен в R2017b