'hadoop'에 해당되는 글 21건

  1. 2017.11.21 [Hadoop] Native library installation on osx
  2. 2015.09.09 [Elastic] Elastic 제품들...
  3. 2014.07.25 [Hadoop] map task 정의.
  4. 2014.07.21 [Hadoop] hdfs file read - java main 실행.
  5. 2014.07.15 [HADOOP] snappy 압축 파일 읽기.
  6. 2014.05.29 [Elasticsearch] Elasticsearch Hadoop Plugin 2.0 GA 테스트.
  7. 2014.02.07 [elasticsearch] hadoop plugin 1.3 M2 릴리즈.
  8. 2013.12.09 elasticsearch-hadoop 기능 테스트.
  9. 2013.04.30 [Hadoop] Unable to load realm info from SCDynamicStore - 1.0.4
  10. 2013.04.26 [Hadoop] hadoop + hive + mysql + haproxy 를 이용한 클러스터 구성하기 2

[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으로 변경해 주시기 바랍니다.


:

[Elastic] Elastic 제품들...

Elastic 2015. 9. 9. 10:30

Elasticsearch, Logstash, Kibana 를 주로 사용하고 있다 보니 다른 제품들은 크게 관심있게 보지를 않았습니다.

제가 관심 있게 보는건 저 한테 필요 하거나 오픈소스 이거나 인데요.

당연히 위에 제품들은 모두 제가 사용하고 있는 것들이고 오픈소스 입니다.


Elastic 에서 제공하고 있는 제품들은 아래 링크를 통해서 확인 하시면 되는데요.


제품 소개 링크) https://www.elastic.co/products


최근까지 제가 잘 못 알고 있던 제품이 있었는데 이것도 한번 사용해 보기 위해 elastic 제품들을 각각 한 줄로 정리해 보기로 했습니다.


Elasticsearch - 오픈소스 무료

루씬 기반의 분산 검색 엔진 입니다.


Logstash - 오픈소스 무료

다양한 input/filter/ouput/codec 들을 제공하는 collector 입니다.


Kibana - 오픈소스 무료

elasticsearch를 DB로 사용하는 visualization/dashboard 도구 입니다.


Packet Beat - 오픈소스 무료

OS 또는 Process 등에서 발생 하는 network 모니터링 도구 입니다.


Top Beat - 오픈소스 무료

기본적인 시스템(CPU, MEM, IO, DISK) 모니터링 도구 입니다.


Elasticsearch Hadoop Plugin - 오픈소스 무료

Hadoop component 들과 elasticsearch를 쉽게 연동 할 수 있도록 도와 주는 라이브러리 입니다.


Found - SaaS 형 서비스 유료

Cloud 환경에서 ELK 를 쉽게 구축하고 사용할 수 있도록 해주는 서비스 입니다.


Shield - 유료

ELK를 이용하여 기업에서 사용하기에는 부족했던 인증, 권한 등의 기능을 제공해 주는 제품 입니다.


Watcher - 유료

ELK를 이용하면서 아쉬웠던 alert 이나 notification 에 대한 기능을 제공해 주는 제품 입니다.


Marvel - 유료 (개발자 버전은 무료)

Elasticsearch에 대한 관리 및 모니터링을 제공하는 제품 입니다.


저는 기본적으로 ELK 기반으로 필요한건 다 만들어서 사용을 하고 있는 편입니다.

beats 도 역시 만들어서 사용하고 있었는데요. 

이건 한번 시도를 해봐야 겠내요. :)

:

[Hadoop] map task 정의.

ITWeb/스크랩 2014. 7. 25. 04:44

원문 : http://xlos.tistory.com/1512


