ПредишенСледващото

Документът разглежда подробно примери, демонстриращи разширяване и прилагане CombineFileInputFormat класа да прочете съдържанието на GZIP файлове (кодек по подразбиране) по време на изпълнение. Ще се научите как да се прилагат CombineFileInputFormat с MapReduce технология за разделяне на размера на парче, консумирани Mapper интерфейс данни, от размера на файла на блока в HDFS.

Sujan Som. Консултант и разработчик на големи приложения за данни, IBM

Apache Hadoop софтуерна библиотека ви позволява да манипулират данните в различни формати, от обикновени текстови файлове с бази данни. среда, използвана MapReduce InputFormat класа да се оцени спецификация вход и разделяне на входните файлове в логически InputSplit обекти, всеки от които след това се получават конкретен случай Mapper.

FileInputFormat. който е базов клас за всички файлови формати InputFormat. Той има следните преки подкласове:

  • TextInputFormat
  • SequenceFileInputFormat
  • NLineInputFormat
  • KeyValueTextInputFormat
  • CombineFileInputFormat

Всеки един от тези класове InputFormat предлага общо изпълнение на getSplits методът (JobContext). който също може да заместващ метод isSplitable (JobContext. Path), че входните файлове не са напълно отделени и преработени Mapper интерфейс. Той реализира createRecordReader клас. org.apache.hadoop.mapreduce.InputFormat наследена от класа. който се използва за събиране на входните записи от логично InputSplit обекта за обработка на Mapper интерфейс.

InfoSphere BigInsights Quick Start Edition

Но Hadoop работи по-ефективно с малко на брой големи файлове, отколкото с голям брой малки файлове. (В този случай, "малък образ" означава, че размерът му е много по-малък от размера на Hadoop Distributed File System единица (HDFS)). Проблемът е решен чрез създаване CombineFileInputFormat клас. която работи ефективно с по-малки файлове до FileInputFormat клас създаде преграда за файлове. CombineFileInputFormat поставя много файлове във всеки един елемент, всеки Mapper например има повече данни, за да обработват. Клас CombineFileInputFormat може също да предостави предимства при обработката на големи файлове. В действителност, той разделя размера на парче, потреблението Mapper интерфейс, от размера на файла на блока в HDFS.

В момента CombineFileInputFormat е абстрактен клас в библиотеката клас Hadoop (org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat) Без никакво специално изпълнение. За да използвате CombineFileInputFormat трябва да се създаде специфичен подклас CombineFileInputFormat и прилагане CombineFileInputFormat и прилагане на метода на createRecordReader (). че създава обект оправомощилият клас CustomFileRecordReader. разширяване RecordReader. с помощта на специален конструктор. Този подход изисква също така, че CustomWritable е създадена като ключ за класа Hadoop Mapper. За всеки ред CustomWritable ключ ще съдържа името на файла и на изместването на линията.

Открийте пример Hadoop. който демонстрира как да се използват CombineFileInputForma да брои, където се среща думи в текстови файлове в определен вход директория.

Тук ще научите как да се разшири и прилага CombineFileInputFormat. добавяне на способността да се чете съдържанието на GZIP файлове (кодек по подразбиране) в Runtime разопакован. Ние ще произвежда в резултат на ключ-стойност, когато е ключът - това е комбинация от името на файла и линията офсет, а стойността - това е текстово представяне на тази поредица. Примерът в тази статия използва CustomInputFormat в околната среда MapReduce. Ние ще се развива следните основни класове:

CompressedCombineFileInputFormat Разширява CombineFileInputFormat createRecordReader и се продава за прехвърляне на четеца за записи, които изпълнява логиката за Съединените CompressedCombineFileRecordReader Разширява RecordReader файлове и се делегира клас CombineFileRecordReader CompressedCombineFileWritable Реализира Interface WritableComparable. магазини името на файла и отместването, както и замества метода compareTo. за сравнение на първото име на файла и след това компенсира.

Пример CompressedCombineFileInputFormat използва MapReduce програма, която използва публични исторически данни за времето на Националния океанска и атмосферна администрация (Националната океанска и атмосферна администрация, NOAA). NOAA събира статистически данни за оптимална работа за американските централи, използващи месечни справки за три метеорологични данни - температура, валежи и сняг. Както се използва тук, пример изчислява максималната температура на метеорологичните данни (National климатични данни център), които са на разположение в компресиран (софтуерна) файл. Секцията ресурси предоставя допълнителна информация за това как да се получи метеорологични данни.

Форматът на вход за различни компресирани файлове

Нашето решение използва сгъстен CombineFileInputFormat. която използва три специфични класове:

  • Резюме CombineFileInputFormat изпълнение подклас (org.apache.hadoop.mapreduce.lib.input. CombineFileInputFormat)
  • Бетон подклас RecordReader (org.apache.hadoop.mapreduce.RecordReader)
  • Специален клас писане. която изпълнява WritableComparable и генерира основните линии на файла, който съдържа името на файла и офсетов линии.

CompressedCombineFileInputFormat

CompressedCombineFileInputFormat.java - подклас CombineFileInputFormat. Той реализира InputFormat.createRecordReader (InputSplit, TaskAttemptContext) за изграждане на съоръжения за RecordReader subcollections CombineFileSplit входни файлове. За разлика от FileSplit. CombineFileSplit клас не е за споделяне на файлове, както и разделението на входни файлове на по-малки серии. Разделянето може да съдържа елементи на различни файлове, но всички блокове в един и същи набор трябва да бъде местно за определен пост. CombineFileSplit използвана за изпълнение RecordReader като прочетете един ред за всеки файл. Разполовявам файлове не се изискват, за да isSplitable () метод се заменя да се върне стойността невярно (в противен случай тя ще се установи на истинския по подразбиране). Един пример е показан на Обявата 1.

Списък 1. CompressedCombineFileInputFormat.java

CompressedCombineFileRecordReader

CompressedCombineFileRecordReader.java - е делегиране клас CombineFileRecordReader. Това е един общ клас RecordReader, което може да изходни различни инстанции RecordReader всеки блок в CombineFileSplit. CombineFileSplit да комбинирате части данни от множество файлове. Тя ви позволява да използвате различни инстанции RecordReader за обработка на парчета от данни от различни файлове.

Когато задачата се нарича Hadoop, CombineFileRecordReader чете размерите на всички файлове в HDFS вход път, което е необходимо да се обработват и да реши колко искате да дивизия, на базата на MaxSplitSize на стойност. За всеки набор разделени (който трябва да бъде даден файл, като isSplitabe () метод връща невярна и заменя стойност) CombineFileRecordReader CompressedCombineFileRecordReader създава инстанция и предава CombineFileSplit. контекст и индекс за CompressedCombineFileRecordReader за откриване на файлове за преработка.

След примерна CompressedCombineFileRecordReader определя дали изображението въвеждане включва кодек компресия (org.apache.hadoop.io.compress.GzipCodec). Ако е така, тогава файлът е разопакован в Runtime и се използва за преработка. В противен случай, тя се счита за един текстов файл. Когато обработката на CompressedCombineFileRecordReader файл създава CompressedCombineFileWritable като ключов да се обадите на клас картограф. За всеки чете линия CompressedCombineFileWritable съдържа името на файла и компенсиране на тази дължина линия, както е показано в пример MapReduce.

Обява 2 показва пример CompressedCombineFileRecordReader.java.

Обявата 2. CompressedCombineFileRecordReader.java

CompressedCombineFileWritable

CompressedCombineFileWritable.java клас изпълнява интерфейса и се простира WritableComparable org.apache.hadoop.io.Writable, java.lang.Comparable. както е показано на Обявата 3.

Писане - Тази поредица обект, който реализира прост и ефективен протокол сериализация на базата на вложени материали и О произведена продукция. Всякакъв вид ключ или стойност в околната среда MapReduce реализира този интерфейс. Реализациите обикновено използват статичен метод за четене (вложени материали). което създава нов например на метода за причините readFields (вложени материали). и връща инстанция.

Сравними - е интерфейсът, който е част от Java ™ Колекции рамка (JCF). Той се прилага пълен поръчване обектите на всеки клас, които тя изпълнява. Тази подредба се нарича естествен подреждането на класа. метод клас compareTo се нарича естествен сравнението. Списъци (или масиви) на обекти, които прилагат този интерфейс могат да се сортират автоматично от Collections.sort (и Arrays.sort). Обектите, които прилагат този интерфейс може да се използват като ключове в сортиран колекция карта или като елементи в сортиран сет, без да се налага да се уточни за сравнение.

Благодарение на тези свойства, можете да сравните CompressedCombineFileWritable използване на контролите. хеш-код () команда често се използва за разделяне на ключове Hadoop. Важно е, че изпълнението на хеш-код () връща същия резултат за различни случаи JVM. изпълнението по подразбиране на хеш-код () в обекта не отговаря на този имот. Следователно хеш-код () методи. се равнява на () и ToString () заменя за да се гарантира последователност и ефективност.

Обява 3. CompressedCombineFileWritable.java

например MapReduce

Примерът в този раздел показва как да използвате CompressedCombineFileInputFormat с MapReduce програма. MapReduce програма използва данни от метеорологични статистиката на NOAA готови за оптимална работа на американските бензиностанции под формата на месечни доклади за температурата, валежите и дълбочина на снега. Пример изчислява максималната температура на метеорологични данни, които се пресоват (софтуерна) файл.

Примерът се обсъждат различни аспекти на CompressedCombineFileInputFormat. За да стартирате пробата се използва платформа InfoSphere BigInsights Quick Start Edition.

  • Внедрена и работи Hadoop сряда.
  • Изисква се за извадковите данни, изтеглени от Националния център за климатични данни управлението (Национална климатични данни център. NCDC) NOAA.
  • Изтегленият Данните се съхраняват в HDFS.
  • Получените статистически данни се обработват InfoSphere BigInsights Quick Start Edition (в непроизводствени среда на) платформа.

Работещи примера

класове CompressedCombineFileInputFormat са опаковани в JAR файл (CompressedCombine-FileInput.jar), което може да бъде посочено в други проекти. Ние ще използваме отделни програми MapReduce, за да покаже разликата в производителността при използване на формат на въвеждане по подразбиране (org.apache.hadoop.io.Text) и специален формат вход (com.ssom.combinefile.lib.input. CompressedCombineFileInputFormat).

вход

са публично достъпни данни NCDC. Таблица 1 показва формата на данните NCDC в нашите примери.

Таблица 1. Данни NCDC

Файловете с данни се организират по дата, както и от метеорологичните станции. Има една директория за всяка година, започвайки от 1901 на юли. Всяка директория съдържа компресиран файл за всеки данни метео станция за всяка година. Фигура 1 показва първо вписване за 1947.

Фигура 1. Пример на списък на файлове

Обработка на малки компресирани файлове с помощта на Hadoop combinefileinputformat клас

Избрах данните за 1901, 1902 и 1947, които се съдържат в повече от 1000 компресирани файлове. Общият обем на файловете е около 56 MB.

Използване на въвеждане на формата по подразбиране

Клас Mapper - този най-общ тип с четири вида формални параметри, които определят видовете клавиши за въвеждане, въведете стойност, за превключване на изходящата и една изходна стойност на карта функция, както е показано по-долу.

форматът на въвеждане по подразбиране:

  • Въведете ключ - дълго цяло число стойност на отклонението
  • Въведената стойност - низ от текст
  • Изходна ключ - през тази година
  • Стойността изход - е температурата (число)

карта () метод получава ключ и стойност конвертиране редът за въвеждане на текст стойност низ Java. След това използва метода подниз () за извличане на стойности. В този случай Mapper записва годината като обект текст (защото ние просто го използвате като основен) и температурата се съкратена IntWritable тип обект. Изходна запис се записва само ако присъства температура и качество кода показва правилните температура показатели.

Клас редуктор - това също е общ тип. Тя има четири формален параметър тип се използва за задаване на входните и изходните видове. видове продукция се намали функция Текст и IntWritable. година, а максималната температура, която се получава чрез повторение на температурите и сравняване на всеки един от тях с рекорд на най-голямата от намерените стойности. определение редуктор клас, както следва:

Резултатът ще изглежда, както е показано по-долу, ако има запис в продължение на няколко години.

Фигури 2 и 3 показват резултатите от програмата във формат въвеждане по подразбиране (текст) в административната конзола InfoSphere BigInsights.

Фигура 2. Tab Състояние на молбата - с изпълнение по подразбиране

Обработка на малки компресирани файлове с помощта на Hadoop combinefileinputformat клас

Фигура 4 показва резултата от програма MapReduce.

Фигура 4. съдържанието на файла отговор - изпълнение по подразбиране

Обработка на малки компресирани файлове с помощта на Hadoop combinefileinputformat клас

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

Сега ние отново ще използваме класа Mapper, че е общ тип, с CompressedCombineFileWritable като ключа за вход, както е показано по-долу.

Редуктор клас остава същата, без никакви промени, и има следното определение:

За да се определи, които използваме настройката за вход формат:

Примери за ключ и стойност:

Фигури 5 и 6 показват резултат от използването на специален вход формат (CompressedCombineFileInputFormat) на административна конзола InfoSphere BigInsights.

Фигура 5. Прилагане Статус панел - версия със специален формат

Обработка на малки компресирани файлове с помощта на Hadoop combinefileinputformat клас

Фигура 7 показва резултата от програма MapReduce.

Фигура 7. Съдържанието на файла с отговори - версия с помощта на специален формат

Обработка на малки компресирани файлове с помощта на Hadoop combinefileinputformat клас

заключение

Ако е възможно, се препоръчва да се избягва боравенето с много малки файлове, както MapReduce се реализира най-добре в случай, че може да работи със скоростта на трансфер на данни диск в клъстера. Обработка на много малки файлове, увеличаване на броя на операции за търсене, които са необходими за възлагане. Ако по някаква причина, бизнес или стратегически характер, имате голям брой малки файлове и HDFS е на разположение, можете да използвате CombineFileInputFormat клас. CombineFileInputFormat е не само полезно за малки файлове, но също така може да осигури подобрена производителност при обработката на големи файлове.

Вземете продукти и технологии

Подкрепете проекта - споделете линка, благодаря!