hadoop 설치

1. masters 에는 secondary namenode 주소를
2. slave 에는 DataNode 주소를

fs.default.name
hdfs://masterip:9000

hadoop.tmp.dir
dir

dfs.name.dir
dir

dfs.data.dir
dir

dfs.replication
3

mapred.job.tracker
hdfs://masterip:9001

mapred.system.dir
dir/mapred/system

mapred.local.dir
dir/mapred/local

Hadoop 에서 Secondary Namenode 의 역활

Hadoop 에는 NameNode 와 Secondary NameNode 라는 게 있습니다. 일반적인 생각은 아 Master NameNode 가 죽으면, Secondary NameNode 가 Active-Standby 형태로 동작하지 않을까? 라고 희망을 가지게 됩니다. 하지만, 현재까지의 Hadoop 에서는 그런 멋진 기능은 제공하지 않습니다.(facebook 에서 avatar node 라고 해서 이런걸 제공할려고 하고 있습니다.)

그럼, Secondary Namenode 는 무슨 역할을 하는가? 라는 의문이 생기게 됩니다. 정확하게 얘기를 하자면 SNN의 역할은 백업 용도입니다. 하지만, Master Namenode 즉 NN의 운영에 도움을 줍니다. 라고 말할 수 있습니다.

SNN이 fsimage 와 edits.new 를 일정시간 마다 merge 하고 이를 다시 NN에게 전달하기 때문입니다. 여기서 fsimage 는 NN의 메모리 상태를 가지고 있는 파일입니다. edits.new는 변경 사항을 가지고 있는 log 파일이라고 보면 될듯 합니다. 이때 SNN이 fsimage와 edits.new를 병합해서 NN으로 던져주지 않으면, NN에 계속 edits.new가 커지게 되어서, 결국 edits.new가 메모리 사이즈 보다 커지게 되면, 재시작시에 문제가 발생할 수 있습니다.

http://www.jaso.co.kr/279 를 보시면 이에 대한 내용이 잘 나와있습니다. ^^

간단하게 소스를 따라가자면
src/java/org/apache/hadoop/hdfs/server/namenode/SecondaryNameNode.java

를 보면 doWork 라는 함수가 있습니다. doWork 에서 doCheckpoint() 를 호출하게 됩니다.

  public void doWork() {

    //
    // Poll the Namenode (once every 5 minutes) to find the size of the
    // pending edit log.
    //
    long period = 5 * 60;              // 5 minutes
    if (checkpointPeriod = checkpointSize ||
            now >= lastCheckpointTime + 1000 * checkpointPeriod) {
          doCheckpoint();
          lastCheckpointTime = now;
        }
      } catch (IOException e) {
        LOG.error("Exception in doCheckpoint: ");
        LOG.error(StringUtils.stringifyException(e));
        e.printStackTrace();
        checkpointImage.getStorage().imageDigest = null;
      } catch (Throwable e) {
        LOG.error("Throwable Exception in doCheckpoint: ");
        LOG.error(StringUtils.stringifyException(e));
        e.printStackTrace();
        Runtime.getRuntime().exit(-1);
      }
    }
  }

여기서 다시 namenode.rollFsImage(sig)로 호출하게 됩니다.

  boolean doCheckpoint() throws IOException {

    // Do the required initialization of the merge work area.
    startCheckpoint();

    // Tell the namenode to start logging transactions in a new edit file
    // Returns a token that would be used to upload the merged image.
    CheckpointSignature sig = namenode.rollEditLog();

    // error simulation code for junit test
    if (ErrorSimulator.getErrorSimulation(0)) {
      throw new IOException("Simulating error0 " +
                            "after creating edits.new");
    }

    boolean loadImage = downloadCheckpointFiles(sig);   // Fetch fsimage and edits
    doMerge(sig, loadImage);                   // Do the merge

    //
    // Upload the new image into the NameNode. Then tell the Namenode
    // to make this new uploaded image as the most current image.
    //
    putFSImage(sig);

    // error simulation code for junit test
    if (ErrorSimulator.getErrorSimulation(1)) {
      throw new IOException("Simulating error1 " +
                            "after uploading new image to NameNode");
    }

    namenode.rollFsImage(sig);
    checkpointImage.endCheckpoint();

    LOG.warn("Checkpoint done. New Image Size: "
             + checkpointImage.getStorage().getFsImageName().length());

    return loadImage;
  }

