Има различни начини за достъп и взаимодействие с Apache HBase. Най-вече, API на Java осигурява най-много функционалност. Но някои хора искат да използват HBase без Java.
Тези хора имат две основни опции:едната е интерфейсът Thrift (по-леката и следователно по-бърза от двете опции), а другата е интерфейсът REST (известен още като Stargate). Интерфейсът REST използва HTTP глаголи за извършване на действие. Използвайки HTTP, REST интерфейсът предлага много по-широк набор от езици и програми, които имат достъп до интерфейса. (Ако искате повече информация за REST интерфейса, можете да отидете в моята поредица от инструкции за него.)
В тази серия от инструкции ще научите как да заобиколите интерфейса на Thrift и ще разгледате примерни кодове на Python за това. Тази първа публикация ще обхване HBase Thrift, работа с Thrift и някакъв шаблонен код за свързване с Thrift. Втората публикация ще покаже как да вмъкнете и получите няколко реда наведнъж. Третата публикация ще обясни как да използвате сканирания и някои съображения при избора между REST и Thrift.
Пълните примерни кодове могат да бъдат намерени в моя акаунт в GitHub.
HBase Thrift
Thrift е софтуерна рамка, която ви позволява да създавате междуезици. В контекста на HBase Java е единственият първокласен гражданин. Въпреки това, интерфейсът HBase Thrift позволява на други езици да имат достъп до HBase през Thrift чрез свързване към Thrift сървър, който взаимодейства с Java клиента.
За да работят както Thrift, така и REST, трябва да работи друг демон HBase, който да обработва тези заявки. Тези демони могат да бъдат инсталирани с пакетите hbase-thrift и hbase-rest. Диаграмата по-долу показва как Thrift и REST са поставени в клъстера.
Обърнете внимание, че хостовете на Thrift и REST клиентите обикновено не изпълняват други услуги (като DataNodes или RegionServers), за да поддържат режийните разходи ниски и висока отзивчивост за REST или Thrift взаимодействия.
Не забравяйте да инсталирате и стартирате тези демони на възли, които имат достъп както до клъстера Hadoop, така и до приложението, което се нуждае от достъп до HBase. Интерфейсът Thrift няма вградено балансиране на натоварването, така че цялото балансиране на натоварването ще трябва да се извършва с външни инструменти, като DNS кръгъл, виртуален IP адрес или в код. Cloudera Manager също така улеснява инсталирането и управлението на услугите HBase REST и Thrift. Можете да изтеглите и изпробвате безплатно в Cloudera Standard!
Недостатъкът на Thrift е, че е по-трудно да се настрои от REST. Ще трябва да компилирате Thrift и да генерирате специфичните за езика връзки. Тези връзки са хубави, защото ви дават код за езика, на който работите – няма нужда да анализирате XML или JSON, както в REST; по-скоро интерфейсът Thrift ви дава директен достъп до данните в реда. Друга приятна характеристика е, че протоколът Thrift има собствен двоичен транспорт; няма да е необходимо да кодирате и декодирате данни в base64.
За да започнете да използвате интерфейса Thrift, трябва да разберете на кой порт работи. Портът по подразбиране за CDH е порт 9090. За тази публикация ще видите използваните променливи за хост и порт, ето стойностите, които ще използваме:
host ="localhost"port ="9090"
Можете да настроите интерфейса на Thrift да използва идентификационни данни на Kerberos за по-добра сигурност.
За вашия код ще трябва да използвате IP адреса или пълното име на домейн на възела и порта, изпълняващ демона Thrift. Силно препоръчвам да направите този URL променлива, тъй като може да се промени с промени в мрежата.
Езикови връзки
Преди да можете да създадете Thrift обвързвания, трябва да изтеглите и компилирате Thrift. Няма двоични пакети за Thrift, които мога да намеря, освен в Windows. Ще трябва да следвате инструкциите на Thrift за инсталиране на избрана от вас платформа.
След като Thrift бъде инсталиран, трябва да намерите файла Hbase.thrift. За да дефинирате услугите и типовете данни в Thrift, трябва да създадете IDL файл. За щастие разработчиците на HBase вече създадоха такъв за нас. За съжаление, файлът не се разпространява като част от двоичните пакети на CDH. (Ще поправим това в бъдеща CDH версия.) Ще трябва да изтеглите изходния пакет на версията на HBase, която използвате. Уверете се, че използвате правилната версия на HBase, тъй като този IDL може да се промени. В компресирания файл пътят към IDL е hbase-VERSION/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift.
Thrift поддържа генериране на езикови връзки за повече от 14 езика, включително Java, C++, Python, PHP, Ruby и C#. За да генерирате връзките за Python, ще използвате следната команда:
thrift -gen py /path/to/hbase/source/hbase-VERSION/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
След това ще трябва да получите кода на Thrift за вашия език, който съдържа всички класове за връзка с Thrift и неговите протоколи. Този код може да бъде намерен в /path/to/thrift/thrift-0.9.0/lib/py/src/.
Ето командите, които изпълних, за да създам проект на Python за използване на HBase Thrift:
$ mkdir HBaseThrift$ cd HBaseThrift/$ thrift -gen py ~/Downloads/hbase-0.94.2-cdh4.2.0/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.vhrift gen-py/* . $ rm -rf gen-py/$ mkdir thrift$ cp -rp ~/Downloads/thrift-0.9.0/lib/py/src/* ./thrift/
Обичам да запазя копие на файла Hbase.thrift в проекта, за да се позова отново. Той има много „Javadoc“ за различните извиквания, обекти с данни и обекти за връщане.
$ cp ~/Downloads/hbase-0.94.2-cdh4.2.0/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
Шаблонен код
Ще откриете, че всичките ви скриптове на Python Thrift ще изглеждат много сходни. Нека да преминем през всяка част.
от thrift.transport import TSocketот thrift.protocol import TBinaryProtocolfr thrift.transport import TTransportот hbase import Hbase
Те ще импортират нужните модули Thrift и HBase.
# Свързване към HBase Thrift servertransport =TTransport.TBufferedTransport(TSocket.TSocket(host, port))protocol =TBinaryProtocol.TBinaryProtocolAccelerated(transport)
Това създава транспортния и линейния протокол на сокета и позволява на Thrift клиента да се свърже и разговаря със сървъра на Thrift.
# Създайте и отворете клиентската връзкаclient =Hbase.Client(protocol)transport.open()
Тези редове създават обекта Client, който ще използвате за взаимодействие с HBase. От този клиентски обект ще издадете всичките си Gets и Puts. След това отворете сокета към Thrift сървъра.
# Направете нещо
След това всъщност ще работите с клиента HBase. Всичко е конструирано, инициализирано и свързано. Първо започнете да използвате клиента.
transport.close()
Накрая затворете транспорта. Това затваря сокета и освобождава ресурсите на Thrift сървъра. Ето кода в неговата цялост за лесно копиране и поставяне:
от thrift.transport import TSocketfrom thrift.protocol import TBinaryProtocolfrom thrift.transport import TTransportот hbase import Hbase# Свързване към HBase Thrift servertransport =TTransport.TBufferedTransport(TSocket.TBufferedTransport(TSocket.TBufferedTransport(TSocket.TBocket.TSocket)Protocketl) # Създайте и отворете клиентската връзкаклиент =Hbase.Client(protocol)transport.open()# Направете нещоtransport.close()
В Python реализацията на HBase Thrift всички стойности се предават като низове. Това включва двоични данни като цяло число. Всички стойности на колони се съхраняват в обекта TCell. Ето дефиницията във файла Hbase.thrift:
struct TCell{ 1:байтова стойност, 2:i64 timestamp
Забележете промяната в низ, когато се генерира кодът на Python:
thrift_spec =( Няма, # 0 (1, TType.STRING, 'value', None, None, ), # 1 (2, TType.I64, 'timestamp', None, None, ), # 2)предварително>
Написах помощен метод за да улесня справянето с 32-битови цели числа. За да промените цяло число напред и назад между низ, използвате тези два метода.
# Метод за кодиране на ints със string encodingdef encode(n): return struct.pack("i", n)# Метод за декодиране на ints с низовия encodingdef decode на Thrift: return struct.unpack('i') , s)[0]
Имайте предвид това предупреждение, докато работите с двоични данни в Thrift. Ще трябва да конвертирате двоични данни в низове и обратно.
Грешка
Не е толкова лесно, колкото би могло да бъде да се разберат грешките в интерфейса Thrift. Например, ето грешката, която излиза от Python, когато таблица не е намерена:
Проследяване (последно последно обаждане): Файл "./get.py", ред 17, вредове =client.getRow(tablename, "shakespeare-comedies-000001") Файл "/mnt/hgfs/ jesse/repos/DevHivePigHBaseVM/training_materials/hbase/exercises/python_bleets_thrift/hbase/Hbase.py", ред 1038, в getRow return self.recv_getRow() Файл "/mnt/hgfs//jetrainhBeposterii/jetrainhBeposterii/jetrainhBepseiers/devbasseeM /python_bleets_thrift/hbase/Hbase.py", ред 1062, в recv_getRow повиши result.iohbase.ttypes.IOError:IOError(_message='doesnotexist')
Не всичко обаче е загубено, защото можете да погледнете регистрационния файл на HBase Thrift. В CDH този файл се намира в /var/log/hbase/hbase-hbase-thrift-localhost.localdomain.log. В примера за липсваща таблица ще видите грешка в дневника на Thrift, която казва, че таблицата не съществува. Неудобно е, но можете да отстраните грешки от там.
В следващата част ще разгледам вмъкването и получаването на редове.
Джеси Андерсън е инструктор за университета Cloudera.