본문 바로가기
TIL/Server

CentOS 기반 Fluentd와 HDFS(Hadoop) 연동하기

by DandyU 2018. 9. 12.

# CentOS 기반 Fluentd와 HDFS(Hadoop) 연동하기

 

@ Fluentd 준비하기

  1. 설치

curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh

 

  1. 데몬 실행

/etc/init.d/td-agent start

 

    1. systemd

systemctl [start / stop / restart / status] td-agent.service

 

    1. init.d

/etc/init.d/td-agent [start / stop / restart / status]

 

  1. 테스트(8888 포트는 최초 설치 시 디폴트로 사용)

curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test

 

  1. 테스트 확인

tail -f /var/log/td-agent/td-agent.log



@ HDFS(Hadoop) 준비하기

 

  1. 통신할 때 필요하다는 ssh, rsync를 설치하기(설치되어 있지 않은 경우에만 설치하면 됨)

yum install ssh

yum install rsync

 

  1. svc 디렉토리 만들기

mkdir /svc

 

  1. JDK 설치(Hadoop 동작에 필요함)

mkdir /svc/java

cd /svc/java

curl -O https://cdn.azul.com/zulu/bin/zulu8.31.0.1-jdk8.0.181-linux_x64.tar.gz (Open JDK zulu 8 사용)

tar -xzf <파일명>.tar.gz

JAVA_HOME를 환경변수로 등록(vi ~/.bashrc), source ~/.bashrc로 쉘에 환경변수 반영

참고로, Hadoop용 JAVA_HOME을 설정하고자 하는 경우, <hadoop 설치 경로>/etc/hadoop/hadoop-env.sh에 설정

 

export JAVA_HOME=/svc/java/jdk8.0.181
PATH=$PATH:$JAVA_HOME/bin

 

  1. Hadoop 바이너리 다운로드

https://hadoop.apache.org 에서 다운로드 URL 참고해서

/svc 디렉토리에 다운로드 및 압축 해제

curl -O http://mirror.navercorp.com/apache/hadoop/common/hadoop-3.1.1/hadoop-3.1.1.tar.gz

tar -xzf <파일명>.tar.gz

 

  1. 테스트(MapReduce 수행)

 

