Ubuntu 14.10 (trusty version) 에 Hortonworks Hadoop with Ambari를 설치하는 방법입니다.

Hortonworks Hadoop with Ambari

Requirements

  • Oracle Java 1.7 or 1.8
  • Metastore Database (Postgres 8.x or 9.3+, Mysql 5.6, oracle 11g r2)

데이터베이스에는 다음의 유저들이 필요합니다.
(참고로 Hive default metastore는 derby이지만, production에서는 Derby가 사용되지 않습니다. - not suppported)
그냥 mysql-server설치 하면 됩니다.

sudo apt-get install libmysql-java ntp
sudo apt-get install openssh-server

Configuring CentOS

sudo yum install mlocate

Default Ports

Service Name Port Protocol
Ambari Ambari Web Interface 8080 HTTP
Ambari Handshake Port for Ambari Agents to Ambari Server 8440 HTTPS
Ambari Registration & Heartbeat Port
for Ambari Agents to Ambari Server
8441 HTTPS
HDFS mapreduce.jobhistory.address 10020 IPC
HDFS mapreduce.jobhistory.admin.address 10033 IPC
HDFS mapreduce.jobhistory.webapp.address 19888 WEB
NameNode NameNode 50070  
NameNode NameNode RPC 8020  
Secondary NameNode HDFS Secondary NameNode 50090  
ZooKeeper ZooKeeper Client 2181  

Disable Transparent Huge Pages (Optional)

Hadoop의 Performance의 영향을 줄 수 있는 부분입니다.
일단 확인하는 방법은 다음과 같습니다.

cat /sys/kernel/mm/transparent_hugepage/enabled
[always] truned on
[never] turned off

disable해주기 위해서는 다음의 파일을 엽니다.

sudo vi /etc/default/grub

다음의 예제처럼 transparent_hugepage=never를 추가시켜줍니다.

GRUB_CMDLINE_LINUX_DEFAULT="console=tty1 console=ttyS0 transparent_hugepage=never"
sudo update-grub

Configure .bashrc

.bashrc에 다음과 같이 추가합니다.

# Java
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
unset JAVA_TOOL_OPTIONS