정보 공유 차원에서 오늘 한 삽질을 기록으로 남김

  1. 상황
    • map/reduce 프레임웍이 필요한 것은 아니고, 단순하지만 처리하는데 오래 걸리는 작업들을 여러 컴퓨터에 분산하여 처리하고자 함.
    • reduce task 개수를 0으로 주고 mapper only로 설정하여 작업을 시작.
    • 문제 : 현재 hadoop의 scheduler는 preemptive 하지 않기 때문에, 한 번 map task가 시작되면, priority가 낮더라도 해당 map task가 끝날 때 까지 계속 진행됨. 덕분에 나의 단순하고 오래 걸리는 작업들이 한 번 hadoop에서 돌기 시작하면, 다른 긴급한 작업들이 처리되지 못하는 상황이 발생!
    • 시도된 해결책
      • 나의 job에서 동시에 실행되는 map task 개수를 제한하여, 다른 긴급한 작업들이 처리될 수 있도록 함
  2. 삽질.. 삽질..
    • 첫 번째 시도 : mapred.jobtracker.maxtasks.per.job=10 으로 설정
      • 하나의 job 당 최대 task 수를 10으로 설정했으니, 한 번에 실행되는 map task의 수도 제한되지 않을까? 라고 생각했으나,, 실제로는 적용 안됨. ㅜ.ㅜ
    • 두 번 째 시도 : mapred.tasktracker.map.tasks.maximum=1 로 설정
      • 이 설정의 의미는 하나의 task tracker에 의해 동시에 실행되는 map task의 개수
      • 저렇게 설정하면, 하나의 task tracker에 의해서 하나의 map task만 실행되어야 한다. 하지만 실제로는 적용이 안됨.
      • 이 부분에 대해서는 원인을 찾았는데, Hadoop The Definitive Guide라는 책에 보면 아래와 같이 쓰여 있다.
      • Be aware that some properties have no effect when set in the client configuration. For example, if in your job submission you set mapred.tasktracker.map.tasks.maximum with the expectation that it would change the number of task slots for the tasktrackers running your job then you would be disappointed, since this property only is only honored if set in the tasktracker’s mapred-site.html file.

      • 해석하면, mapred.tasktracker.~ 로 실행되는 설정들은 tasktracker daemon에 의해서만 적용되며, client에서 설정한 값은 무시 된다는 말씀.
    • 세 번째 시도 : mapred.map.tasks=10 으로 설정!
      • mapred.map.tasks 설정은 하나의 job 당 map task 의 개수이므로, map task의 개수가 적으면 당연히 동시에 실행되는 map task의 개수도 제한 될 것이라고 생각했지만!! 여전히 적용 안됨.
      • 원인을 찾아본 결과, mapred.map.tasks는 map task의 개수는 늘릴 수 있지만, 하둡이 결정한 map task의 개수 이하로는 줄일 수 없다고 함. 출처 :http://wiki.apache.org/hadoop/HowManyMapsAndReduces
      • 참고로 하둡은 하나의 input split 당 하나의 map task를 생성함. input split이란, 각 input file들을 구성하고 있는 하나 하나의 data block을 뜻함.
    • 발상의 전환 : 굳이 한 번에 실행되는 map task의 개수를 줄일 필요가 있을까?
      • 문제가 되는 상황은 나의 job이 모든 map task slot을 점유하고, 다른 긴급한 job들이 나의 slot을 뺏을 수 없어서 생기는 문제.
      • 그렇다면, 하나의 map task 가 빨리 빨리 종료되도록 단위를 줄이면, 그 사이 다른 priority 가 높은 job들이 종료된 map slot을 차지하여, map task을 실행시킬 수 있게 되어, priority가 역전되는 문제를 회피할 수 있음.
      • map task를 얼마나 늘려야 할까? 심플하게 mapred.map.tasks=100000000 정도로 설정하면, 하나의 map task가 처리하는 단위가 작아지고, 굉장히 빠른 시간에 종료되므로, preemptive 문제는 해결할 수 있지만, 이 경우, input split이 너무 작아질 수 있기 때문에, hadoop에서 배보다 배꼽이 더 큰 상황이 발생할 수 있다.
      • 이때 구세주처럼 등장한 설정이 있으니 바로 mapred.min.split.size ! 하나의 input split의 최소 단위를 설정할 수 있는데, 이 설정을 이용하면, map task가 지나치게 많아지는 것을 방지할 수 있다.
      • 최종 해결책
        • mapred.min.split.size=4194304  (하나의 input split은 최소 4MB 단위로 처리해라)
        • mapred.map.tasks=1000000   (최대한 map task를 잘게 쪼개서, 다른 작업에 방해가 되지 않도록 하자)
        • 실제로 위와 같이 설정하면, 전체 map task가 백 만 개 이하로 적절하게 쪼개져서 동작함. (몇 개로 쪼개지는 지는 전체 input file의 size에 따라 다름)