중요한 의문중에 하나는 SNN이 merge 해서 NN에 sync 하게 되면 NN이 다시 이를 재로딩 하는가? 였는데, 그러지는 않고, 그냥 백업 용도로만 저장이 되니다. hadoop 이 내려갔다가 다시 올라올 때, 이 fsimage 와 edits.new 를 다시 병합해서 메모리에 적재하게 됩니다.

관련해서 인터넷 검색에서 좋은 이미지가 나와서 링크합니다. 출처는 여기입니다.
http://datasearch.ruc.edu.cn/~boliangfeng/blog/?p=551

제가 까먹을까 봐서 정리했고 많은 도움 주신 클라우드 컴퓨팅 구현 기술 그룹분들께 감사드립니다. cloudtech@groups.facebook.com

cassandra와 thrift 의 설치

cassandra 는 facebook 에서 만든 NoSQL 입니다.
아버지를 아버지라 부르지 못한다고, 최근에 Facebook 에서 더 이상 cassandra 에 대한 contribution 은 없다고
선언한 상황이지만, apache main project 이므로 어느정도 발전을 기대할 수는 있지 않을까 싶습니다.

현재 cassandra의 공식 버전은 0.6.8 이고, 0.7.0-RC 버전이 진행중입니다.

http://cassandra.apache.org/

cassandra의 설치는 굉장히 쉽습니다.

1. 다운을 받습니다.
2. 압축을 풉니다.
3. conf/storage-conf.xml 파일을 수정합니다.

DataFileDirectory 는 데이터가 저장될 디렉토리 이고
Seeds 는 cassandra 새 노드가 추가될 때, 관련 정보를 어디서 확인할 것인지 알려주는 서버주소입니다.
ListenAddress 는 Cassandra 끼리 통신할 때 어느주소로 바인딩 할것인지 결정하는 겁니다.
여기서는 0.0.0.0 이나 localhost 라고 적으면 시작이 안됩니다.
ThriftAddress 는 Thrift RPC로 접근할 수 있는 Port 주소 입니다. 0.0.0.0 으로 하면 모든 주소로
바인딩 하게 됩니다.
ThriftFramedTransport 는 FramedTransport 를 쓸것이냐 여부입니다. Framed는 Buffered 와 호환이
되지 않으므로, 취향에 맞게 결정하시면 됩니다.
ReplicationFactor 는 몇개의 Replica 를 구성할 것인지 여부입니다.

  <SavedCachesDirectory>/data/cassandra/saved_caches</SavedCachesDirectory>
  <CommitLogDirectory>/data/cassandra/commitlog</CommitLogDirectory>
  <DataFileDirectories>
      <DataFileDirectory>/data/cassandra/data</DataFileDirectory>
  </DataFileDirectories>

  <Seeds>
      <Seed>172.27.0.3</Seed>
  </Seeds>

  <ListenAddress>172.27.0.2</ListenAddress>
  <!– internal communications port –>
  <StoragePort>7000</StoragePort>

  <ThriftAddress>0.0.0.0</ThriftAddress>
  <!– Thrift RPC port (the port clients connect to). –>
  <ThriftPort>9160</ThriftPort>

  <ThriftFramedTransport>true</ThriftFramedTransport>
  <ReplicationFactor>1</ReplicationFactor>

이 파일을 수정하고 나면

4. log4j.properties 를 열어서 로그가 어디로 쌓일 건지 결정하면 됩니다.