# Hadoop
export HADOOP_PREFIX=/usr/hdp/current/hadoop-client
export HADOOP_MAPRED_HOME=$HADOOP_PREFIX
export HADOOP_COMMON_HOME=$HADOOP_PREFIX
export HADOOP_HDFS_HOME=$HADOOP_PREFIX
export YARN_HOME=$HADOOP_PREFIX
export HADOOP_CONF_DIR=$HADOOP_PREFIX/conf
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_PREFIX/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib/native"
export HADOOP_CLASSPATH=$HADOOP_PREFIX/conf
export CLASSPATH=$CLASSPATH:$HADOOP_PREFIX/lib/*:.
export PATH=$PATH:$HADOOP_PREFIX/bin
export PATH=$PATH:$HADOOP_PREFIX/sbin

Installing Ambari

Apache Ambari Installation on Ubuntu 16 링크를 참조

$ sudo wget -O /etc/apt/sources.list.d/ambari.list http://public-repo-1.hortonworks.com/ambari/ubuntu16/2.x/updates/2.5.0.3/ambari.list

$ sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B9733A7A07513CAD
$ sudo apt-get update
$ sudo apt-get install ambari-server
$ sudo apt-get install ambari-agent
$ sudo apt-get install ambari-metrics-assembly

설치후 제대로 모두 설치됐는지 다음과 같이 확인합니다.

apt-cache showpkg ambari-server
apt-cache showpkg ambari-agent
apt-cache showpkg ambari-metrics-assembly

만약 ambari-server start를 했을때 ImportError: No module named ambari_commons.exceptions이 발생한다면 다음과 같이 합니다.

sudo cp -r /usr/lib/python2.6/site-packages/* /usr/local/lib/python2.7/dist-packages/

Mysql Setting

만약 MySQL 또는 MariaDB를 새로 설치했다면 Encoding 먼저 설정합니다.
(아래는 MariaDB에서 encoding설정하는 방법)

sudo vi /etc/mysql/conf.d/mariadb.cnf

아래의 예제처럼 utf-8으로 설정을 합니다.

[mysqld_safe]
default-character-set=utf8

[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

설정한 후에 restart 합니다.

sudo service mysql restart

HortonWorks Hadoop을 설정하기 위해서 먼저 MySQL Server에 접속합니다.

> mysql -u root -p
CREATE USER `ambari`@`localhost` IDENTIFIED BY '1234';
CREATE USER `ambari`@`%` IDENTIFIED BY '1234';
CREATE USER `hive`@`localhost` IDENTIFIED BY '1234';
CREATE USER `hive`@`%` IDENTIFIED BY '1234';
CREATE USER `oozie`@`localhost` IDENTIFIED BY '1234';
CREATE USER `oozie`@`%` IDENTIFIED BY '1234';

GRANT ALL PRIVILEGES ON *.* to `ambari`@`localhost` with grant option;
GRANT ALL PRIVILEGES ON *.* to `ambari`@`%` with grant option;
GRANT ALL PRIVILEGES ON *.* to `hive`@`localhost` with grant option;
GRANT ALL PRIVILEGES ON *.* to `hive`@`%` with grant option;
GRANT ALL PRIVILEGES ON *.* to `oozie`@`localhost` with grant option;
GRANT ALL PRIVILEGES ON *.* to `oozie`@`%` with grant option;

FLUSH PRIVILEGES;

CREATE DATABASE ambari;
CREATE DATABASE oozie;
CREATE DATABASE hive;
mysql -u ambari -p ambari < /var/lib/ambari-server/resources/Ambari-DDL-MySQL-CREATE.sql

Configuring root account

여러모로 root로 계정으로 HDP를 설정하는것이 여러모로 이롭습니다.
만약 pulblic key를 안만들었다면 다음을 참고 합니다.

On Localhost

SSH 를 먼저 설정해줍니다.
포인트는 root계정으로 해야하며, ssh root@localhost를 했을때 에러가 없어야 합니다.

$ sudo su
$ cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

On AWS EC2

만약 EC2라면 ubuntu계정의 authorized_keys값을 root의 authorized_keys값에 넣습니다.

$ sudo su
$ cat /home/ubuntu/.ssh/authorized_keys > /root/.ssh/authorized_keys
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys

ssh -i private-key.pem root@localhost 을 했을때 접속이 잘되면 EC2에서도 암호를 물어보지 않고 접속이 되면 됩니다.

Setting up Ambari

sudo ambari-server setup

root계정으로 ambari를 돌릴려면 n 을 누르고, 새로운 유저를 만들려면 y를 누릅니다.

Customize user account for ambari-server daemon [y/n] (n)? n

계속 알수 없는 에러가 날 경우(MySQL접속 등등) 다음의 파일을 확인해 봅니다.

Name Command
Ambari Server sudo vi /etc/ambari-server/conf/ambari.properties
Ambari Agent sudo vi /etc/ambari-agent/conf/ambari-agent.ini

Hostname Settings

On Localhost

Ambari Agent에 설정된 hostname을 확인합니다.
(아래 “anderson-desktop”은 나중에 ambari설치시에 사용되게 됩니다.)

$ sudo su
$ hostname -f
anderson-desktop

ambari-agent.ini 파일을 열고 hostname을 변경합니다.

$ sudo vi /etc/ambari-agent/conf/ambari-agent.ini
[server]
hostname=anderson-desktop
url_port=8440
secured_url_port=8441

On AWS

/etc/hosts로 들어가서 public domain을 넣습니다.

52.192.233.209	ec2-52-192-233-209.ap-northeast-1.compute.amazonaws.com

이후 저장하고 나와서 다음의 명령어로 hostname을 변경해줍니다.
ambari-agent conf를 들어가서

sudo hostname ec2-52-192-233-209.ap-northeast-1.compute.amazonaws.com

ambari-agent 안의 hostname을 변경합니다.

sudo vi /etc/ambari-agent/conf/ambari-agent.ini

hostname=PRIVATE_DOMAIN_NAME

Start Ambari

$ sudo ambari-server start

실행시킨후 http://localhost:8080로 들어가면 Ambari Webpage를 볼 수 있습니다.
기본 ID/Password는 admin/admin 입니다.

Installing HDP on Localhost

(AWS에서의 설치는 해당 부분을 skip합니다.)

[1] Cluster Name을 설정합니다.

[2] Hostname과 SSH Private Key를 등록시킵니다.

hostname 찾는것은 다음과 같습니다.

$ sudo su
$ hostname -f
anderson-desktop

SSH Private key 찾는 것은 다음과 같습니다.

$ sudo su
$ cat ~/.ssh/id_rsa

Installing HDP on AWS

이곳부터는 너무 쉬워서 tutorial도 필요없지만, 몇가지 알아야할 사항만 적는다면..

  • EC2 사용시 Install Options -> Target Hosts안에 internal private DNS를 적습니다.
    ex)ip-172-31-8-106.ap-northeast-1.compute.internal
    또한 SSH Private Key에다가는 .pem파일을 업로드 하고, SSH User는 ubuntu로 변경해줍니다.

Installing Services

먼저 JDBC를 설치합니다.

sudo ambari-server setup --jdbc-db=mysql --jdbc-driver=/usr/share/java/mysql-connector-java.jar

Oozie

Derby 사용하는 서비스들에서 MySQL/PostgreSQL 로 변경해주는 것이 좋습니다.

Hive

Hive Database를 existing MySQL/ MariaDB Database 로 변경합니다.

Finish

Removing Service

Ambari를 사용중에 있다가 도중에 Service를 삭제해야할때도 있습니다. 이경우 다음과 같이 합니다.

curl -u admin:admin -H "X-Requested-By: ambari" -X DELETE http://AMBARI-SERVER-ADDRESS:8080/api/v1/clusters/CLUSTER-NAME/services/SERVICE-NAME

ZEPPELIN 삭제하는 방법

curl -u admin:admin -H "X-Requested-By: ambari" -X DELETE http://localhost:8080/api/v1/clusters/test/services/ZEPPELIN

HDP Configuration when using Public IP

JAVA_HOME Configuration

JAVA_HOME을 설정해주어야 합니다. (ambari-metrics-collector에서 에러가 날 수 있습니다.)

sudo vi /etc/ambari-metrics-collector/conf/ams-env.sh
# Java
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
unset JAVA_TOOL_OPTIONS

dfs.namenode.*-address

설치후 Ambari설치시 설정한 hostname으로 박혀있을텐데 이것을 0.0.0.0으로 바꿔줘야 합니다.
자세한 사항은 Namenode: BindException을 참고..

Hbase Master Bind Address

hbase-site.xml -> hbase.master.hostname (0.0.0.0) 추가

/etc/hbase/conf/regionservers 에서 regionserver의 hostname을 변경합니다.

sudo vi /etc/hbase/conf/regionservers 

Hbase master 그리고 regionserver 를 테스트를 위해 키고 끄는건 다음과 같이 합니다.

sudo -u hbase hbase master (start|stop|restart)
sudo -u hbase hbase regionserver

Ambari Matrix Collector

일단 Ambari Matrix Collector는 2가지 모드가 있습니다. (embedded, distributed) embedded의 경우는 Hbase를 직접 하나 띄워서 (기존의 Hbase말고.. Ambari Matrix Collector 가 사용할 Hbase) 여기에 저장시키고, distributed는 HDFS에다가 저장을 합니다.

Ambari -> Ambari Metrics -> Custom ams-hbase-site 에서 다음을 추가시켜줍니다.

Name Value
hbase.master.hostname 0.0.0.0
hbase.regionserver.hostname 0.0.0.0

만약 Zookeeper안에 /ams-hbase-unsecure 라는 znode가 없으면 만들어 줍니다.

zookeeper-client 
ls /
create /ams-hbase-unsecure mydata

Errors

not supported os type

공식적으로 support하고 있는 OS 버젼이 아닌곳에서 설치하기 때문에 발생한 에러입니다.
(Ambari Agent를 server에 등록시 OS를 체크하게 되는데 이때 발생됨)
에러메세지는 다음과 같습니다.

Controller.py:162 - Cannot register host with not supported os type, hostname=localhost, serverOsType=ubuntu16, agentOsType=ubuntu16

/usr/lib/python2.6/site-packages/ambari_agent/Facter.py 파일을 열어서 다음과 같이 수정합니다.

$ sudo vi /usr/lib/python2.6/site-packages/ambari_agent/Facter.py

  # Returns the OS name
  def getKernel(self):
    return 'ubuntu14' # platform.system()

  # Returns the full name of the OS
  def getOperatingSystem(self):
    return '14.04' # OSCheck.get_os_type()

pyc파일을 삭제합니다.

sudo rm /usr/lib/python2.6/site-packages/ambari_agent/Facter.pyc

restart합니다.

sudo service ambari-agent restart
sudo ambari-server restart

mysql-connector-java Error (when installing Oozie)

이 부분은 Oozie설치할때 나타나는 문제인데.. 다른 버젼이 서로 충돌해서 생기는 문제입니다.

resource_management.core.exceptions.Fail: Execution of '/usr/bin/apt-get -q -o Dpkg::Options::=--force-confdef --allow-unauthenticated --assume-yes install mysql-connector-java' returned 100.

이렇게 에러가 나오면 다음과 같이 해줍니다.
우분투에서 mysql-connector-java 를 설치할때 이미 설치된 라이브러리버젼과 달라 충돌해서 생기는 에러입니다.

sudo apt-get remove libmysql-java

그냥 지우기만 하면 안되고.. Oozie설치후 mysql-connector-java가 설치되었는지 확인해 봅니다. (즉 Oozie설치되면서 대체됨)

ls /usr/share/java | grep mysql-connector-java

Agent Hostname Not Matching

ERROR 2016-07-08 23:31:39,635 main.py:146 - Ambari agent machine hostname (localhost) does not match expected ambari server hostname (ip-172-31-27-227.ap-northeast-1.compute.internal). Aborting registration. Please check hostname, hostname -f and /etc/hosts file to confirm your hostname is setup correctly

이경우 Agent Configuration이 잘못된 경우입니다.

sudo vi /etc/ambari-agent/conf/ambari-agent.ini

아래의 hostname을 ambari 웹 컨트롤 페이지의 target hosts에서 적었던 hostname과 동일하게 맞춰줍니다.

[server]
hostname=ip-172-31-27-227.ap-northeast-1.compute.internal
url_port=8440
secured_url_port=8441

Agent를 Restart해줍니다.

ambari-agent restart

그 다음 hostname 명령어를 통해서 일치시켜줍니다.

sudo hostname ip-172-31-27-227.ap-northeast-1.compute.internal

Internal Bug

  File "/var/lib/ambari-agent/cache/stacks/HDP/2.0.6/hooks/before-START/scripts/params.py", line 158
    ambari_db_rca_password = config['hostLevelParams']['ambari_db_rca_password'][0]
TypeError: 'int' object has no attribute '__getitem__'

위와 같은 에러 발생시 /var/lib/ambari-agent/cache/stacks/HDP/2.0.6/hooks/before-START/scripts/params.py편집해서 158 line근처에 [0] 이 붙어있는 부분을 제거해줍니다.

sudo vi /var/lib/ambari-agent/cache/stacks/HDP/2.0.6/hooks/before-START/scripts/params.py

다음과 같이 만들어 줍니다.

ambari_db_rca_url = config['hostLevelParams']['ambari_db_rca_url']
ambari_db_rca_driver = config['hostLevelParams']['ambari_db_rca_driver']
ambari_db_rca_username = config['hostLevelParams']['ambari_db_rca_username']
ambari_db_rca_password = config['hostLevelParams']['ambari_db_rca_password']

Ambari Agent Error

분명 apt-cache showpkg ambari-agent 하면 설치가 되어 있음에도 불구하고 sudo ambari-agent를 치면 없는 명령어라고 나오는 경우가 있을수 있습니다. 이 경우 manually ambari-agent를 설치해야 합니다.

WARNING: A HTTP GET method, public javax.ws.rs.core.Response org.apache.ambari.server.api.services.FeedService.getFeed(java.lang.String,javax.ws.rs.core.HttpHeaders,javax.ws.rs.core.UriInfo,java.lang.String), should not consume any entity.
sudo apt-get install ambari-agent

Unable to locate package [package-name]

sudo vi /etc/apt/sources.list.d/ambari.list

열고 deb http://public-repo-1.hortonworks.com/ambari/ubuntu14/2.x/updates/2.2.2.0 Ambari main 이런 내용이 comment out 되진 않았는지 살펴봅니다.

Oozie: Unauthorized connection for super-user

에러는 다음과 같습니다.

org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): Unauthorized connection for super-user: oozie from IP 172.31.31.188
sudo su hdfs
vi /etc/hadoop/conf/core-site.xml

core-size.xml을 열은 이후 다음과 같이 변경합니다.

<property>
  <name>hadoop.proxyuser.oozie.groups</name>
  <value>*</value>
</property>

<property>
  <name>hadoop.proxyuser.oozie.hosts</name>
  <value>*</value>
</property>

Oozie를 restart시키기 이전에 먼저, HDFS먼저 restart시킵니다.

Namenode: BindException

ERROR namenode.NameNode: Failed to start namenode.
java.net.BindException: Port in use: ec2-52-192-233-209.ap-northeast-1.compute.amazonaws.com:50070

현상은 port를 사용중에 있지 않는데, 해당 Port가 사용중이라고 나오는 케이스입니다. 이 경우 NameNode Bind 시키려는 IP를 0.0.0.0으로 바꿔줘야 합니다.

Name default value
fs.defaultFS 건들지 말것 (hostname으로 둘것)
dfs.namenode.http-address 0.0.0.0:50070
dfs.namenode.https-address 0.0.0.0:50470
dfs.namenode.rpc-address 0.0.0.0:8020
dfs.namenode.secondary.http-address 0.0.0.0:50090

HDFS default configurations 를 참조.

Ambari Metrics Errors

INFO org.apache.zookeeper.ClientCnxn: Opening socket connection to server localhost/127.0.0.1:61181. Will not attempt to authenticate using SASL (unknown error)
2016-08-03 04:30:41,131 WARN org.apache.zookeeper.ClientCnxn: Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.ConnectException: Connection refused
	at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
	at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717)
	at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:361)
	at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1125)

위의 경우는 Hbase가 안띄워져 있어서 그렇습니다.

Service Name default value
Ambari Metrics hbase.zookeeper.quorum 0.0.0.0

Remove Ambari Completely!!

Ambari삭제하는 방법입니다.

먼저 Ambari server와 agent의 서비스를 중단합니다.

sudo ambari-server stop
sudo ambari-agent stop

sudo apt-get remove ambari-server ambari-agent ambari-metrics-assembly

sudo rm -rf /var/lib/ambari-server/
sudo rm -rf /var/lib/ambari-agent/
sudo rm -rf /var/run/ambari-server/

sudo rm -rf /usr/lib/ambari-server/
sudo rm -rf /usr/lib/ambari-metrics-hadoop-sink/
sudo rm -rf /usr/lib/ambari-metrics-kafka-sink/

sudo rm /etc/apt/sources.list.d/ambari.list
sudo rm /etc/apt/sources.list.d/ambari.list.save