:

[Hadoop] hdfs file read - java main 실행.

ITWeb/Hadoop일반 2014. 7. 21. 12:14

hdfs 에 저장된 파일을 읽어서 처리 하는 java main 프로그램 작성 시 hadoop 관련 라이브러리에 대한 classpath 지정을 하지 않게 되면 아래와 같은 에러가 발생 할 수 있으니 참고하세요.


[Error]

 java.io.IOException: No FileSystem for scheme: hdfs


[예제코드]

Configuration conf = new Configuration();

// conf.set("fs.default.name", hdfsServer); // deprecated

conf.set("fs.defaultFS", hdfsServer);


FileSystem hdfs = FileSystem.get(conf);

BufferedReader br = new BufferedReader(new InputStreamReader(hdfs.open(new Path(schemaFile))));


while ((line = br.readLine()) != null) {

....

}


br.close();


eclipse 에서 Runnable JAR file 로 export 하셔서 실행 하시면 됩니다.

여기서 Library handling 은 

"Copy required libraries into a sub-folder next to the generated JAR"

를 선택 하세요.


이렇게 해서 생성된 파일을 실행 하실 때 -classpath  옵션으로 추가해 주시고 실행 하시면 됩니다.


[실행 예제]

java -classpath /Users/hwjeong/Documents/workspace/eclipse-j2ee/PROJECT/target/standalone_lib -jar /Users/hwjeong/Documents/workspace/eclipse-j2ee/PROJECT/target/standalone.jar StandaloneMain hdfs://localhost:9000


※ 단순히 hdfs 에 있는 파일을 읽을 떄는 eclipse 에서 hadoo-hdfs 를 추가해서 작성해 주시면 됩니다.

<dependency>

    <groupId>org.apache.hadoop</groupId>

    <artifactId>hadoop-hdfs</artifactId>

    <version>2.3.0</version>

</dependency>


:

[HADOOP] snappy 압축 파일 읽기.

ITWeb/Hadoop일반 2014. 7. 15. 12:55

테스트를 하다 보면 hdfs 에 snappy 로 압축 된 파일을 읽어서 내용을 검증 하는 기능을 넣을때가 있습니다.

ㅎㅎ 제가 구현 하던 모듈에 필요해서 공유 합니다.

기본 구조는 아래 링크 참고 해서 작성 하였습니다.


[참조소스]

https://code.google.com/p/hadoop-snappy/source/browse/trunk/src/test/java/org/apache/hadoop/io/compress/snappy/TestSnappyCodec.java

/*

 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.hadoop.io.compress.snappy;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import junit.framework.TestCase;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.compress.CompressionCodec;
import org.apache.hadoop.io.compress.CompressionInputStream;
import org.apache.hadoop.io.compress.CompressionOutputStream;
import org.apache.hadoop.io.compress.SnappyCodec;
import org.apache.hadoop.util.ReflectionUtils;

public class TestSnappyCodec extends TestCase {
  private String inputDir;
  
  @Override
  protected void setUp(throws Exception {
    super.setUp();
    inputDir System.getProperty("test.build.data""target");
  }
  
  public void testFile(throws Exception {
    run("test.txt");
  }
  
  private void run(String filenamethrows FileNotFoundExceptionIOException{
    File snappyFile new File(inputDirfilename new SnappyCodec().getDefaultExtension());
    if (snappyFile.exists(){
      snappyFile.delete();
    }
    
    Configuration conf new Configuration();
    CompressionCodec codec (CompressionCodecReflectionUtils.newInstance(SnappyCodec.classconf);
    
    // Compress
    InputStream is this.getClass().getClassLoader().getResourceAsStream("test.txt");
    FileOutputStream os new FileOutputStream(snappyFile);
    CompressionOutputStream cos codec.createOutputStream(os);
    
    byte buffer[new byte[8192];
    try {
      int bytesRead 0;
      while ((bytesRead is.read(buffer)0{
        cos.write(buffer0bytesRead);
      }
    catch (IOException e{
      System.err.println("Compress Error");
      e.printStackTrace();
    finally {
      is.close();
      cos.close();
      os.close();
    }
    
    // Decompress
    is =  this.getClass().getClassLoader().getResourceAsStream("test.txt");
    FileInputStream is2 new FileInputStream(snappyFile);
    CompressionInputStream cis codec.createInputStream(is2);
    BufferedReader new BufferedReader(new InputStreamReader(is));
    BufferedReader cr new BufferedReader(new InputStreamReader(cis));
    
    
    try {
      String linerline;
      int lineNum 0;
      while ((line r.readLine()!= null{
        lineNum++;
        rline cr.readLine();
        if (!rline.equals(line){
          System.err.println("Decompress error at line " line " of file " filename);
          System.err.println("Original: [" line "]");
          System.err.println("Decompressed: [" rline "]");
        }
        assertEquals(rlineline);
      }
      assertNull(cr.readLine());
    catch (IOException e{
      System.err.println("Decompress Error");
      e.printStackTrace();
    finally {
      cis.close();
      is.close();
      os.close();
    }
  }
}



[구현소스]

- 위 예제는 로컬테스트용으로 작성 되어 있기 때문에 hdfs 에서 직접 읽어오는 형태로 약간 수정했습니다.

  public static void readLines(Path locationConfiguration confthrows Exception {

    CompressionCodec codec (CompressionCodecReflectionUtils.newInstance(SnappyCodec.classconf);
    FileSystem hdfs FileSystem.get(conf);
    
    try{
      FileStatus[fileStatus hdfs.listStatus(location);
      
      for (FileStatus file fileStatus{
        if file.isDirectory({
          continue;
        }
        
        CompressionInputStream cis codec.createInputStream(hdfs.open(file.getPath()));
        BufferedReader br new BufferedReader(new InputStreamReader(cis));

        try {
          String line;
          line=br.readLine();
          
          while (line != null){
            line br.readLine();

                     System.out.println(line);
          }
        finally {
          br.close();
        }
      }
    catch IOException {
    }
  }


:

[Elasticsearch] Elasticsearch Hadoop Plugin 2.0 GA 테스트.

Elastic/Elasticsearch 2014. 5. 29. 12:42

http://www.elasticsearch.org/blog/es-hadoop-2-0-g/


hadoop plugin 2.0 정식 버전이 나왔습니다.

1.3.0 까지 테스트는 했었는데, 2.0 은 어제, 오늘 테스트를 끝냈내요.


일단 2.0 에서는 json 지원이 되어서 편하내요.

MR 로 indexer, searcher 를 만들어서 돌려봤는데 indexer 의 경우 hadoop 에 저장되어 있는 데이터를 es 로 색인 할 수 있어서 데이터 분석에 활용 하면 아주 좋을 것 같습니다.

그리고 searcher 의 경우 EsInputFormat.class 에서 보면 내부적으로 scroll query 를 사용하기 때문에 뭘로 활용할지 아직 고민이기는 합니다.

더군다나 이게 hadoop 데이터를 검색 하거나 읽는 기능이 아니고 그냥 mr 로 es 로 검색 질의 하는 거라서 더욱 활용 범위가 애매 하내요.


샘플 코드들은 아래 링크에 있습니다.

https://github.com/elasticsearch/elasticsearch-hadoop


:

[elasticsearch] hadoop plugin 1.3 M2 릴리즈.

Elastic/Elasticsearch 2014. 2. 7. 10:18

http://www.elasticsearch.org/blog/elasticsearch-hadoop-1-3-m2/


몇 가지 기능 개선이랑 패키지명이 바뀌었내요.

그리고 기존에는 es.host 로 node 하나만 지정 할 수 있었는데 es.nodes 로 바뀐거 보면 병렬 분산 처리를 지원 하는 것 처럼 보이내요.

:

elasticsearch-hadoop 기능 테스트.

Elastic/Elasticsearch 2013. 12. 9. 17:54

[프로젝트]

https://github.com/elasticsearch/elasticsearch-hadoop


[소개]

http://www.elasticsearch.org/guide/en/elasticsearch/hadoop/current/requirements.html


hadoop 이랑 연동 하기 위해서 위 프로젝트를 테스트 하였습니다.

정말 예전에 나왔던것 보다 많이 좋아졌내요.


간략하게 정리 하면 hdfs 에 저장되어 있는 데이터를 elasticsearch 로 migration 하는 거라고 보시면 됩니다.

당연한 이야기 입니다만, es 로 데이터가 들어 가기 때문에 당연히 검색도 되겠죠.


저 같은 경우는 mapreducer 와 hive 를 까지만 테스트 하였는데요.

기능 동작 잘되고 활용할 부분이 많을 듯 싶내요.

어떻게 활용할지는 아래 링크 참고 하시면 좋을 듯 합니다.

http://hortonworks.com/blog/fast-search-and-analytics-on-hadoop-with-elasticsearch-and-hdp/


Use Cases

Here are just some of the use case results from Elasticsearch:

  • Perform real-time analysis of 200 million conversations across the social web each day helping major brands make business decisions based on social data
  • Run marketing campaigns that quickly identify the right key influencers from a database of 400 million users
  • Provide real-time search results from an index of over 10 billion documents
  • Power intelligent search and better inform recommendations to millions of customers a month
  • Increase the speed of searches by 1000 times
  • Instant search for 100,000 source code repositories containing tens of billions lines of code

위 그림에서만 보면 호튼웍스가 꼭 끼어야 할 것 처럼 보이지만 뭐 없어도 됩니다.

그냥 hadoop + elasticsearch 로 활용 하시면 되니까.. 잘 만들어 쓰시면 좋겠내요.


실제 제가 참고한 코드는

[MapReducer]

http://www.elasticsearch.org/guide/en/elasticsearch/hadoop/current/mapreduce.html


[Hive]

http://www.elasticsearch.org/guide/en/elasticsearch/hadoop/current/hive.html

이렇습니다.


[SW Version]

hadoop 1.2.1

hive 0.12.0

elasticsearch-hadoop-1.3.0-SNAMSHOP





:

[Hadoop] Unable to load realm info from SCDynamicStore - 1.0.4

ITWeb/Hadoop일반 2013. 4. 30. 16:22

hadoop 1.0.4 + eclipse 테스트 시 아래와 같은 메시지가 나올때가 있습니다.

찾아 보면 jdk 버그라고 하는데.. 암튼 저는 아래와 같이 해결 했습니다.


[첫번째]

- hadoop-env.sh 에 아래 코드 추가


HADOOP_OPTS="-Djava.security.krb5.realm=OX.AC.UK -Djava.security.krb5.kdc=kdc0.ox.ac.uk:kdc1.ox.ac.uk"

export HADOOP_OPTS


[두번째]

- eclipse project 에서 run configure 내 arguments 에 코드 추가


-Djava.security.krb5.realm=OX.AC.UK -Djava.security.krb5.kdc=kdc0.ox.ac.uk:kdc1.ox.ac.uk


:

[Hadoop] hadoop + hive + mysql + haproxy 를 이용한 클러스터 구성하기

ITWeb/Hadoop일반 2013. 4. 26. 15:29

hadoop, hive 에 대해서는 우선 책이나 다른 사이트들을 통해서 충분히 이해하고 구성을 하시는게 좋습니다.

저 역시 아무런 사전 지식 없이 웹에 나와 있는 문서들만 보고 설치를 해보고 돌려 보았지만, 이런게 크게 도움이 되지 않습니다.

적어도 책 두권 이상은 정독하시고 샘플 코드들도 돌려 보시면 많은 도움이 됩니다.

또한 소스코드 까지 볼수 있다면 더욱 좋습니다.


아래는 일반 웹에 문서들과 제가 이해한 내용을 바탕으로 재구성한 내용입니다.

hadoop, hive, mysql, haproxy 등 모두 서버 설정 정보가 상당 합니다.

저 역시 모든 설정에 대해서 알고 있지 않기 때문에 사이트를 참고 하여 작성 하였습니다.


[준비사항]

- virtual box

version 4.2.12

http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html

- centos

version 6.4

http://www.centos.org/modules/tinycontent/index.php?id=15

http://ftp.neowiz.com/centos/6.4/isos/x86_64/

- hadoop

version : 1.0.4

http://hadoop.apache.org/releases.html#Download

http://mirror.apache-kr.org/hadoop/common/hadoop-1.0.4/hadoop-1.0.4.tar.gz

- mysql

version : 5.6.11

http://dev.mysql.com/downloads/mysql/

source code 선택

http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.11.tar.gz/from/http://cdn.mysql.com/

- hive

version : 0.9.0

http://hive.apache.org/releases.html#Download

http://mirror.apache-kr.org/hive/hive-0.9.0/hive-0.9.0.tar.gz

- haproxy

version : 1.4.23

http://haproxy.1wt.eu/

http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.23.tar.gz

- jdk

version : 1.6.0_45

http://www.oracle.com/technetwork/java/javase/downloads/jdk6downloads-1902814.html




[VirtualBox 이미지생성 및 CentOS 설치]


- http://jmnote.com/wiki/VirtualBox_CentOS_6_%EC%84%A4%EC%B9%98

- http://wiki.centos.org/HowTos/Virtualization/VirtualBox

- VM

hiveproxy

hive1 (mysql master)

hive2 (mysql slave)

namenode

secondarynamenode

datanode1

datanode2

datanoe3

- VM 이미지 생성 후 각 이미지의 /etc/hosts 에 DNS 등록



[VirtualBox Network 설정]

- 브릿지, nat, 호스트전용 : http://searchme.tistory.com/16

- 브릿지, 호스트전용 : http://blog.naver.com/PostView.nhn?blogId=icysword&logNo=140135319512

- 첫번째와 같이 해도 되지만 개발환경에서 약간 통신 상에 문제가 있는 듯 하여 순서를 아래와 같이 변경 합니다.

- 1. NAT / 2. 브릿지 / 3. 호스트전용

- VM 이미지를 하나 만들어서 설치에 필요한 파일과 환경 구성을 한 다음 복제(완전복제)를 하십시오.



[Hadoop 설치 - namenode]

- hadoop user/group 생성

. https://www.google.co.kr/url?sa=t&rct=j&q=&esrc=s&source=web&cd=8&cad=rja&ved=0CFoQtwIwBw&url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DNKxjmDQYfJk&ei=tQh6UeyWJ-eOigeG4oCADw&usg=AFQjCNFJjajIFd7SrrgNuG5UdW0L7OECLQ&sig2=-28omSER_InldSy-yyIqaw&bvm=bv.45645796,d.aGc

- sudo groupadd hadoop

- sudo useradd hadoop -m -b /home/hadoop -d /home/hadoop -s /bin/bash

- sudo vi /etc/passwd 

        - 아래 설정의 경우 shadow password 에 대한 내용으로 계정 자체에 암호 생성을 하지 않을 경우 아래 설정은 진행 하지않아도 무방 함.

From

hadoop:*:1:1:hadoop Services:/home/hadoop:/bin/bash

To

hadoop::1:1:hadoop Services:/home/hadoop:/bin/bash

- ssh 연결을 위한 keygen (hadoop 계정)

http://jjeong.tistory.com/454

- hadoop 압축해제

. 설치경로 : /home/hadoop/app/hadoop

- JAVA_HOME 설정

vi conf/hadoop-env.sh

export JAVA_HOME=/home/hadoop/app/jdk

- core-site.xml 설정

<property>

<name>fs.default.name</name>

<value>hdfs://namenode:9000</value>

</property>

- hdfs-site.xml

<property>

<name>fs.default.name</name>

<value>hdfs://namenode:9000</value>

</property>

<property>

<name>dfs.name.dir</name>

<value>/home/hadoop/app/hadoop/data/name</value>

</property>

<property>

<name>dfs.data.dir</name>

<value>/home/hadoop/app/hadoop/data/hdfs</value>

</property>

<property>

<name>dfs.replication</name>

<value>3</value>

</property>

<property>

<name>dfs.http.address</name>

<value>http://namenode:50070</value>

</property>

<property>

<name>dfs.secondary.http.address</name>

<value>http://secondarynamenode:50090</value>

</property>

- masters

. secondarynamenode 서버 정보를 작성한다.

secondarynamenode

- slaves

. datanode 서버 정보를 작성한다.

datanode1

datanode2

datanode3

- mapred-site.xml

<property>

<name>mapred.map.child.java.opts</name>

<value>-Xmx200m</value>

</property>

<property>

<name>mapred.reduce.child.java.opts</name>

<value>-Xmx200m</value>

</property>

<property>

<name>mapred.job.tracker</name>

<value>namenode:9001</value>

</property>

<property>

<name>mapred.system.dir</name>

<value>/home/hadoop/app/hadoop/mapred/system</value>

</property>

<property>

<name>mapred.local.dir</name>

<value>/home/hadoop/app/hadoop/mapred/tmp</value>

</property>



[Hadoop 설치 - secondarynamenode + datanode]

- namenode 에 구성한 모든 정보를 그대로 복사한다.

- VM 이미지 완전복제를 통해서 그대로 구성해도 됨.



[Hadoop 실행 - namenode]

- 스크립트 실행은 namenode 에서만 수행 한다.

- (최초 실행 시) bin/hadoop namenode -format

- bin/start-all.sh

- 모든 구성 서버들이 정상적으로 실행 되었는지 로그 확인.

- namenode, secondarynamenode, datanode, jobtracker, tasktracker 데몬이 떠야 함.

- http://namenode:50070/dfshealth.jsp

- http://namenode:50030/jobtracker.jsp

- bin/stop-all.sh



[MySQL 설치]

- 설치 경로와 mysql user 만 변경해서 설치 (아래 링크 참고)

- http://www.yongbok.net/blog/how-to-install-mysql-5-5-x-from-source/

- http://blog.beany.co.kr/archives/2648

- 설치 경로 : /home/hadoop/app/mysql

- mysql user : hadoop



[MySQL - cmake/make/install]

cmake \

-DCMAKE_INSTALL_PREFIX=/home/hadoop/app/mysql \

-DMYSQL_UNIX_ADDR=/home/hadoop/app/mysql/mysql.sock \

-DDEFAULT_CHARSET=utf8 \

-DDEFAULT_COLLATION=utf8_general_ci \

-DWITH_EXTRA_CHARSETS=all \

-DMYSQL_DATADIR=/home/hadoop/app/mysql/db \

-DENABLED_LOCAL_INFILE=1 \

-DWITH_MYISAM_STORAGE_ENGINE=1 \

-DWITH_INNOBASE_STORAGE_ENGINE=1 \

-DWITH_ARCHIVE_STORAGE_ENGINE=1 \

-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \

-DWITH_MEMORY_STORAGE_ENGINE=1 \

-DWITH_READLINE=1 \

-DENABLED_LOCAL_INFILE=1 \

-DMYSQL_USER=hadoop \

-DMYSQL_TCP_PORT=3306 \

-DENABLE_DOWNLOADS=1

make && make install



[MySQL - my.cnf 수정]

- 위치 : /home/hadoop/app/mysql/my.cnf

- vi my.cnf

basedir=/home/hadoop/app/mysql

datadir=/home/hadoop/app/mysql/db

port=3306

- sudo cp my.cnf /etc/my.cnf



[MySQL - 기본DB 생성]

- scripts/mysql_install_db --user=hadoop --defaults-file=//home/hadoop/app/mysql/my.cnf

- defaults-file 을 지정하지 않을 경우 /etc/my.cnf 파일 참조함.



[MySQL 실행]

- bin/mysqld_safe &

- bin/mysql -uroot

- use mysql;

- insert into user values(....);

- update user set password=password('....') where user='xxxx' and host='xxxx'

- flush privileges;



[Hive 설치]

- http://blog.beany.co.kr/archives/1519

- hive 설치는 hadoop 이 설치된 서버와 별도로 설치 해도 됨.

- 단, hadoop 과 통신이 가능한 network 상에 있어야 함.

- 설치 경로 : /home/hadoop/app/hive



[Hive 용 HDFS 생성]

- namenode 에서 shell 로 실행

- bin/hadoop fs -mkdir /tmp

- bin/hadoop fs -mkdir /user/hive/warehouse

- bin/hadoop fs -chmod g+w /tmp

- bin/hadoop fs -chmod g+w /user/hive/warehouse



[Hive hive-env.sh 설정]

- cp conf/hive-env.sh.template conf/hive-env.sh

HADOOP_HOME=/home/hadoop/app/hadoop



[Hive metastore 설정]

- conf/hive-site.xml

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/usr/hive/warehouse</value>

<description>hdfs path for hive metastore</description>

</property>

<property>

<name>fs.default.name</name>

<value>hdfs://namenode:9000</value>

</property>

<property>

<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>

<description>JDBC connect string for a JDBC metastore</description>

</property>

<property>

<name>javax.jdo.option.ConnectionDriverName</name>

<value>com.mysql.jdbc.Driver</value>

<description>Driver class name for a JDBC metastore</description>

</property>

<property>

<name>javax.jdo.option.ConnectionUserName</name>

<value>hadoop</value>

<description>username to use against metastore database</description>

</property>

<property>

<name>javax.jdo.option.ConnectionPassword</name>

<value>hadoop.user.mysql.password</value>

<description>password to use against metastore database</description>

</property> 

<property>

<name>datanucleus.autoCreateSchema</name>

<value>false</value>

</property> 

<property>

<name>datanucleus.fixedDatastore</name>

<value>true</value>

</property> 



[Hive JDBC Driver 등록]

- http://www.mysql.com/downloads/connector/j/

- mysql-connector-java-5.1.24.jar 를 hive/lib 아래로 복사



[Hive 실행]

- bin/start-hive.sh

#!/bin/bash

HIVE_HOME=/home/hadoop/app/hive

/usr/bin/nohup $HIVE_HOME/bin/hive --service hiveserver > $HIVE_HOME/logs/hive.log 2>&1 < /dev/null &

echo $! > $HIVE_HOME/bin/hive-server.pid

- bin/stop-hive.sh

#!/bin/bash

/bin/cat /home/hadoop/app/hive/bin/hive-server.pid | xargs kill -9



[Hive CLI]

- bin/hive

hive> quit;



[Hive Metastore DB 구성]

- mysql -uroot

mysql> create database metastore_db;

mysql> use metastore_db;

mysql> source /home/hadoop/app/hive/scripts/metastore/upgrade/mysql/hive-schema-0.9.0.mysql.sql

mysql> show tables;



[Hive 데이터 등록]

- vi textfile

1,2

3,4

5,6

- bin/hive

hive> create table citi (citing int, cited int) row format delimited fields terminated by ',' stored as textfile;

- mysql -uroot

mysql> use metastore_db;

mysql> select * from TBLS\G;



[Hive HA 구성]

- hive 1번 서버 구성과 같은 구성으로 hive 2번 서버를 구성한다.

- 구성된 서버들을 haproxy 로 묶는다.



[HAProxy 설치]

- http://haproxy.1wt.eu/

- https://github.com/langpavel/haproxy-doc

- http://linuxadminzone.com/install-and-configure-haproxy-the-software-based-loadbalancer-in-ubuntu/

- http://www.sestory.net/73

- http://helloworld.naver.com/helloworld/284659


[HAProxy /etc/haproxy/haproxy.cfg 샘플]

global

        log 127.0.0.1  local0

        maxconn 1024

        uid 99

        gid 99

        daemon

 

defaults

        log    global

        mode    http

        option httplog

        option dontlognull

        retries 3

        option redispatch

        maxconn 1024

        contimeout      5000

        clitimeout      50000

        srvtimeout      50000

 

listen  hive-service 192.168.56.102:80

        option forwardfor

        option httpchk OPTIONS /health_check.html

        stats enable

        stats refresh 10s 

        stats hide-version

        stats scope   .   

 

        server  web1 www.naver.com:80 check inter 2000 fall 3

        server  web2 www.daum.net:80 check inter 2000 fall 3



: