'tajo'에 해당되는 글 5건

  1. 2015.05.27 [Apache Tajo] Apache Tajo 데스크탑 + Zeppelin 연동 하기
  2. 2015.05.15 [Elasticsearch] Apache Tajo & Elasticsearch 한글 README
  3. 2015.05.14 [Elasticsearch] Collaborate Apache Tajo + Available SQL on Elasticsearch
  4. 2015.03.31 도전! Apache Tajo Contributor.
  5. 2015.03.27 [Elasticsearch] elasticsearch를 apache tajo의 external storage로 사용하기 3

[Apache Tajo] Apache Tajo 데스크탑 + Zeppelin 연동 하기

ITWeb/Apache Tajo 2015. 5. 27. 18:35

Apache Tajo 데스크탑 버전과 Zeppelin을 이용한 분석 환경 구성입니다.

모든 설치 및 사용 가이드는 각각의 홈페이지에 자세히 나와 있습니다.

단지 제가 실행한 로그만 모아서 글 남겨 봅니다.


Apache Tajo 데스크탑 설치 하기


1. 다운로드 및 설치 가이드

http://www.gruter.com/blog/getting-started-with-tajo-on-your-desktop/


2. 압축 해제 하기

$ tar -xvzf tajo-0.11.0-desktop-3.0.tar.gz

$ ln -s tajo-0.11.0-desktop-3.0 tajo

$ cd tajo


3. 설정 하기

$ bin/configure.sh

Enter JAVA_HOME [required]

/Library/Java/JavaVirtualMachines/jdk1.7.0_55.jdk/Contents/Home

Would you like advanced configure? [y/N]

y

