'Source'에 해당되는 글 4건

  1. 2020.06.17 [Elasticsearch] script 사용 시 "#! Deprecation: Deprecated field [inline] used, expected [source] instead"
  2. 2019.11.05 [httpcomponents-client] CloseableHttpClient - Accept Encoding
  3. 2017.11.21 [Hadoop] Native library installation on osx
  4. 2015.03.31 도전! Apache Tajo Contributor.

[Elasticsearch] script 사용 시 "#! Deprecation: Deprecated field [inline] used, expected [source] instead"

Elastic/Elasticsearch 2020. 6. 17. 08:20

에러 메시지를 보면 답이 나와 있습니다.

inline 대신 source 를 사용 하라는 이야기 입니다.

 

[ASIS]

  "aggs": {
    "3": {
      "date_histogram": {
        "field": "@timestamp",
        "fixed_interval": "30s",
        "time_zone": "Asia/Seoul",
        "min_doc_count": 1
      },
      "aggs": {
        "1": {
          "max": {
            "field": "system.cpu.total.pct",
            "script": {
              "inline": "doc['system.cpu.total.pct'].value *100",
              "lang": "painless"
            }
          }
        }
      }
    }
  }

 

[TOBE]

  "aggs": {
    "3": {
      "date_histogram": {
        "field": "@timestamp",
        "fixed_interval": "30s",
        "time_zone": "Asia/Seoul",
        "min_doc_count": 1
      },
      "aggs": {
        "1": {
          "max": {
            "field": "system.cpu.total.pct",
            "script": {
              "source": "doc['system.cpu.total.pct'].value *100",
              "lang": "painless"
            }
          }
        }
      }
    }
  }

이상 끝.

:

[httpcomponents-client] CloseableHttpClient - Accept Encoding

ITWeb/개발일반 2019. 11. 5. 10:53

RESTful 통신을 많이 하면서 httpclient 를 활용이 높습니다.

제가 사용하고 있는 httpclient 중에 CloseableHttpClient 가 있는데 이 클라이언트의 경우 Accept Encoding 설정이 기본적으로 enable 되어 있습니다.

그래서 기억력을 돕기 위해 또 기록해 봅니다.

 

참고 이전 글)

https://jjeong.tistory.com/1369

 

HttpClientBuilder.java)

public CloseableHttpClient build() {
... 중략 ...
            if (!contentCompressionDisabled) {
                if (contentDecoderMap != null) {
                    final List<String> encodings = new ArrayList<String>(contentDecoderMap.keySet());
                    Collections.sort(encodings);
                    b.add(new RequestAcceptEncoding(encodings));
                } else {
                    b.add(new RequestAcceptEncoding());
                }
            }
            if (!authCachingDisabled) {
                b.add(new RequestAuthCache());
            }
            if (!cookieManagementDisabled) {
                b.add(new ResponseProcessCookies());
            }
            if (!contentCompressionDisabled) {
                if (contentDecoderMap != null) {
                    final RegistryBuilder<InputStreamFactory> b2 = RegistryBuilder.create();
                    for (final Map.Entry<String, InputStreamFactory> entry: contentDecoderMap.entrySet()) {
                        b2.register(entry.getKey(), entry.getValue());
                    }
                    b.add(new ResponseContentEncoding(b2.build()));
                } else {
                    b.add(new ResponseContentEncoding());
                }
            }
... 중략 ...
    }

RequestAcceptEndocing.java)

...중략...
    public RequestAcceptEncoding(final List<String> encodings) {
        if (encodings != null && !encodings.isEmpty()) {
            final StringBuilder buf = new StringBuilder();
            for (int i = 0; i < encodings.size(); i++) {
                if (i > 0) {
                    buf.append(",");
                }
                buf.append(encodings.get(i));
            }
            this.acceptEncoding = buf.toString();
        } else {
            this.acceptEncoding = "gzip,deflate";
        }
    }
...중략...

요청 하는 Client 에서 Server 로 콘텐츠를 압축해서 전송해줘 해야 압축해서 전송을 해주게 되는 내용입니다.

아무리 서버에서 압축 전송이 가능 하도록 설정을 했어도 요청을 하지 않으면 그냥 plain/text 로 넘어 올 수 밖에 없습니다.

 

참고문서)

https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Accept-Encoding

 

Accept-Encoding

Accept-Encoding 요청 HTTP 헤더는, 보통 압축 알고리즘인, 클라이언트가 이해 가능한 컨텐츠 인코딩이 무엇인지를 알려줍니다. 컨텐츠 협상을 사용하여, 서버는 제안된 내용 중 하나를 선택하고 사용하며 Content-Encoding 응답 헤더를 이용해 선택된 것을 클라이언트에게  알려줍니다.

developer.mozilla.org

 

:

[Hadoop] Native library installation on osx

Elastic/Hadoop 2017. 11. 21. 15:54

hdfs 에서 snappy 압축 파일을 바로 읽으려고 하니 아래와 같은 오류 메시지가 발생을 했습니다.

hadoop 을 구성 할 때  source build 를 하지 않고 그냥 binary 를 가지고 사용해서 그런것 같아 source 를 받아서 build 를 하기로 했습니다.


[에러 메시지]

Unable to load native-hadoop library for your platform... using builtin-java classes where applicable


$ hadoop checknative -a

Native library checking:

hadoop:  false

zlib:    false

snappy:  false

lz4:     false

bzip2:   false

openssl: false

처럼 나와서 빌드를 하게 되었습니다.


참고문서는 아래 링크를 보시면 됩니다.

Ref. 

https://medium.com/@faizanahemad/hadoop-native-libraries-installation-on-mac-osx-d8338a6923db

https://gist.github.com/zedar/f631ace0759c1d512573


brea install 을 통해서 필요한 몇 가지를 먼저 구성 하셔야 합니다.

$ brew install gcc autoconf automake libtool cmake snappy gzip bzip2 homebrew/versions/protobuf250 zlib openssl

참고로 저는 protobuf 3.4.0 이 설치되어 있어서 downgrade 했습니다.


pure hadoop build 는 maven 은 3.x 이상을 요구 합니다.

- hadoop-2.7.2 빌드 했습니다.


[빌드 및 native library 복사]

$ ../apache-maven-3.5.0/bin/mvn package -Pdist,native -DskipTests -Dtar -e

$ vi .bash_profile

export OPENSSL_ROOT_DIR=/usr/local/Cellar/openssl/1.0.2m

export OPENSSL_INCLUDE_DIR=/usr/local/Cellar/openssl/1.0.2m/include

export PROTOC_HOME=/usr/local/opt/protobuf@2.5

export HADOOP_HOME=/Users/henry/Work/apps/hadoop-2.7.2

PATH=$PROTOC_HOME/bin:$HADOOP_HOME/bin:$HOME/bin:$PATH


export PATH


$ cp -r hadoop-dist/target/hadoop-2.7.2/lib/native/* /Users/henry/Work/apps/hadoop-2.7.2/lib/native/osx/

$ vi etc/hadoop/hadoop-env.sh

export HADOOP_HOME="/Users/henry/Work/apps/hadoop-2.7.2"

export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_HOME}/lib/native

export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=$HADOOP_HOME/lib/native/osx"

$ vi etc/hadoop/core-site.xml

    <property>

        <name>io.compression.codecs</name>                  <value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.SnappyCodec,org.apache.hadoop.io.compress.BZip2Codec</value>

    </property>

여기 까지 하고 나서 아래 명령어를 다시 실행해 봅니다.

$ hadoop checknative -a

17/11/21 15:45:16 WARN bzip2.Bzip2Factory: Failed to load/initialize native-bzip2 library system-native, will use pure-Java version

17/11/21 15:45:16 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library

Native library checking:

hadoop:  true /Users/henry/Work/apps/hadoop-2.7.2/lib/native/osx/libhadoop.dylib

zlib:    true /usr/lib/libz.1.dylib

snappy:  true /usr/local/lib/libsnappy.1.dylib

lz4:     true revision:99

bzip2:   false

openssl: false build does not support openssl.


Hadoop source build 하다 보면 아래 에러가 발생을 합니다.

[INFO] Apache Hadoop Pipes ................................ FAILURE [  0.627 s]

이 경우 아래 문서 참고해서 해결 하시면 됩니다.

Ref. 

https://stackoverflow.com/questions/36818957/mac-hadoop-2-7-failed-to-execute-goal-org-apache-maven-pluginsmaven-antrun


$ cd hadoop/hadoop-tools/hadoop-pipes

$ vi pom.xml

...중략...

<arg line="${basedir}/src/ -DJVM_ARCH_DATA_MODEL=64"/>

...중략...

-> 여기서 64를 6으로 변경해 주시기 바랍니다.


:

도전! 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 라는 오픈소스 검색엔진 기술과 경험을 블로그와 커뮤니티를 통해 공유하고 있습니다.


: