2015-12-04 4 views
0

В настоящее время я работаю над расширением функциональности Apache Knox, взаимодействующей с HBase на HDP 2.3.2. Я создал новый шлюз на Apache Knox под названием Decode, чтобы запросить HBase. Шлюз декодирования был построен с использованием шлюза HBase в качестве шаблона. Топологии были отредактированы таким образом, что следующий запрос:Расширение пользовательской службы Apache Knox для запроса нескольких таблиц HBase

curl -ku admin:admin-password -H "Accept: application/json" https://sandbox.hortonworks.com:8443/gateway/default/decode/hbase/MyHBaseTable/HBaseRowKey123* 

возвращает данные из Роу 123 (в базе 64)

Есть ли способ изменить rewrite.xml декодирования шлюза и service.xml так, чтобы запрос не нужно будет пройти через Hbase, например:

curl -ku admin:admin-password -H "Accept: application/json" https://sandbox.hortonworks.com:8443/gateway/default/decode/MyHBaseTable/HBaseRowKey123* 

Я понимаю, это может показаться странным, чтобы не использовать в встроенного шлюза HBase но общая цель состоит в том, чтобы расширить шлюз Decode таким образом, что он будет иметь возможность запрашивать несколько таблиц и/или несколько строк данных из HBase, а не по одной строке за раз.

В настоящее время мой Decode rewrite.xml является:

<rules> 
    <rule dir="IN" name="DECODE/decode/inbound" pattern="*://*:*/**/decode/{path=**}?{**}"> 
    <rewrite template="{$serviceUrl[DECODE]}/{path=**}?{**}"/> 
    </rule> 
    <rule dir="IN" name="DECODE/decode/inbound" pattern="*://*:*/**/decode{**}"> 
    <rewrite template="{$serviceUrl[DECODE]}/{path=**}?{**}"/> 
    </rule> 
    <filter name="WEBHBASE/webhbase/status/outbound"> 
    <content type="*/json"> 
     <apply path="$[LiveNodes][*][name]" rule="WEBHBASE/webhbase/address/outbound"/> 
    </content> 
    <content type="*/xml"> 
     <apply path="/ClusterStatus/LiveNodes/Node/@name" rule="WEBHBASE/webhbase/address/outbound"/> 
    </content> 
    </filter> 
</rules> 

и service.xml:

<service role="DECODE" name="decode" version="0.0.1"> 
    <routes> 
     <route path="/decode/**"/> 
    <route path="/decode/?**"> 
      <rewrite apply="WEBHBASE/webhbase/headers/outbound" to="response.headers"/> 
     </route> 
     <route path="/decode/**?**"> 
      <rewrite apply="WEBHBASE/webhbase/headers/outbound" to="response.headers"/> 
     </route> 
     <route path="/decode/status/cluster?**"> 
      <rewrite apply="WEBHBASE/webhbase/status/outbound" to="response.body"/> 
     </route> 
     <route path="/decode/*/regions?**"> 
      <rewrite apply="WEBHBASE/webhbase/regions/outbound" to="response.body"/> 
     </route> 
     </routes> <dispatch classname="org.apache.hadoop.gateway.hbase.HBaseDispatch"/> </service> 
+0

Я ничего не вижу в вашем текущем файле rewrite.xml, который указывает, что «hbase» требуется или ожидается. Когда вы говорите: «Вернет ли данные из строки 123 (на базе 64)», вы говорите, что это работает или что вы намерены работать так? – lmccay

ответ

2

Как @lmccay я не вижу ничего плохого в том, обязательно, что вы показали, так Я решил попробовать это для себя.

В файле топологии по умолчанию я скопировал службу WEBHBASE службе DECODE, как показано.

/usr/hdp/current/knox-server/conf/topologies/default.xml

<service> 
    <role>WEBHBASE</role> 
    <url>http://my-hbase-hostname:60080</url> 
</service> 
<service> 
    <role>DECODE</role> 
    <url>http://my-hbase-hostname:60080</url> 
</service> 

Затем я скопировал HBase service.xml и rewrite.xml от

/USR/HDP /current/knox-server/data/services/hbase/0.98.0

в новый каталог

/usr/hdp/current/knox-server/data/services/decode/0.0.1

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

/usr/hdp/current/knox-server/data/services/decode/0.0.1/service.xml

<service role="DECODE" name="decode" version="0.0.1"> 
    <routes> 
     <route path="/decode/?**"> 
      <rewrite apply="DECODE/decode/headers/outbound" to="response.headers"/> 
     </route> 
     <route path="/decode/**?**"> 
      <rewrite apply="DECODE/decode/headers/outbound" to="response.headers"/> 
     </route> 
     <route path="/decode/status/cluster?**"> 
      <rewrite apply="DECODE/decode/status/outbound" to="response.body"/> 
     </route> 
     <route path="/decode/*/regions?**"> 
      <rewrite apply="DECODE/decode/regions/outbound" to="response.body"/> 
     </route> 
    </routes> 
    <dispatch classname="org.apache.hadoop.gateway.hbase.HBaseDispatch"/> 
    <testURLs> 
     <testURL>/decode/version</testURL> 
     <testURL>/decode/version/cluster</testURL> 
     <testURL>/decode/status/cluster</testURL> 
     <testURL>/decode</testURL> 
    </testURLs> 
</service> 

/USR/HDP/ток/Нокс-сервер/данные/услуги/декодирования/0.0.1/rewrite.xml

<rules> 

    <rule dir="IN" name="DECODE/decode/root/inbound" pattern="*://*:*/**/decode/?{**}"> 
     <rewrite template="{$serviceUrl[DECODE]}/?{**}"/> 
    </rule> 

    <rule dir="IN" name="DECODE/decode/path/inbound" pattern="*://*:*/**/decode/{path=**}?{**}"> 
     <rewrite template="{$serviceUrl[DECODE]}/{path=**}?{**}"/> 
    </rule> 

    <rule name="DECODE/decode/location/outbound"> 
     <match pattern="*://*:*/{path=**}?{**}"/> 
     <rewrite template="{$frontend[url]}/decode/{path=**}?{**}"/> 
    </rule> 

    <rule name="DECODE/decode/address/outbound"> 
     <match pattern="{host}:{port}"/> 
     <rewrite template="{$frontend[url]}/hbase-region?host={host}?port={port}"/> 
     <encrypt-query/> 
    </rule> 

    <filter name="DECODE/decode/headers/outbound"> 
     <content type="application/x-http-headers"> 
      <apply path="Location" rule="DECODE/decode/location/outbound"/> 
     </content> 
    </filter> 

    <filter name="DECODE/decode/status/outbound"> 
     <content type="*/json"> 
      <apply path="$[LiveNodes][*][name]" rule="DECODE/decode/address/outbound"/> 
     </content> 
     <content type="*/xml"> 
      <apply path="/ClusterStatus/LiveNodes/Node/@name" rule="DECODE/decode/address/outbound"/> 
     </content> 
    </filter> 

    <filter name="DECODE/decode/regions/outbound"> 
     <content type="*/json"> 
      <apply path="$[Region][*][location]" rule="DECODE/decode/address/outbound"/> 
     </content> 
     <content type="*/xml"> 
      <apply path="/TableInfo/Region/@location" rule="DECODE/decode/address/outbound"/> 
     </content> 
    </filter> 

</rules> 

Я был тогда в состоянии запросить таблицу с командой завитка ниже. Это не содержит hbase в URL-адресе, который, как мне кажется, отвечает на ваш вопрос.

curl -k -u guest:******** -H 'Accept: application/json' https://localhost:8443/gateway/default/decode/t1/* 
{"Row":[{"key":"ZjE6djE=","Cell":[{"column":"ZjI6djI=","timestamp":1453139991995,"$":"ZjM6djM="}]}]} 
Смежные вопросы