HBase
 sql >> база данни >  >> NoSQL >> HBase

Как да:Включете библиотеки на трети страни във вашата задача MapReduce

„Моята библиотека е в пътя към класа, но все още получавам изключение „Клас не е намерен“ в задание на MapReduce“ – Ако имате този проблем, този блог е за вас.

Java изисква класове от трети страни и дефинирани от потребителя да бъдат в командния ред „–classpath ” опция при стартиране на JVM. Скриптът на обвивката `hadoop` прави точно това за вас, като изгражда пътя към класа от основните библиотеки, намиращи се в /usr/lib/hadoop-0.20/ и /usr/lib/hadoop-0.20/lib/ директории. Въпреки това, с MapReduce вашите опити за задача на заданието се изпълняват на отдалечени възли. Как да кажете на отдалечена машина да включва класове на трети страни и дефинирани от потребителя?

Задачите на MapReduce се изпълняват в отделни JVM на TaskTrackers и понякога трябва да използвате библиотеки на трети страни в опитите за картографиране/намаляване на задачи. Например, може да искате да получите достъп до HBase от задачите си за карта. Един от начините да направите това е да пакетирате всеки клас, използван в подаваемия JAR. Ще трябва да разопаковате оригиналния hbase-.jar и преопаковайте всички класове във вашия готов за изпращане Hadoop буркан. Не е добре. Не правете това:Проблемите със съвместимостта на версиите ще ви ухапят рано или късно.

Има по-добри начини да направите същото, като поставите своя jar в разпределения кеш или инсталирате целия JAR на възлите на Hadoop и кажете на TaskTrackers за тяхното местоположение.

1. Включете JAR в „-libjars ” опция от командния ред на командата `hadoop jar ...`. Бурканът ще бъде поставен в разпределения кеш и ще бъде предоставен за всички опити за изпълнение на задачата. По-конкретно, ще намерите JAR в един от ${mapred.local.dir}/taskTracker/archive/${user.name}/distcache/… поддиректории на локални възли. Предимството на разпределения кеш е, че вашият jar може все още да е там при следващото стартиране на вашата програма (поне на теория:файловете трябва да бъдат изхвърлени от разпределения кеш само когато надвишават мекото ограничение, определено от local.cache .размер конфигурационна променлива, по подразбиране е 10 GB, но действителният ви пробег може да варира особено при най-новите подобрения на сигурността). Hadoop следи промените в разпределените кеш файлове, като проучва времевата им марка за промяна.

*Актуализиране за публикуване:Моля, имайте предвид, че елементи 2 и 3 по-долу са отхвърлени от CDH4 и вече няма да се поддържат от CDH5.

2. Включете посочения JAR в поддиректорията lib на подаваемия JAR:задача MapReduce ще разопакова JAR-а от тази поддиректория в ${mapred.local.dir}/taskTracker/${user.name}/jobcache/$ jobid/буркани на възлите на TaskTracker и насочете задачите си към тази директория, за да направите JAR достъпен за вашия код. Ако JAR-овете са малки, променят се често и са специфични за работата, това е предпочитаният метод.

3. И накрая, можете да инсталирате JAR на възлите на клъстера. Най-лесният начин е да поставите JAR в $HADOOP_HOME/lib директория, тъй като всичко от тази директория се включва при стартиране на Hadoop демон. Въпреки това, тъй като знаете, че само TaskTrackers ще се нуждаят от тези новия JAR, по-добър начин е да промените опцията HADOOP_TASKTRACKER_OPTS в конфигурационния файл hadoop-env.sh. Този метод е предпочитан, ако JAR е свързан с кода, изпълняван на възлите, като HBase.

HADOOP_TASKTRACKER_OPTS="-classpath<colon-separated-paths-to-your-jars>"

Рестартирайте TastTrackers, когато сте готови. Не забравяйте да актуализирате jar, когато основният софтуер се промени.

Всички горепосочени опции засягат само кода, изпълняван на разпределените възли. Ако вашият код, който стартира задачата Hadoop, използва същата библиотека, трябва да включите и JAR-а в променливата на средата HADOOP_CLASSPATH:

HADOOP_CLASSPATH="<colon-separated-paths-to-your-jars>"

Имайте предвид, че започвайки с Java 1.6 classpath може да сочи към директории като „/path/to/your/jars/* ” който ще вземе всички JAR файлове от дадена директория.

Същите ръководни принципи важат за библиотеки с собствен код, които трябва да се изпълняват на възлите (JNI или C++ канали). Можете да ги поставите в разпределения кеш с „-файлове ”, включете ги в архивни файлове, посочени с „-архиви ” или ги инсталирайте на възлите на клъстера. Ако линкерът за динамична библиотека е конфигуриран правилно, естественият код трябва да бъде наличен за вашите опити за изпълнение на задачи. Можете също да промените средата на опитите за изпълнение на задачата изрично, като посочите променливи JAVA_LIBRARY_PATH или LD_LIBRARY_PATH:

hadoop jar <your jar> [main class]
      -D mapred.child.env="LD_LIBRARY_PATH=/path/to/your/libs" ...

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Въведение в HDFS федерация и архитектура

  2. Надстройка на HBase върху извора на събития и архитектурата CQRS за 3 седмици

  3. Защита на оперативната база данни – част 1

  4. Въведение в разпределения кеш в Hadoop

  5. Топ 10 характеристики на Big Data Hadoop