$ cd /svc/hadoop-3.1.1
$ mkdir input
$ cp etc/hadoop/*.xml input
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.0.jar grep input output 'dfs[a-z.]+'

 

  1. 테스트 확인

cat output/*

 

  1. Single Node Cluster 설정(Single Node Setup 가이드 참고)
    1. /svc/<Hadoop 경로>/etc/hadoop/core-site.xml 편집, <configuration>에 아래 내용 추가
<property>
 <name>fs.defaultFS</name>
 <value>hdfs://localhost:9000</value>
</property>
    1. /svc/<Hadoop 경로>/etc/hadoop/hdfs-site.xml 편집, <configuration>에 아래 내용 추가
<property>
 <name>dfs.replication</name>
 <value>1</value>
</property>
    1. passphraseless ssh 설정

ssh localhost를 쉘에 입력했을 때, 인증 절차를 수행하면 아래 표를 진행한다.

$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
    1. 데몬 실행
- 파일 시스템 포맷
$ <Hadoop 경로>/bin/hdfs namenode -format
- NameNode와 DataNode 데몬 실행
$ <Hadoop 경로>/sbin/start-dfs.sh
    1. <Hadoop 경로>/sbin/start-dfs.sh를 수행했을 때 아래와 같은 에러가 발생하면 f를 진행한다.
[root@localhost /]# /svc/hadoop-3.1.1//sbin/start-dfs.sh
Starting namenodes on [localhost]
ERROR: Attempting to operate on hdfs namenode as root
ERROR: but there is no HDFS_NAMENODE_USER defined. Aborting operation.
Starting datanodes
ERROR: Attempting to operate on hdfs datanode as root
ERROR: but there is no HDFS_DATANODE_USER defined. Aborting operation.
Starting secondary namenodes [localhost.localdomain]
ERROR: Attempting to operate on hdfs secondarynamenode as root
ERROR: but there is no HDFS_SECONDARYNAMENODE_USER defined. Aborting operation.
    1. 아래 표는 e 에서 에러가 발생한 경우만 진행
vi <hadoop 경로>/etc/hadoop/hadoop-env.sh 후 아래 내용을 추가
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
다시 테스트
$ <Hadoop 경로>/sbin/start-dfs.sh
    1. Hadoop 데몬이 실행되면 <Hadoop 경로>/logs 디렉토리에 로그를 생성함
    2. NameNode를 위한 Web 인터페이스 확인

http://localhost:9870을 입력하면 index.html 페이지 확인할 수 있음

    1. 테스트
$ bin/hdfs dfs -mkdir /user
$ bin/hdfs dfs -mkdir /user/<username>

$ bin/hdfs dfs -put etc/hadoop input
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.1.jar grep input output 'dfs[a-z.]+'
$ bin/hdfs dfs -cat output/*
    1. 데몬 종료

<Hadoop 경로>/sbin/stop-dfs.sh

 

@ Fluentd + HDFS 연동하기

  1. Fluentd 설정하기
    1. /etc/td-agent/td-agent.conf 설정 (vi /etc/td-agent/td-agent.conf)
    2. 기본 설정을 다 지우고 아래 설정을 적용
# HTTP input
# POST http://localhost:8888/<tag>?json=<json>
# POST http://localhost:8888/td.myapp.login?json={"user"%3A"me"}
# @see http://docs.fluentd.org/articles/in_http
<source>
 @type http
 @id input_http
 port 8888
</source>

<match hdfs.*.*>
 @type webhdfs
 host localhost
 port 9870
 path "/log/%Y%m%d_%H/access.log.#{Socket.gethostname}"
 username digicap # username을 설정하지 않으면 default username “dr.who”를 사용
</match>
    1. 데몬 재실행(/etc/init.d/td-agent restart)
  1. HDFS 설정하기
    1. /svc/<Hadoop 경로>/etc/hadoop/hdfs-site.xml 설정(vi /svc/hadoop-3.1.1/etc/hadoop/hdfs-site.xml)
    2. <configuration> 안에 아래 설정을 적용, 아래 설정이 기본적으로 disabled라 활성화 해줘야 함
<property>
 <name>dfs.webhdfs.enabled</name>
 <value>true</value>
</property>

<property>
 <name>dfs.support.append</name>
 <value>true</value>
</property>

<property>
 <name>dfs.support.broken.append</name>
 <value>true</value>
</property>
    1. <Hadoop 경로>/sbin/start-dfs.sh

 

  1. 연동 테스트(Sending a USR1 signal flushes Fluentd’s buffer into WebHDFS.)
curl -X POST -d 'json={"action":"login","user":2}' http://localhost:8888/hdfs.access.test
kill -USR1 `cat /var/run/td-agent/td-agent.pid`
  1. 연동 테스트 결과 확인

<Hadoop 경로>/bin/hdfs dfs -ls /log/*

 

결과 확인이 안될 때 Hadoop에서 생성하는 로그를 확인이 필요하고, 아래처럼 User 권한 문제가 발생하면 <Hadoop 경로>/etc/hadoop/hadoop-env.sh에 HADOOP_USER_NAME을 추가하고 데몬 재실행한 후 다시 테스트한다.

2018-09-12 14:51:00,886 INFO org.apache.hadoop.ipc.Server: IPC Server handler 4 on 9000, call Call#384 Retry#0 org.apache.hadoop.hdfs.protocol.ClientProtocol.create from 127.0.0.1:34390: org.apache.hadoop.security.AccessControlException: Permission denied: user=digicap, access=WRITE, inode="/":root:supergroup:drwxr-xr-x

 

export HADOOP_USER_NAME=digicap

 

'TIL > Server' 카테고리의 다른 글

리눅스 SNMP OID 등록 방법  (0) 2017.03.09

댓글