그리고 bin/cassandra 만 하면 -_- 끝입니다. 엄청 간단하지요?

cassandra 가 hadoop, hbase 와 다른건, p2p 방식처럼 자신이 스스로를 broadcast 해서 다른 서버
설정을 특별히 알 필요가 없습니다.

5. thrift 의 설정
cassandra 0.6 대 버전은 thrift 0.4.0 버전을 써야 합니다.
thrift 0.5.0 은 현재 cassandra 0.7대 버전을 위한 것입니다. 잘못 고르면 빌드가 안되는 ㅎㅎㅎ

hadoop 0.21 설치 방법

1. hadoop download

2. hadoop 압축 풀기
3. 각 서버들에 ssh 연결 설정 만들기
 
 1)namenode 로 사용할 서버에서
  ssh-keygen -t rsa
 
 .ssh 에 생성될 파일중에 id_rsa.pub 라는 파일을(공개키다)
 datanode로 사용될 파일들에 복사 .ssh 를 만들어서 authorized_keys 라는 이름으로 복사
 .ssh 는 755 로 authorized_keys 는 644

4. hadoop_env.sh 설정 다음 설정 추가

export JAVA_HOME=/usr/
export HADOOP_HOME=/home/charsyam/hadoop
export HADOOP_LOG_DIR=/data/hadoop/logs
export HADOOP_SLAVES=${HADOOP_HOME}/conf/slaves

5. master/slave 설정
master 에는 namenode 로 사용될 서버 ip
slave 에는 datanode 로 사용될 서버 ip 추가

6. core-site.xml 설정
<?xml version=”1.0″?>
<?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>

<!– Put site-specific property overrides in this file. –>

<configuration>
    <property>
        <name>webinterface.private.actions</name>
        <value>true</value>
        <description> If set to true, the web interfaces of JT and NN may contain
                actions, such as kill job, delete file, etc., that should
                not be exposed to public. Enable this option if the interfaces
                are only reachable by those who have the right authorization.
        </description>
    </property>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://172.27.0.2:54310</value>
        <description></description>
    </property>
    <property>
        <name>dfs.name.dir</name>
        <value>/data/hadoop/name</value>
        <description></description>
    </property>
    <property>
        <name>dfs.data.dir</name>
        <value>/data/hadoop/data</value>
        <description></description>
    </property>
</configuration>

7. hdfs-site.xml 설정
<?xml version=”1.0″?>
<?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>

<!– Put site-specific property overrides in this file. –>

<configuration>
    <property>
        <name>dfs.name.dir</name>
        <value>/data/hadoop/name</value>
        <description></description>
    </property>
    <property>
        <name>dfs.data.dir</name>
        <value>/data/hadoop/data</value>
        <description></description>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/data/hadoop/dfs</value>
        <description>A base for other temporary directories.</description>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
</configuration>

8. mapred-site.xml 수정
<?xml version=”1.0″?>
<?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>

<!– Put site-specific property overrides in this file. –>

<configuration>
 <property>
  <name>mapreduce.job.tracker</name>
  <value>172.27.0.2:54311</value>
  <description></description>
 </property>
 <property>
  <name>mapreduce.jobtracker.system.dir</name>
  <value>/data/hadoop/mapreduce/system</value>
  <description></description>
 </property>
 <property>
  <name>mapreduce.cluster.local.dir</name>
  <value>/data/hadoop/mapreduce/local</value>
  <description></description>
 </property>

 <property>
  <name>mapred.tasktracker.map.tasks.maximum</name>
  <value>2</value>
  <description></description>
 </property>
 <property>
  <name>mapred.tasktracker.reduce.tasks.maximum</name>
  <value>2</value>
  <description></description>
 </property>
</configuration>

9. 모든 설정 파일을 각 서버로 복사해준다.

10. Namenode format
   bin/hadoop namenode -format
11. start-dfs.sh
12. start-mapred.sh

13. jps 로 제대로 설정되었는지 확인