Сериализация больших данных с использованием Apache Avro и Hadoop

Совместное использование сериализованных данных несколькими приложениями

Apache Avro – это инфраструктура сериализации, производящая данные в компактном двоичном формате, который не требует генерации прокси-объектов или кода. В статье описывается инфраструктура Avro и ее совместное использование с платформой Apache Hadoop.

Avro Apache — это инфраструктура, которая позволяет сериализовать данные в формате со встроенной схемой. Сериализованные данные представлены в компактном двоичном формате, который не требует генерации прокси-объектов или программного кода. Вместо использования библиотек сгенерированных прокси-объектов и строгой типизации формат Avro интенсивно задействует схемы, которые отсылаются вместе с сериализованными данными. Передача схем вместе с Avro-сообщениями позволяет любому приложению десериализовать данные.

InfoSphere BigInsights Quick Start Edition

Avro — это компонент платформы IBM InfoSphere BigInsights, которая базируется на Hadoop. InfoSphere BigInsights Quick Start Edition — это доступная для загрузки бесплатная версия InfoSphere BigInsights. Эта версия позволяет ознакомиться со всеми возможностями (такими как Big SQL, текстовый анализ и BigSheets), которые корпорация IBM разработала для расширения функциональности проекта с открытым кодом Hadoop. Получить максимальную пользу от работы с Hadoop вам помогут специальные обучающие материалы, в том числе пошаговые руководства для самостоятельной подготовки и видеоуроки. Вы сможете работать с большими объемами данных без ограничений по времени или объему. Смотрите видеоматериалы, изучайте руководства (в формате PDF) и загрузите BigInsights Quick Start Edition прямо сейчас.

В предлагаемой статье показано, как использовать инфраструктуру Avro для определения схемы, для создания и сериализации некоторых данных, а также для их пересылки между приложениями. Я использовал интегрированную среду разработки (IDE) Eclipse для создания учебного приложения, демонстрирующего использование инфраструктуры Avro. Загрузите программный код этого учебного приложения.

Установка

Чтобы установить среду Avro, вам необходимо загрузить соответствующие библиотеки и сослаться на них в своем программном коде.

Загрузка библиотек

Чтобы загрузить библиотеки Avro для использования в среде Java™, загрузите файлы avro-VERSION.jar и avro-tools-VERSION.jar (см. раздел Ресурсы). Эти две библиотеки зависят от библиотек Jackson, ссылки на которые также находятся в разделе Ресурсы. В качестве альтернативного варианта воспользуйтесь инструментом Apache Maven или IVY для автоматической загрузки JAR-файлов (Java archive) и всех их зависимостей. Пример Maven-записи приведен в листинге 1.

Листинг 1. Пример записей для зависимостей Avro
    <dependencies>
        <dependency>
            <groupId>org.apache.avro</groupId>
            <artifactId>avro</artifactId>
            <version>1.7.5</version>
        </dependency>

        <dependency>
            <groupId>org.apache.avro</groupId>
            <artifactId>avro-tools</artifactId>
            <version>1.7.5</version>
        </dependency>

    </dependencies>

Обратитесь к разделу Ресурсы, чтобы загрузить библиотеки для других реализаций, таких как Python, Ruby, PHP или C#.

Создание проекта

В данной статье применяется среда Eclipse IDE с плагином m2e (Maven 2), который был установлен с целью построения примеров по использованию инфраструктуры Avro. Вам потребуется новый проект, в котором вы будет создавать свои учебные схемы, компилировать их, а затем запускать свои примеры на исполнение. Чтобы создать новый проект в Eclipse, выберите File > New > Maven Project. Поставьте флажок в контрольном окошке Create a simple project, чтобы быстро создать проект с поддержкой инструмента Maven, который используется в данной статье для операций с зависимостей Avro.

Как указывалось в разделе Загрузка библиотек, один из простых способов получения инфраструктуры Avro и все ее зависимостей без выполнения ручных операций состоит в использовании инструмента Maven или IVY. В учебном коде, который включен в эту статью, для автоматического конфигурирования зависимостей Avro и их загрузки из Eclipse используется Maven-файл pom.xml. Для получения дополнительной информации о работе Maven обратитесь к разделу Ресурсы.

Чтобы создать свой собственный файл pom.xml, сначала создайте новый XML-файл, для чего выберите File > New > Other. Выберите из списка опцию XML File, а затем присвойте этому файлу имя pom.xml. После создания своего файла поместите в него все содержимое листинга 2, а затем сохраните этот файл.

Листинг 2. Полный текст Maven-файла pom.xml для начала работы
<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>avroSample</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>avroSample</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.6</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.avro</groupId>
            <artifactId>avro</artifactId>
            <version>1.7.5</version>
        </dependency>

        <dependency>
            <groupId>org.apache.avro</groupId>
            <artifactId>avro-tools</artifactId>
            <version>1.7.5</version>
        </dependency>


        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.0-beta9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.0-beta9</version>
        </dependency>
    </dependencies>

</project>

После создания файла pom.xml необходимо осуществить разрешение зависимостей. При этом будут загружены JAR-файлы Avro, а также все остальные библиотеки, которые требуются для Avro. Чтобы осуществить разрешение зависимостей в вашей IDE-среде Eclipse, сохраните свой файл pom.xml. Когда Eclipse будет собирать проект, компонент Maven Builder автоматически загрузит требуемые новые зависимости.


Схемы Avro

Схемы Avro описывают формат сообщения; они определяются с использованием формата JSON (JavaScript Object Notation). JSON-контент схемы помещается внутрь файла, на который инструменты будут впоследствии ссылаться.

Процедура определения схемы

Прежде чем создавать схему в своем проекте Eclipse, создайте исходную папку, в которую можно будет поместить файлы схемы. Для создания новой исходной папки выберите File > New > Source Folder. Введите src/main/avro и нажмите Finish. Эта исходная папка соответствует соглашениям Maven, что позволяет вам использовать плагин Maven для генерации исходного кода.

Теперь, когда у вас есть исходная папка, которая будет содержать файлы схемы, создайте в этой исходной папке новый файл, для чего выберите File > New > File. Присвойте своему новому файлу имя, например automobile.asvc. Теперь вы можете добавить JSON-контент с целью определения схемы. В листинге 3 демонстрируется простая схема, определяющая автомобиль (Automobile).

Листинг 3. Файл учебной схемы Avro для объекта Automobile
{
    "namespace":"com.example.avroSample.model",
    "type":"record",
    "name":"Automobile",
    "fields":[
        {
            "name":"modelName",
            "type":"string"
        },
        {
            "name":"make",
            "type":"string"
        },
        {
            "name":"modelYear",
            "type":"int"
        },
        {
            "name":"passengerCapacity",
            "type":"int"
        }
        
    ]
}

Объект Automobile имеет тип record; этот тип является составным и содержит список полей. Для составного типа record требуются атрибуты, показанные ниже.

Таблица 1. Атрибуты, доступные для типа record
Имя атрибутаОписаниеПример
typeТип данных поляrecord
nameИмя объекта (при генерации кода будет использовано в качестве имени класса)Automobile
namespaceПространство имен для объекта с целью избежания конфликтов именования (при генерации кода будет использовано в качестве имени пакета) com.example.avroSample.model
fieldsМассив полей объекта (атрибуты или свойства) modelName, etc.

Каждое поле в списке полей содержит данные о своем имени и о своем типе. В таблице 2 показан список атрибутов поля.

Таблица 2. Атрибуты поля
Имя атрибутаОписание
nameИмя поля (при генерации кода будет использовано в качестве имени свойства )
typeТип данных этого поля

Для получения дополнительной информации о JSON-схеме обратитесь в раздел Ресурсы .


Компилирование схемы

Теперь, когда схема определена, ее можно скомпилировать с помощью инструментов Avro. Вы можете воспользоваться для генерации исходного кода соответствующим JAR-методом или плагином, находящимся внутри файла pom.xml. Если вы хотите использовать инструментарий Maven, то переходите к разделу Использование плагина Maven. .

Использование командной строки

Чтобы использовать JAR-метод, выберите Run > External Tools > External Tools Configurations.После этого выберите местоположение, для чего нажмите Browse File System с целью отыскания Java в своей среде (например, C:\Program Files\Java\jre7\bin\java.exe на компьютере под управлением Windows®). Для своего рабочего каталога выберите соответствующий проект, для чего нажмите Browse Workspace. Этот рабочий каталог будет использоваться в качестве базового маршрута для относительных маршрутов, которые вы введете в области Arguments.

В области Arguments введите значения, показанные в листинге 4.

Листинг 4. Добавление аргументов
-jar avro-tools-1.7.5.jar
compile
schema
src/main/avro/automobile.avsc
src/main/java

Чтобы запустить инструмент, нажмите Run.

Использование плагина Maven

Чтобы использовать плагин Maven для генерации прокси-классов Java из схемы Avro, поместите XML-код, показанный в листинге 5, в файл pom.xml.

Листинг 5. Добавление сборочного плагина к файлу pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <!-- snipped -->

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.avro</groupId>
                <artifactId>avro-maven-plugin</artifactId>
                <version>1.7.5</version>
                <executions>
                    <execution>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>schema</goal>
                        </goals>
                        <configuration>
                            <sourceDirectory>
                            ${project.basedir}/src/main/avro/
                            </sourceDirectory>
                            <outputDirectory>
                            ${project.basedir}/src/main/java/
                            </outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>

        </plugins>
    </build>

    <dependencies>
        <!-- snipped -->
    </dependencies>

</project>

Теперь, когда у вас есть сборочный плагин в Maven-файле pom.xml, Maven будет автоматически генерировать для вас исходный код на фазе generate-sources (генерация исходников), которая предшествует фазе compile (компиляция). Для получения дополнительной информации о жизненном цикле Maven обратитесь в раздел Ресурсы.

Сгенерированный файл Java-класса будет находиться в папке src/main/java. В листинге 6 показана часть учебного класса Automobile, который был сгенерирован с использованием пакета com.example.avroSample.model, указанного в пространстве имен схемы.

Листинг 6. Пример сгенерированного класса Automobile
/**
 * Autogenerated by Avro
 * 
 * DO NOT EDIT DIRECTLY
 */
package com.example.avroSample.model;  
@SuppressWarnings("all")
@org.apache.avro.specific.AvroGenerated
public class Automobile extends org.apache.avro.specific.SpecificRecordBase 
    implements org.apache.avro.specific.SpecificRecord {

  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.
Schema.Parser().parse("{\"type\":\"record\",\"name\":\"Automobile\",
\"namespace\":\"com.example.avroSample.model\",\"fields\":[{\"name\":
\"modelName\",\"type\":\"string\"},{\"name\":\"make\",\"type\":\"string\"},{
\"name\":\"modelYear\",\"type\":\"int\"},{\"name\":\"passengerCapacity\",
\"type\":\"int\"}]}");
  public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; }
  @Deprecated public java.lang.CharSequence modelName;
  @Deprecated public java.lang.CharSequence make;
  @Deprecated public int modelYear;
  @Deprecated public int passengerCapacity;

  /**
   * Default constructor.  Note that this does not initialize fields
   * to their default values from the schema.  If that is desired then
   * one should use {@link \#newBuilder()}. 
   */
  public Automobile() {}

  /**
   * All-args constructor.
   */
  public Automobile(java.lang.CharSequence modelName,
  	java.lang.CharSequence make, java.lang.Integer modelYear, 
	java.lang.Integer passengerCapacity) {

    this.modelName = modelName;
    this.make = make;
    this.modelYear = modelYear;
    this.passengerCapacity = passengerCapacity;

  }
  /* snipped... */
}

Теперь, когда исходные файлы сгенерированы, вы сможете использовать их в Java-приложении и увидеть, как это все работает.


Сериализация с использованием схемы

К этому моменту вы должны иметь файл схемы, определенной с помощью JSON-контента, и не менее одного исходного Java-файла, сгенерированного из этой схемы. Теперь мы готовы написать код теста, который создает объекты с использованием сгенерированных классов, присваивает значения их свойствам и сериализует эти объекты в файл.

В листинге 7 приведен пример Java-кода, который использует Builder для возвращения экземпляра объекта.

Листинг 7. Использование Builder для создания экземпляра объекта
        Automobile auto = Automobile.newBuilder().setMake("Speedy Car Company")
                .setModelName("Speedyspeedster").setModelYear(2013)
               setPassengerCapacity(2).build();

        DatumWriter<Automobile> datumWriter = 
            new SpecificDatumWriter<Automobile>(Automobile.class);
        DataFileWriter<Automobile> fileWriter = 
            new DataFileWriter<Automobile>(datumWriter);

        try {
            fileWriter.create(auto.getSchema(), outputFile);
            fileWriter.append(auto);
            fileWriter.close();
        } catch (IOException e) {
            LOGGER.error("Error while trying to write the object to file <"
                    + outputFile.getAbsolutePath() + ">.", e);
        }

Присвоение значений свойствам объекта осуществляется до вызова метода build() с целью возвращения экземпляра объекта. Объект DatumWriter используется для записи данных от объекта посредством объекта DataFileWriter, который записывает содержащиеся в объекте данные в файл, соответствующий предоставленной схеме.

После создания реализации DataFileWriter и вызова метода create() со схемой и с файлом вы сможете добавить объекты к своему файлу с помощью метода append() (см. листинг 7).

Чтобы выполнить учебный код, поместите этот код в метод main Java-класса или добавьте его к модульному тесту (unit test). В учебном коде, приложенном к данной статье, этот код добавлен к модульному тесту, который можно выполнить в среде Eclipse или в среде Maven.

При исполнении этого кода сериализатор (serializer) создает в целевой папке проекта файл с именем autos.avro. Поскольку этот файл представлен в компактном двоичном формате, просмотреть его содержимое с помощью обычного текстового редактора не удастся.


Десериализация с использованием схемы

При наличии хотя бы одного объекта, сериализованного в файл, вы можете использовать Java-код для десериализации содержимого этого файла в объекты. В данном случае модульный тест полезен, поскольку позволяет вам вносить утверждения (assertion) для верификации значений десериализованного объекта на соответствие исходным значениям.

В листинге 8 показан Java-код, который можно использовать для десериализации объекта Automobile из файла, созданного на предыдущем шаге.

Листинг 8. Java-код для десериализации объекта Automobile
    DatumReader<Automobile> datumReader = 
        new SpecificDatumReader<Automobile>(Automobile.class);
    try {
        DataFileReader<Automobile> fileReader = 
            new DataFileReader<Automobile>(outputFile, datumReader);

        Automobile auto = null;
        
        if (fileReader.hasNext()) {
            auto = fileReader.next(auto);
        }
        
    } catch (IOException e) {
        LOGGER.error("Error while trying to read the object from file <"
                + outputFile.getAbsolutePath() + ">.", e);
    }

На этот раз в коде используется объект DatumReader, который читает контент посредством реализации DataFileReader.

DatumReader— это т. н. "итератор" (расширяющий интерфейс Iterator), соответственно он прочитывает файл и возвращает объекты с помощью метода next(). Такое поведение знакомо каждому, кто работает с объектами RecordSet в среде Java.

Код, показанный в листинге 9, позволяет убедиться в том, что свойства имеют те же значения, которые были первоначально присвоены объекту до его записи в файл. При исполнении кода в виде модульного теста осуществляется передача следующих утверждений.

Листинг 9. Добавление утверждений для проверки соответствия исходным значениям объекта
    DatumReader<Automobile> datumReader = 
        new SpecificDatumReader<Automobile>(Automobile.class);
    try {
        DataFileReader<Automobile> fileReader = 
            new DataFileReader<Automobile>(outputFile, datumReader);

        Automobile auto = null;
        
        if (fileReader.hasNext()) {
            auto = fileReader.next(auto);
        }
        
        assertEquals("Speedy Car Company", auto.getMake().toString());
        assertEquals("Speedyspeedster", auto.getModelName().toString());
        assertEquals(Integer.valueOf(2013), auto.getModelYear());
        
        
    } catch (IOException e) {
        LOGGER.error("Error while trying to read the object from file <"
                + outputFile.getAbsolutePath() + ">.", e);
    }

Теперь, когда вы увидели, как действует Avro при записи в файл и при чтении из файла, можно посмотреть, как Avro работает вместе с Apache Hadoop.


Интеграция с Hadoop

Apache Hadoop — это инфраструктура, обеспечивающая обработку больших наборов данных с помощью распределенных компьютеров. Hadoop позволяет обрабатывать данные на тысячах компьютеров в рамках масштабируемых приложений. За дополнительной информацией о Hadoop обратитесь к разделу Ресурсы.

Avro позволяет использовать сложные структуры данных в рамках заданий Hadoop MapReduce. Чтобы воспользоваться функциональностью MapReduce, вам нужно добавить к своему файлу pom.xml зависимости с целью извлечения библиотеки Hadoop и библиотеки Avro MapReduce. Для добавления этих зависимостей измените свой файл pom.xml так, как показано в листинге 10.

Листинг 10. Добавление зависимостей к файлу pom.xml для задействования библиотек Avro Hadoop
<project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <!-- snipped -->

    <build>
        <!-- snipped -->
    </build>

    <dependencies>
        
        <!-- snipped... added earlier -->

        <dependency>
            <groupId>org.apache.avro</groupId>
            <artifactId>avro-mapred</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-core</artifactId>
            <version>1.1.0</version>
        </dependency>

    </dependencies>

</project>

Добавьте зависимости к файлу pom.xml и сохраните его. Плагин m2e автоматически загружает вновь добавленные JAR-файлы и их зависимости.

После разрешения зависимостей создайте с использованием Avro и MapReduce пример, показывающий результаты подсчета моделей разных наименований в списке автомобилей, созданном в предшествующих примерах. В основе примера с подсчетом моделей лежит пример с подсчетом цветов на сайте Avro (см. раздел Ресурсы).

Этот пример включает три класса: один класс расширяет класс AvroMapper, другой класс расширяет класс AvroReducer, а третий класс содержит код для инициирования задания MapReduce и записи результатов.

Расширение класса AvroMapper

Класс AvroMapper расширяет и реализует несколько предоставляемых платформой Hadoop интерфейсов для сбора и для отображения данных. Чтобы продемонстрировать возможности Avro в функциях MapReduce, создайте небольшой класс, показанный ниже.

Листинг 11. Класс ModelCountMapper
package com.example.avroSample.mapReduce;

import java.io.IOException;

import org.apache.avro.mapred.AvroCollector;
import org.apache.avro.mapred.AvroMapper;
import org.apache.avro.mapred.Pair;
import org.apache.hadoop.mapred.Reporter;

import com.example.avroSample.model.Automobile;

/**
 * Class class will count the number of models of automobiles found.
 */
public final class ModelCountMapper extends
        AvroMapper<Automobile, Pair<CharSequence, Integer>> {

    private static final Integer ONE = Integer.valueOf(1);

    @Override
    public void map(Automobile datum,
            AvroCollector<Pair<CharSequence, Integer>> collector,
            Reporter reporter) throws IOException {

        CharSequence modelName = datum.getModelName();

        collector.collect(new Pair<CharSequence, Integer>(modelName, ONE));

    }

}

Метод map просто извлекает название модели из переданного извне объекта Automobile и добавляет значение "1" при каждом появлении определенного названия модели. Таким образом, в методе map нет никакой математики. И наоборот, математика для суммирования отсчетов находится в классе, который расширяет класс AvroReducer.

Расширение класса AvroReducer

В листинге 12 показан класс, расширяющий класс AvroReducer. Этот класс принимает значения, собранные объектом ModelCountMapper и суммирует их, циклически проходя по ним.

Листинг 12. Код для расширения класса AvroReducer
package com.example.avroSample.mapReduce;

import java.io.IOException;

import org.apache.avro.mapred.AvroCollector;
import org.apache.avro.mapred.AvroReducer;
import org.apache.avro.mapred.Pair;
import org.apache.hadoop.mapred.Reporter;

public class ModelCountReducer extends
        AvroReducer<CharSequence, Integer, Pair<CharSequence, Integer>> {

    /**
     * This method "reduces" the input
     */
    @Override
    public void reduce(CharSequence modelName, Iterable<Integer> values,
            AvroCollector<Pair<CharSequence, Integer>> collector, Reporter reporter)
            throws IOException {
        
        int sum = 0;
        
        for (Integer value : values) {
            sum += value.intValue();
        }
        
        collector.collect(new Pair<CharSequence, Integer>(modelName, sum));
        
    }

}

Метод reduce в классе ModelCountReducer "свертывает" значения, которые собрал mapper, в производное значение, которое в данном случае представляет собой простую сумму собранных значений.

Исполнение примера

Чтобы увидеть рассматриваемый пример в действии, создайте класс, который будет выполнять ваши классы с помощью класса AvroJob см. листинг 13).

Листинг 13. Учебный класс, выполняющий задание MapReduce
package com.example.avroSample.mapReduce;

import java.io.File;

import org.apache.avro.Schema;
import org.apache.avro.Schema.Type;
import org.apache.avro.mapred.AvroJob;
import org.apache.avro.mapred.Pair;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.util.Tool;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.example.avroSample.model.Automobile;

public class ModelNameCountApp extends Configured implements Tool {

    private static final Logger LOGGER = LogManager
            .getLogger(ModelNameCountApp.class);

    private static final String JOB_NAME = "ModelNameCountJob";

    @Override
    public int run(String[] args) throws Exception {

        JobConf job = new JobConf(getConf(), ModelNameCountApp.class);
        job.setJobName(JOB_NAME);

        FileInputFormat.setInputPaths(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        AvroJob.setMapperClass(job, ModelCountMapper.class);
        AvroJob.setReducerClass(job, ModelCountReducer.class);

        AvroJob.setInputSchema(job, Automobile.getClassSchema());
        AvroJob.setOutputSchema(
                job,
                Pair.getPairSchema(Schema.create(Type.STRING),
                        Schema.create(Type.INT)));

        JobClient.runJob(job);

        return 0;

    }

    /**
     * Creates an instance of this class and executes it to provide a call-able
     * entry point.
     */
    public static void main(String[] args) {

        if (args == null || args.length != 2) {
            throw new IllegalArgumentException(
                    "Two parameters must be supplied to the command, " + 
                    "input directory and output directory.");
        }
        
        new File(args[0]).mkdir();
        new File(args[1]).mkdir();

        int result = 0;

        try {
            result = new ModelNameCountApp().run(args);
        } catch (Exception e) {
            result = -1;
            LOGGER.error("An error occurred while trying to run the example", e);
        }

        if (result == 0) {
            LOGGER.info("SUCCESS");
        } else {
            LOGGER.fatal("FAILED");
        }

    }
}

В этом примере создается экземпляр объекта JobConf, а затем с помощью класса AvroJob выполняется конфигурирование задания перед его выполнением.

Чтобы выполнить пример изнутри Eclipse, нажмите Run > Run Configurations для открытия мастера Run Configurations Wizard. Выберите из списка опцию Java Application и нажмите New. Введите имя проекта и имя класса main (com.example.avroSample.mapReduce.ModelNameCountApp) на вкладке Main, а затем введите имя каталога, который вы использовали для результатов тестов, выполнявшихся ранее. Введите в поле Program Arguments имя подходящего выходного каталога, например target/avro target/mapreduce.

Когда вы закончите добавление имен каталогов, выберите опцию Run для выполнения примера.

В процессе выполнения этого примера он будет обращаться к объекту ModelCountReducer для сбора названий моделей и для подсчета каждого использования метода map(), а затем выполнит обработку отображения "ключи/значения" с помощью метода reduce() объекта ModelCountReducer. В нашем примере обработка сводится к простому добавлению отсчетов с целью их суммирования.


Заключение

Apache Avro — это инфраструктура сериализации, которая позволяет записывать данные объекта в поток. Сериализация Avro подразумевает наличие схемы — в формате JSON, — что позволяет иметь различные версии объектов. Хотя необходимость в генерации кода и прокси-объектов отсутствует, вы можете использовать инструменты Avro для генерации прокси-объектов на Java с целью упрощения работы с объектами.

Кроме того, Avro хорошо работает с Hadoop MapReduce. Инфраструктура MapReduce позволяет осуществлять крупномасштабную обработку множества объектов для одновременного выполнения вычислений на большом количестве процессоров. Кроме того, Avro и MapReduce можно использовать совместно с целью обработки множества элементов, сериализованных в компактный двоичный формат Avro.


Загрузка

ОписаниеИмяРазмер
Учебный программный кодavro-sample.zip11 КБ

Ресурсы

Научиться

  • Оригинал статьи: Big data serialization using Apache Avro with Hadoop.
  • Ознакомьтесь с примером ColorCount, который демонстрирует порядок использования Avro вместе с MapReduce.
  • Дополнительная информация по продукту Apache Maven и жизненному циклу сборки Maven.
  • Дополнительная информация по Apache Avro 1.7.5 и Avro JSON schema.
  • Дополнительная информация по Apache Ivy и Hadoop.
  • Пройдите бесплатный курс Hadoop Reporting and Analysis (Отчетность и анализ в Hadoop) на веб-сайте Big Data University (требуется регистрация). Вы научитесь создавать собственные отчеты по Hadoop и большим данным с использованием подходящих технологий Hadoop, таких как HBase, Hive и т.д., и получите рекомендации по выбору надлежащей технологии отчетности, включая Direct Batch Reports, Live Exploration и Indirect Batch Analysis.
  • Пройдите бесплатный курс Hadoop Fundamentals (Основы Hadoop) на сайте Big Data University (требуется регистрация). Вы узнаете об архитектуре Hadoop, а также о HDFS, MapReduce, Pig, Hive, JAQL, Flume и многих других технологиях, имеющих отношение к Hadoop. Пройдите практические занятия на кластере Hadoop в облаке, используя предоставленный VMware-образ или локальную установку.
  • Ознакомьтесь с бесплатными курсами на сайте Big Data University по различным темам (основы Hadoop, основы анализа текстов, SQL-доступ для Hadoop, потоковые вычисления в реальном времени и т. д.).
  • Создайте собственный Hadoop-кластер с помощью бесплатного руководства на веб-сайте Big Data University (требуется регистрация).
  • Дополнительная информация по большим данным на сайте developerWorks. Техническая документация, руководства, учебные пособия, материалы для загрузки, информация о продукции и многое другое.
  • Найдите ресурсы, которые помогут вам приступить к работе с InfoSphere BigInsights — аналитической платформой, основанной на программном обеспечении с открытым кодом Hadoop и расширяющей его возможности такими функциями, как Big SQL, анализ текста и BigSheets.
  • IBM InfoSphere BigInsights Tutorials (PDF) — учебные пособия для самостоятельного обучения по таким темам, как управление средой больших данных, импорт данных для анализа, анализ данных с помощью BigSheets, разработка своего первого приложения для работы с большими данными, разработка запросов Big SQL для анализа больших данных, создание экстрактора для извлечения осмысленной информации из текстовых документов с помощью InfoSphere BigInsights.
  • Найдите ресурсы, которые помогут вам приступить к работе с InfoSphere Streams — высокопроизводительной вычислительной платформой, которая позволяет пользовательским приложениям быстро принимать, анализировать и сопоставлять информацию по мере ее поступления из тысяч источников в реальном времени.
  • Следите за мероприятиями и трансляциями по техническим вопросам на Web-сайте developerWorks.
  • Материалы developerWorks в Твиттере..

Получить продукты и технологии

  • Загрузите исходный код примера с веб-сайта GitHub.
  • Загрузите двоичные файлы Apache Avro со страницы Releases для всех платформ, включая Java и PHP.
  • Загрузите двоичные файлы Jackson с веб-сайта Jackson.
  • Загрузите Eclipse с официального веб-сайта.
  • Загрузите продукт InfoSphere BigInsights Quick Start Edition, который поставляется как нативный установочный пакет программного обеспечения или как VMware-образ.
  • Загрузите продукт InfoSphere Streams, который поставляется как нативный установочный пакет программного обеспечения или как VMware-образ.
  • Оцените продукт InfoSphere Streams на платформе IBM SmartCloud Enterprise.
  • Используйте в своем следующем проекте по разработке ознакомительное программное обеспечение IBM, которое можно загрузить непосредственно с сайта developerWorks.

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Information Management
ArticleID=964073
ArticleTitle=Сериализация больших данных с использованием Apache Avro и Hadoop
publish-date=02252014