Enter tajo.rootdir [default: file:///Users/hwjeong/temp/kgloballondon/tajo/data/tajo]


Enter tajo.staging.directory [default: file:///Users/hwjeong/temp/kgloballondon/tajo/data/staging]


Enter tajo.worker.tmpdir.locations [default: /Users/hwjeong/temp/kgloballondon/tajo/data/tempdir]


Enter heap size(MB) for worker [default: 1024]


Done. To start Tajo, run /Users/hwjeong/temp/kgloballondon/tajo/bin/startup.sh

- JAVA_HOME 설정은 개발환경에 맞춰 설정 하시면 됩니다.
- advanced configure 설정은 따로 하지 않으셔도 되지만 어떤 항목이 있는지 확인하기 위해 "y"를 선택했습니다.
- OSX 사용자의 경우 아래와 같이 확인 하시면 됩니다.
$ /usr/libexec/java_home -v 1.7
또는
$ /usr/libexec/java_home -v 1.6

4. Tajo 실행 하기
$ bin/startup.sh
starting master, logging to /Users/hwjeong/temp/kgloballondon/tajo/bin/../logs/tajo-hwjeong-master-jeong-ui-MBP.out
Tajo master starting....Connection to localhost port 26003 [tcp/*] succeeded!
Tajo master started.

starting worker, logging to /Users/hwjeong/temp/kgloballondon/tajo/bin/../logs/tajo-hwjeong-worker-jeong-ui-MBP.out
Tajo worker started.

Tajo master web UI
http://localhost:26080

5. 테스트 데이터 등록
$ bin/make-test.sh
Databases and tables for test were successfully created.

6. Tajo Shell 명령어 실행
$ bin/tsql

default> \c tpc_h10m
You are now connected to database "tpc_h10m" as user "hwjeong".
tpc_h10m> \d
customer
lineitem
nation
orders
part
partsupp
region
supplier
tpc_h10m>

여기까지는 "다운로드 및 설치 가이드"에 나와 있는 것과 동일 합니다.
다만 제가 수행한 로그를 기록한 것 뿐입니다.

Zeppelin 설치 하기

1. 다운로드 및 설치 가이드
https://zeppelin.incubator.apache.org/docs/install/install.html

2. git clone 하기
$ git clone https://github.com/apache/incubator-zeppelin.git zeppelin
Cloning into 'zeppelin'...
remote: Counting objects: 21256, done.
remote: Total 21256 (delta 0), reused 0 (delta 0), pack-reused 21256
Receiving objects: 100% (21256/21256), 10.76 MiB | 1.75 MiB/s, done.
Resolving deltas: 100% (8584/8584), done.
Checking connectivity... done.
$ cd zeppelin

3. Local mode 로 빌드하기
$ sudo mvn clean install -DskipTests
- sudo 로 실행한 이유는 dependency 설치 시 권한 문제로 인한 오류를 예방하기 위해서 입니다.

4. Zeppelin 실행 하기
$ bin/zeppelin-daemon.sh start
Zeppelin start                                             [  OK  ]
-  중지는 start 대신 stop 하시면 됩니다.
$ bin/zeppelin-daemon.sh stop
Zeppelin stop                                              [  OK  ]

5. Zeppelin WebUI 접속 하기
http://localhost:8080/

Zeppelin에서 Apache Tajo SQL 사용 하기

1. Note 생성 하기


2. Tajo 질의 작성 하기

## Note 2AQG17JRB를 클릭 하세요.

%tajo select * from tpc_h10m.nation;


%tajo 

SELECT n.n_name as nation, sum(o.o_totalprice) as order_amount 

FROM tpc_h10m.customer c, tpc_h10m.nation n, tpc_h10m.orders o 

WHERE c.c_nationkey = n.n_nationkey 

and o.o_custkey = c.c_custkey 

GROUP BY c.c_nationkey, n.n_name 

ORDER BY n.n_name;

- "%tajo" 부분은 zeppelin의 interpreter binding 정보를 참고 하시면 되며, tajo를 지정한 내용입니다.

- tajo의 tsql에서 제공하는 "\명령어"는 지원되지 않기 때문에 사용에 유의 하셔야 합니다.



3. 질의 결과를 Graph로 보기

Command Shell 하단에 그래프 아이콘을 클릭 하시면 결과를 보실 수 있습니다.


여기까지 제공된 문서를 기반으로 구성해본 내용이였습니다.

더불어 Apache Tajo와 Zeppelin과의 통신은 JDBC Driver를 통해서 이루어 집니다.




:

[Elasticsearch] Apache Tajo & Elasticsearch 한글 README

Elastic/Elasticsearch 2015. 5. 15. 11:20

원본링크)

https://github.com/gruter/tajo-elasticsearch/blob/master/README.KR.md


Apache Tajo & Elasticsearch

  • Collaborate Apache Tajo + Elasticsearch
  • Apache Tajo의 External Storage로 구현된 내용입니다.
  • 설치 가이드

Software Stack

  • 스택이랄 것까지는 없지만 기본은 Apache Tajo + Elasticsearch 입니다.
  • 각 open source 별 패키지 종속은 갖기 때문에 사용전에 확인 하시고 필요한 것들을 설치해 주셔야 합니다.
  • 기본적으로 소스 받으셔서 빌드 하신 후 설치 사용하시면 됩니다.

Apache Tajo

  • Hadoop 2.3.0 or higher (up to 2.5.1)
  • Java 1.6 or 1.7
  • Protocol buffer 2.5.0

Elasticsearch

  • 버전별로 JDK 종속을 갖습니다.
  • 1.2 이상 부터는 JDK 1.7 이상
  • 1.1 이하 부터는 JDK 1.6

동작방식

  • Apache Tajo에 external table로 생성해서 Elasticsearch로 질의하는 방식 입니다.
  • 현재 구현된 기능은 아래 두 가지 입니다.
    • CREATE EXTERNAL TABLE
    • SELECT
  • Meta 정보를 Tajo에서 저장하고 있고 실제 데이터는 Elasticsearch에 위치하게 됩니다.
  • SQL 질의 시 Tajo에서 Elasticsearch로 QueryDSL로 변환된 질의를 수행하여 데이터를 가져오게 됩니다.
  • 이렇게 획득한 데이터를 WHERE 조건에 맞게 Selection 해서 결과를 리턴하게 됩니다.

어디에 사용하면 될까요?

  • Elasticsearch에서 JOIN 사용에 대한 아쉬움이 있으셨던 분들
  • HDFS에 저장된 데이터와 함께 분석 또는 질의에 대한 요구가 있으신 분들
  • HDFS 데이터에 대한 중간 결과를 Elasticsearch로 저장해서 활용하고 싶으셨던 분들
  • 검색엔진은 잘 모르겠고 그냥 SQL만 아시는 분들

JDBC Driver 사용은 가능 한가요?

  • Apache Tajo의 JDBC Driver를 이용해서 사용하시면 됩니다.

사용 시 주의사항

  • 현재 QUAL에 대한 조건이 내려오지 않아 Full Scan 하기 때문에 실시간 서비스용으로는 적합하지 않습니다.
  • Batch 또는 관리/분석 도구에서 사용하는 용도로 쓰시기 바랍니다.
  • QUAL을 내려 주는 기능은 Apache Tajo 팀에서 현재 구현중에 있어 완료 되면 반영할 예정입니다.

문의

  • 요청사항이나 개선요구사항이 있으신 분들은 메일이나 이슈 등록해 주시면 최대한 반영해 보겠습니다.


:

[Elasticsearch] Collaborate Apache Tajo + Available SQL on Elasticsearch

Elastic/Elasticsearch 2015. 5. 14. 18:40

원본 링크) https://github.com/gruter/tajo-elasticsearch


Apache Tajo & Elasticsearch

  • Collaborate Apache Tajo + Elasticsearch

Apache Tajo User Group

Apache Tajo Mailing List

Elasticsearch User Group

Registerer

Master Branch Build Environment

  • JDK 6 or later
  • Elasticsearch 1.1.2

tajo-es-1.5.2 Branch Build Environment

  • JDK 7 or later
  • Elasticsearch 1.5.2

tajo-es-1.1.2 Branch Build Environment

  • JDK 6 or later
  • Elasticsearch 1.1.2

HADOOP

$ cd ~/server/app/hadoop-2.3.0

Prerequisites

  • Hadoop 2.3.0 or higher (up to 2.5.1)
  • Java 1.6 or 1.7
  • Protocol buffer 2.5.0
  • Go to Link

Source Clone & Build

$ git clone https://github.com/gruter/tajo-elasticsearch.git
$ cd tajo-elasticsearch
$ mvn clean package -DskipTests -Pdist -Dtar
$ cd tajo-dist/target/
$ ls -al tajo-0.*.tar.gz
-rw-r--r--  1 hwjeong  staff  59521544  5 14 13:59 tajo-0.11.0-SNAPSHOT.tar.gz

Apache Tajo Installation

$ cd ~/server/app
$ mkdir tajo
$ cd tajo
$ cp ~/git/tajo-elasticsearch/tajo-dist/target/tajo-0.11.0-SNAPSHOT.tar.gz .
$ tar -xvzf tajo-0.11.0-SNAPSHOT.tar.gz
$ ln -s tajo-0.11.0-SNAPSHOT tajo
$ cd tajo
$ vi conf/tajo-env.sh
export HADOOP_HOME=/Users/hwjeong/server/app/hadoop-2.3.0
export JAVA_HOME=`/usr/libexec/java_home -v 1.7`

Apache Tajo Worker - ssh keygen

$ cd ~/.ssh
$ ssh-keygen -t rsa
$ cat id_rsa.pub > authorized_keys
$ chmod 600 authorized_keys

Apache Tajo Run & Sample Data

$ cd ~/server/app/tajo/tajo
$ bin/start-tajo.sh
$ cat > data.csv
1|abc|1.1|a
2|def|2.3|b
3|ghi|3.4|c
4|jkl|4.5|d
5|mno|5.6|e
^C

Hadoop Run & Make User Directory

$ cd ~/server/app/hadoop-2.3.0
$ sbin/start-all.sh
$ bin/hadoop fs -ls /
$ bin/hadoop fs -mkdir /user/tajo
$ bin/hadoop fs -chown hwjeong /user/tajo
$ bin/hadoop fs -ls /user
drwxr-xr-x   - hwjeong supergroup          0 2015-05-14 14:42 /user/tajo
$ bin/hadoop fs -moveFromLocal ~/server/app/tajo/tajo/data.csv /user/tajo/

Apache Tajo CLI

$ cd ~/server/app/tajo/tajo
$ bin/tsql
default> create external table tajodemotbl (id int, name text, score float, type text) using csv with ('csvfile.delimiter'='|') location 'hdfs://localhost:9000/user/tajo/data.csv';
OK
default> \d tajodemotbl;

table name: default.tajodemotbl
table path: hdfs://localhost:9000/user/tajo/data.csv
store type: csv
number of rows: unknown
volume: 60 B
Options:
'text.delimiter'='|'

schema:
id  INT4
name    TEXT
score   FLOAT4
type    TEXT

default> select * from tajodemotbl where id > 2;
Progress: 0%, response time: 1.557 sec
Progress: 0%, response time: 1.558 sec
Progress: 100%, response time: 1.86 sec
id,  name,  score,  type
-------------------------------
3,  ghi,  3.4,  c
4,  jkl,  4.5,  d
5,  mno,  5.6,  e
(3 rows, 1.86 sec, 48 B selected)
default>

Elasticsearch Installation & Run

$ cd ~/server/app/elasticsearch/elasticsearch-1.1.2
# no configuration
$ bin/elasticsearch -f

Create Index & Document

package org.gruter.elasticsearch.test;

import org.elasticsearch.action.WriteConsistencyLevel;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.count.CountRequest;
import org.elasticsearch.action.count.CountResponse;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.support.replication.ReplicationType;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.node.Node;
import org.elasticsearch.node.NodeBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import static org.junit.Assert.assertEquals;

public class ElasticsearchCRUDTest {
  private static final Logger log = LoggerFactory.getLogger(ElasticsearchCRUDTest.class);

  private ImmutableSettings.Builder settings;
  private Node node;
  private Client client;
  private int DOC_SIZE = 1000;

  @Before
  public void setup() throws Exception {
    settings = ImmutableSettings.settingsBuilder();
    settings.put("cluster.name", "elasticsearch");

    node = NodeBuilder.nodeBuilder()
        .settings(settings)
        .data(false)
        .local(false)
        .client(true)
        .node();

    client = node.client();
  }

  @Test
  public void testElasticsearchCRUD() throws Exception {
    // delete index
    try {
      client.admin().indices().prepareDelete("tajo_es_index").execute().actionGet();
    } catch (Exception e) {
    } finally {
    }

    // create index
    Settings indexSettings = ImmutableSettings.settingsBuilder()
        .put("number_of_shards","1")
        .put("number_of_replicas", "0")
        .build();

    XContentBuilder builder = XContentFactory.jsonBuilder()
        .startObject()
          .startObject("tajo_es_type")
            .startObject("_all")
              .field("enabled", "false")
            .endObject()
            .startObject("_id")
              .field("path", "field1")
            .endObject()
            .startObject("properties")
              .startObject("field1")
                .field("type", "long").field("store", "no").field("index", "not_analyzed")
              .endObject()
              .startObject("field2")
                .field("type", "string").field("store", "no").field("index", "not_analyzed")
              .endObject()
              .startObject("field3")
                .field("type", "string").field("store", "no").field("index", "analyzed")
              .endObject()
            .endObject()
          .endObject()
        .endObject();

    CreateIndexResponse res = client.admin().indices().prepareCreate("tajo_es_index")
        .setSettings(indexSettings)
        .addMapping("tajo_es_type", builder)
        .execute()
        .actionGet();

    assertEquals(res.isAcknowledged(), true);

    // add document
    IndexRequestBuilder indexRequestBuilder = client.prepareIndex().setIndex("tajo_es_index").setType("tajo_es_type");
    IndexResponse indexResponse;

    for ( int i=0; i<DOC_SIZE; i++ ) {
      builder = XContentFactory.jsonBuilder()
          .startObject()
            .field("field1", i).field("field2", "henry" + i).field("field3", i + ". hello world!! elasticsearch on apache tajo!!")
          .endObject();

      indexResponse = indexRequestBuilder.setSource(builder)
          .setId(String.valueOf(i))
          .setOperationThreaded(false)
          .setConsistencyLevel(WriteConsistencyLevel.QUORUM)
          .setReplicationType(ReplicationType.ASYNC)
          .execute()
          .actionGet();

      assertEquals(indexResponse.isCreated(), true);
    }

    client.admin().indices().prepareRefresh("tajo_es_index").execute().actionGet();

    CountRequest request = new CountRequest();
    request.indices("tajo_es_index").types("tajo_es_type");
    CountResponse response = client.count(request).actionGet();
    long count = response.getCount();

    assertEquals(count, DOC_SIZE);
  }

  @After
  public void tearDown() throws Exception {
    client.close();
    node.close();
  }
}

Check Status

Create External Table for Elasticsearch on Tajo and Test Query

create external table tajo_es_index (
  _type text,
  _score double,
  _id text,
  field1 bigint,
  field2 text,
  field3 text
)
using elasticsearch
with (
  'es.index'='tajo_es_index',
  'es.type'='tajo_es_type'
)

$ cd ~/server/app/tajo/tajo
$ bin/tsql

Try \? for help.
default> create external table tajo_es_index (
>   _type text,
>   _score double,
>   _id text,
>   field1 bigint,
>   field2 text,
>   field3 text
> )
> using elasticsearch
> with (
>   'es.index'='tajo_es_index',
>   'es.type'='tajo_es_type'
> );
OK
default> select count(*) from tajo_es_index;
Progress: 0%, response time: 1.397 sec
Progress: 0%, response time: 1.398 sec
Progress: 0%, response time: 1.802 sec
Progress: 100%, response time: 1.808 sec
?count
-------------------------------
1000
(1 rows, 1.808 sec, 5 B selected)

default> select * from tajo_es_index where field1 > 10 and field1 < 15;
Progress: 100%, response time: 0.583 sec
_type,  _score,  _id,  field1,  field2,  field3
-------------------------------
tajo_es_type,  0.0,  11,  11,  henry11,  11. hello world!! elasticsearch on apache tajo!!
tajo_es_type,  0.0,  12,  12,  henry12,  12. hello world!! elasticsearch on apache tajo!!
tajo_es_type,  0.0,  13,  13,  henry13,  13. hello world!! elasticsearch on apache tajo!!
tajo_es_type,  0.0,  14,  14,  henry14,  14. hello world!! elasticsearch on apache tajo!!
(4 rows, 0.583 sec, 320 B selected)

Elasticsearch "with" Options

  public static final String OPT_CLUSTER = "es.cluster";
  public static final String OPT_NODES = "es.nodes";
  public static final String OPT_INDEX = "es.index";
  public static final String OPT_TYPE = "es.type";
  public static final String OPT_FETCH_SIZE = "es.fetch.size";
  public static final String OPT_PRIMARY_SHARD = "es.primary.shard";
  public static final String OPT_REPLICA_SHARD = "es.replica.shard";
  public static final String OPT_PING_TIMEOUT = "es.ping.timeout";
  public static final String OPT_CONNECT_TIMEOUT = "es.connect.timeout";
  public static final String OPT_THREADPOOL_RECOVERY = "es.threadpool.recovery";
  public static final String OPT_THREADPOOL_BULK = "es.threadpool.bulk";
  public static final String OPT_THREADPOOL_REG = "es.threadpool.reg";
  public static final String OPT_TIME_SCROLL = "es.time.scroll";
  public static final String OPT_TIME_ACTION = "es.time.action";


:

도전! Apache Tajo Contributor.

ITWeb/Apache Tajo 2015. 3. 31. 16:20

Prologue.


이 글은 오픈소스 프로젝트에 참여하는 방법 중 하나로 코드에 대한 기여를 통해 Contributor 가 되는 방법을 공유하고자 작성 한 것입니다. 수많은 Apache Open Source Project 중에 최근 가장 Hot 한 Apache Tajo를 기준으로 Contributor 가 되는 방법을 알아보도록 하겠습니다. Git 명령어와 Github을 사용해 보신 분들이라면 쉽게 내용을 파악하실 수 있을 거라고 생각합니다. 이 글이 조금이나마 망설이고 있던 많은 예비 Contributor 분들에게 도움이 되면 좋겠습니다.


시작하기에 앞서.


도전하기에 앞서 내가 기여하고자 하는 내용이 해당 Open Source Project 의 Roadmap 상에 존재하는지 누군가 이미 진행하고 있는지 확인하는 과정을 거친 후 시작하시면 좋습니다.


Apache Tajo Roadmap 확인하기.

Apache Tajo Issue 확인하기.


도전! Apache Tajo Contributor.


기본 콘셉트는 아래와 같은 단계를 가집니다.


  • Step 0. Github 개인 계정으로 Apache Tajo Master Branch Fork 하기
  • Step 1. Apache Tajo Master 소스를 로컬 Repository로 Clone
  • Step 2. 개발용 Branch 와 코드 Merge 및 Push 용 Branch 생성
  • Step 3. 개발용 Branch에서 코딩 시작
  • Step 4. 개발이 완료되면 코드 Merge를 위해 생성해 놓은 Branch 와 Merge
  • Step 5. Patch 파일이 필요할 수 있기 때문에 Master Branch 와 Diff를 이용해 Patch 생성
  • Step 6. Merge 된 Branch를 개인 Github로 Push 하여 등록
  • Step 7. Github 사이트에 들어가면 등록된 Branch로 Pull Request 버튼이 생성 됨
  • Step 8. Pull Request를 보내고 나면 일단 완료


시작하기.


시작하기에 앞서 가장 먼저 해야 할 준비사항은 Github에 개인 계정을 생성 하는 것입니다.



계정 생성이 완료되었으면 이제 Contributor가 되기 위해 Apache Tajo Master Branch를 먼저 Fork 하고 개인 Github 저장소에서 내려받도록 하겠습니다.


$ git clone https://git-wip-us.apache.org/repos/asf/tajo.git

## 또는

$ git clone https://github.com/apache/tajo.git


## Clone을 어디서 내려받도록 하느냐에 따라 git remote 정보가 달라지게 됩니다.

## 기본적으로 Fork 이후 개인 Github에서 내려받게 되지만 아래 설명에서는 두 개의 Remote Repository를 대상으로 설명하기 위해 위와 같이 개인 Github이 아닌 Apache Tajo Git에서 내려받도록 하였습니다.


## 개인 Github에서 Clone 하기

$ git clone https://github.com/howookjeong/tajo.git


소스를 내려받은 후 Remote Repository 등록을 통해 앞으로 진행할 코드 관리 기준을 만들어 놓습니다.

  • Apache Tajo Repository 와 개인 Github Repository를 등록합니다.
  • Apache Tajo Repository는 코드 관리 기준 저장소로 사용을 하고, 개인 Github Repository는 개발용 코드 관리 기준 저장소로 사용을 합니다.

## 저장소 목록을 보여 줍니다.

$ git remote


## 아래와 같이 Apache Tajo의 Master Branch를 내려받았기 때문에 기본 Remote Repository가 Apache Repository가 됩니다.

## 관리를 쉽게 하기 위해 이름을 origin에서 asf로 변경하도록 하겠습니다.

$ git remote rename origin asf


## Pull Request 관리를 위한 개인 Github Repository를 추가합니다.

$ git remote add origin https://github.com/howookjeong/tajo.git


여기까지 다 하셨다면, 이제 Contributor 도전 시작을 위한 준비가 완료된 것입니다.


개발 브랜치(Branch) 만들기.


Branch는 두 개를 만들도록 하겠습니다.

  • 하나는 코드 Merge 및 개인 Github에 Branch를 등록해서 Pull Request를 보내는 용도
  • 다른 하나는 순수 개발 진행을 위한 용도

Branch 생성은 Apache Issue 이름으로 생성하는 것이 좋습니다.


여기서 Master Branch에 Merge를 하면 되지 않느냐고 하시는 분들도 있을 수 있습니다. 저 같은 경우 Master에 하지 않는 이유는 Apache Tajo Master Branch 와 코드를 계속 동일하게 유지하기 위해서 Merge를 하지 않는 것입니다.


## 아래 명령어를 통해 현재 Master Branch로 선택이 되어 있는지 확인합니다.

## 아닐 경우 Master Branch로 변경해 줍니다.

$ git branch


## Pull Request 시 Commit Log를 하나로 만들어 주기 위해 Merge 대상 Branch를 생성합니다.

$ git branch TAJO-1451


## 개발용 Branch를 생성 합니다.

## 위에서 생성한 Branch 명에서 _COMMIT이나 _DEV 와 같은 Suffix를 이용해서 생성하면 됩니다.

$ git branch TAJO-1451_COMMIT


## 개발 진행을 위해 개발용 Branch로 변경 합니다.

$ git checkout TAJO-1451_COMMIT


## 위와 같은 과정에서 Branch 생성과 생성한 Branch로 변경을 한번에 수행할 수 있는 명령어는 아래와 같습니다.

## 사용에 참고 하시면 좋을 것 같습니다.

## 위에서 사용한 branch + checkout을 checkout -b 로 한번에 수행한 예시입니다.

$ git checkout -b TAJO-1451_COMMIT


※ Branch 생성 및 관리 방법은 개발자 성향에 따라 다를 수 있으니 반드시 위와 같은 방법을 따를 필요는 없습니다. 본인 성향에 맞게 사용해도 아무런 문제가 되지 않습니다.


개발 코드 커밋(Commit) 하기.


위에서 설명한 것처럼 개발용 Branch로 변경을 하고 개발을 진행하시면 됩니다.


$ git checkout TAJO-1451_COMMIT


개발을 위한 기본 환경 및 빌드 가이드는 아래와 같습니다.


※ 참고 링크 

http://tajo.apache.org/docs/current/getting_started.html

https://cwiki.apache.org/confluence/display/TAJO/How+to+Contribute+to+Tajo


## Prerequisites

Hadoop 2.3.0 or higher (up to 2.5.1)

Java 1.6 or 1.7

Protocol Buffer 2.5.0


## Proto 사용을 위해 먼저 빌드를 수행합니다. 이것을 하는 이유는 Proto 관련 Class 들이 생성이 안되어 있기 때문에 생성하기 위함입니다.

## IDE 도구에서 Project를 오픈해 보면 에러가 발생해 있는 것을 확인할 수 있습니다.

## 빌드 명령어의 실행 위치는 clone 한 root 위치에서 수행합니다. 일반적으로 git/tajo 가 됩니다.

$ mvn -DskipTests clean install


## 개발이 완료되면 tar로 묶어 배포 버전을 만들도록 합니다.

$ mvn clean package -DskipTests -Pdist -Dtar


※ 코딩 주의 사항 


개발이 완료되었으면 이제 Commit을 합니다.


## 변경 사항을 확인하고 싶을 경우 아래 명령어를 이용합니다.

$ git status/diff/log


## 아래 명령어를 통해 구현한 코드들을 Commit 하도록 합니다.

## 신규로 추가된 파일들에 대해서는 Add 명령을 먼저 실행 한 후 Commit을 해야만 정상적으로 반영이 됩니다.

$ git commit -m "implement elasticsearch storage for tajo"


## 신규로 추가한 파일 이외 기존 파일이 수정 되었다면 아래 명령어를 이용해서 반영하도록 합니다.

$ git commit -a -m "implement elasticsearch storage for tajo"


개발 코드 머지(Merge) 하기.


이제 작업이 완료되었으니 개인 Github에 Push 할 Branch 와 Merge를 합니다.


## Branch Merge를 위해 미리 생성해 놓은 Push 용 Branch로 변경합니다.

$ git checkout TAJO-1451


## Merge 및 Commit Log를 하나로 합칩니다.

## --squash 옵션이 Commit Log를 하나로 만들어 줍니다.

$ git merge --squash TAJO-1451_COMMIT


개발 코드 패치(Patch) 파일 생성하기.


Apache Travis CI 수행을 돕기 위해 또는 Committer 가 쉽게 리뷰를 할 수 있도록 Patch 파일을 만들어 등록한 Apache Jira Issue에 등록을 합니다.


## 현재 작업 Branch는 TAJO-1451 입니다.

$ git diff master --no-prefix > TAJO-1451.patch


※ 참고 링크 

https://cwiki.apache.org/confluence/display/TAJO/How+to+Contribute+to+Tajo


개발 코드 풀리퀘스트(Pull Request) 하기.


Pull Request를 위해 개인 Github 저장소에 Merge 한 Branch를 Push 합니다.


## 먼저 Merge 한 내용을 로컬 저장소에 반영하기 위해 Commit을 합니다.

$ git commit -m "implement elasticsearch storage for tajo"


## 이제 모두 반영 되었으니 개인 Github 저장소로 Branch를 등록하도록 합니다.

## 등록 시 어떤 저장소로 등록할 지 선택이 가능하며, 기본 가이드는 개인 Github 저장소로 등록하는 것입니다.

## 제일 처음 asf 와 origin을 등록 하였으며, 개인 Github 저장소인 origin으로 Push 하도록 하겠습니다.

## Push 명령어 실행 시 Github 의 ID/PWD를 물어 봅니다.

$ git push origin TAJO-1451


만약, Master Branch로 Merge, Commit 그리고 Push 까지 실행했을 경우 아래 명령어를 통해서 Rollback 할 수 있도록 합니다.


## git log 명령어를 통해 자신이 수행한 이전 Commit Head 정보를 확인 후 아래와 같이 Reset 합니다.

$ git reset --hard HEAD~1


## Reset 된 Master Branch를 다시 Push 해서 초기 상태를 복구를 합니다.

$ git push origin +master


이제 개인 Github 웹페이지로 이동해 Push 한 Branch 가 잘 올라와 있는지 확인하고 해당 Branch에 생성되어 있는 Pull Request 버튼을 클릭합니다.


## 아래와 같은 형식으로 작성을 합니다.

제목) APACHE-JIRA-ISSUE-NUMBER: 요청 제목 작성.......


## 만약 잘못 작성했을 경우 Github에서 수정하시면 됩니다.

예) TAJO-1451: implement elasticsearch storage for tajo.


아래는 Pull Request가 완료된 화면 예시입니다.



이후 진행은 Committer 의 리뷰와 피드백 등의 과정을 통해서 반영 여부가 결정되게 됩니다.


Epilogue.


글을 마무리하며, 많은 예비 Contributor 분들이 실제 Open Source Project에 더 적극적으로 참여하고 생태계가 활성화되길 기대해 봅니다. 비록 부족한 내용의 글이였지만 끝까지 읽어 주셔서 감사합니다.


글쓴이 소개 : 정호욱


2015년 Software 개발 15년차에 접어 들었습니다. Yahoo! Korea, NHN Technology, Samsung Electorics 등에서 Community, Social Search, Search Advertisement 서비스 등을 개발하였고 오픈소스 기반 검색 라이브러리인 Lucene을 이용해서 다양한 프로젝트를 수행하였습니다. 현재 빅데이터 전문 기업인 Gruter에서 오픈소스 기반 검색엔진을 활용한 다양한 프로젝트와 개발 업무를 수행하고 있습니다. 그리고 Elasticsearch 라는 오픈소스 검색엔진 기술과 경험을 블로그와 커뮤니티를 통해 공유하고 있습니다.


:

[Elasticsearch] elasticsearch를 apache tajo의 external storage로 사용하기

Elastic/Elasticsearch 2015. 3. 27. 00:26


지난 주 부터 작업하던게 있는데요.

아직 어찌 될지는 알수 없지만 일단 안되더라도 필요하신 분들이 있을지 몰라 공유해 봅니다.


https://issues.apache.org/jira/plugins/servlet/mobile#issue/TAJO-1451


내용은 apache tajo에 external storage로 elasticsearch를 이용할수 있도록 컨트리븃 하고 있습니다.


정리하면 이런게 가능 합니다.

1. Sql을 이용한 elasticsearch index 질의 (ansi sql fully support 됩니다.)

2. Hdfs 나 기타 tajo 에서 지원하는 다양한 스토리지 데이터와 조인 (최근 1.5에서 inner hits가 추가 되었지만 비교할바가 안됩니다.)

3. 기타 다양한 활용도 가능 하겠죠. (상상력을 발휘하세요.)


뭐 최종 커밋이 안되더라도 제가 테스트 해보니 매우 유용해 보입니다. ^^


많은 분들이 데뷰에서 보여드린 es jdbc 드라이버를 원하실텐데요. 일단 이걸로 대리 만족 하심 어떨까해서 공유해 봅니다.

: