본문 바로가기

Bigdata Hadoop

데이터 과학/빅데이터 실험실 - 4부 중 3부: 3노드 클러스터의 Ubuntu를 통한 Hive 및 Postgres

반응형

 

데이터 과학/빅데이터 실험실 - 4부 중 3부: 3노드 클러스터의 Ubuntu를 통한 Hive 및 Postgres 

 

데이터 과학/빅데이터 실험실을 Raspberry Pi 4 또는 VM 클러스터에서 Hadoop, Spark, Hive, Kafka, Zookeeper 및 PostgreSQL로 조립하기 

 

서문은 다른 포스팅과 같다. 모든 구성 파일은 [1]에서 확인할 수 있습니다: 

 

4부분으로 작성된 문서의 링크를 아래에 올립니다. 문서 출처인 원 문서의 링크는 1편 아래 참고 문서에 있습니다. 

 

 

 

4. PostgreSQL

 

클러스터에 성숙한 관계형 데이터베이스를 설치하기로 했습니다. 데이터를 가지고 놀려면 어떤 결정을 내리는 게 현명할까요? 저는 주로 GIS에 대한 성숙한 지원 때문에 PostgreSQL을 선택했습니다(저는 GIS 데이터를 사용합니다). 노드 1에 Spark가 있으므로 노드 3에 배치했습니다. 작업 부하를 분산하기 위해서요.

 

Hive를 설치하겠습니다. PostgreSQL과도 잘 결합되고 MySQL 및 기타와도 잘 결합됩니다.

 

PostgreSQL을 설치하는 방법에 대한 여러 튜토리얼과 방대한 문서를 찾을 수 있습니다.

 

저는 PostgreSQL에 대한 경험이 있지만 튜토리얼을 따랐습니다. 

 

https://linuxize.com/post/how-to-install-postgresql-on-ubuntu-18-04/?source=post_page-----8a1da8d49b48--------------------------------

 

 

다음 파일을 편집해야 합니다. 

 

/etc/postgresql/12/main/pg_hba.conf 

 

# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5

# IPv6 local connections:
host    all             all             ::1/128                 md5

# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5

# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             192.168.1.0/16          trust

 

 

제가 게을러서 PostgreSQL을 준허용 방식으로 구성했다는 걸 알고 있습니다. 업데이트는 자유롭게 하세요. 하지만 모든 클러스터가 문제 없이 실행된 후에만 보안을 적용하는 것이 좋습니다.

 

/etc/postgresql/12/main/postgresql.conf에서 세트를 변경하고 싶을 수도 있습니다.

 

다음 속성을 편집했습니다.

 

listen_addresses = '*'

 

이렇게 하면 PostgreSQL이 호스트의 모든 네트워크 인터페이스에서 수신 대기합니다.

 

편의를 위해 postgres의 비밀번호를 postgres로 변경했습니다(멍청한 짓이라는 건 알지만요.. 이건 랩이지 프로덕션 환경이 아닙니다): 

 

pi@pi2:~$ sudo su - postgres
postgres@pi2:~$ psql
psql (12.2 (Ubuntu 12.2-4))
Type "help" for help.
postgres=# ALTER USER postgres  WITH PASSWORD 'postgres';
ALTER ROLE
postgres=# \q
postgres@pi2:~$ exit
logout
pi@pi2:~$

 

 

편의를 위해, 저는 GitHub에 제 설정 파일을 남겨두었습니다(pi3에서 참조)

 

저는 애플리케이션 사용자/암호로 데이터베이스에 액세스하도록 설정했습니다.

 

저는 Windows 컴퓨터에서 시각적 pgadmin4를 사용하여 데이터베이스를 관리하는 것을 좋아합니다. 이 도구는 노트북에 설치하여 원격으로 사용할 수 있습니다. 

 

https://www.pgadmin.org/download/?source=post_page-----8a1da8d49b48--------------------------------

 

Download

Download pgAdmin is a free software project released under the PostgreSQL licence. The software is available in source and binary format from the PostgreSQL mirror network. Because compiling from source requires technical knowledge, we recommend installing

www.pgadmin.org

 

 

 

참고 - PostgreSQL용 기본 Ubuntu 설치 프로그램에 따라 재부팅할 때마다 데이터베이스 관리자 서비스가 자동으로 시작됩니다. 

 

5. Hive 

 

내가 찾은 라즈베리 클러스터 튜토리얼은 하이브 설치에 대해 설명하지 않습니다.

 

하이브를 더 잘 이해하려면 프로젝트 위키 페이지를 추천합니다.

 

https://cwiki.apache.org/

 

참고: 하이브는 Hadoop이 실행되어야 합니다. 하이브를 시작하기 전에 다음을 실행해야 합니다.

 

start-dfs.sh
start-yarn.sh

 

하이브를 설치하는 것이 힘들었다고 말해야겠습니다! 저는 이미 로컬에 Derby로 설치했는데, 어느 정도 간단합니다. 하지만 프로덕션 환경으로 배포하기로 했습니다.

 

PostgreSQL 서버에서 메타스토어 데이터베이스를 인스턴스화했습니다. 하이브 메타스토어 서버는 데이터베이스에 연결하고 하이브서버2에서 연결을 수신합니다. 하이브서버2는 CLI, beeline으로 평가되며 웹 UI가 있습니다.

 

하이브 아키텍처는 매우 잘 확장되어 많은 하이브서버와 메타스토어를 허용합니다. 사용자는 네트워크를 통해 연결하고 쿼리를 제출할 수 있습니다.

 

분산 환경에 Hive를 설치하는 데 있어서 가장 나쁜 점은 설명서나 내가 확인한 책에서 업데이트된 튜토리얼을 찾을 수 없었다는 것입니다. 하지만 결국에는 모두 작동했습니다. 설치를 배포하여 Hive를 설치하는 방법을 설명하겠습니다.

 

먼저 hive를 다운로드합니다. 

 

https://downloads.apache.org/hive/?source=post_page-----8a1da8d49b48--------------------------------

 

Index of /hive

 

downloads.apache.org

 

 

Hive는 모든 기능이 포함된 전체 번들로 제공됩니다. Hadoop 설치에 적합한 하이브 버전을 선택하는 데 주의하세요. 

 

/home/pi/tmp 

 

wget  https://downloads.apache.org/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz
tar -xvf apache-hive-3.1.2-bin.tar.gz
mv apache-hive-3.1.2-bin hive
sudo mv hive /opt/
sudo chown -R pi:pi /opt/hive

 

 

5.1 환경 설정

 

편집

 

/home/pi/.bashrc

 

파일 끝에 추가: 

 

# HIVE
export HIVE_HOME=/opt/hive
export PATH=$PATH:/opt/hive/bin

 

그다음 

 

source /home/pi/.bashrc

 

5.2 메타스토어

 

Hadoop 파일 시스템에서 데이터 웨어하우스를 생성합니다: 

 

hdfs dfs -mkdir -p /user/hive/warehouse
hdfs dfs -chmod g+w /user/hive/warehouse
hdfs dfs -mkdir -p /tmp
hdfs dfs -chmod g+w /tmp

 

5.3 Lib guava - 충돌 문제

 

라이브러리 버전으로 인한 충돌이 있습니다. 하이브에서 구아바를 삭제하고 Hadoop에서 사용 가능한 최신 버전을 복사하세요: 

 

$ rm /opt/hive/lib/guava-19.0.jar
$ cp /opt/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /opt/hive/lib/
cp /opt/hive/conf/hive-env.sh.template  /opt/hive/conf/hive-env.sh

 

 

5.4 구성 파일

 

저는 하이브에서 하나의 설치만 준비하여 노드 1과 2(pi1과 pi2)로 배포했습니다. 하이브서버2는 pi1에서 시작되고 하이브-메타스토어는 pi2에서 시작됩니다(하지만 구성 파일은 정확히 동일합니다).

 

구성 파일은 다음 위치에 만들어야 합니다.

 

/opt/hive/conf/hivemetastore-site.xml 

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

	<property>
		<name>javax.jdo.option.ConnectionURL</name>
		<value>jdbc:postgresql://pi3:5432/metastore</value>
	</property>

	<property>
		<name>javax.jdo.option.ConnectionDriverName</name>
		<value>org.postgresql.Driver</value>
	</property>

	<property>
		<name>javax.jdo.option.ConnectionUserName</name>
		<value>hive</value>
	</property>

	<property>
		<name>javax.jdo.option.ConnectionPassword</name>
		<value>hive</value>
	</property>

	<property>
		<name>datanucleus.autoCreateSchema</name>
		<value>false</value>
	</property>

	<property>
		<name>datanucleus.fixedDatastore</name>
		<value>true</value>
	</property>

	<property>
		<name>datanucleus.autoStartMechanism</name> 
		<value>SchemaTable</value>
	</property> 

	<property>
		<name>hive.metastore.event.db.notification.api.auth</name>
		<value>false</value>
		<description>
       Should metastore do authorization against database notification related APIs such as get_next_notification.
       If set to true, then only the superusers in proxy settings have the permission
		</description>
	</property>

</configuration>

 

 

참고 — javax.jdo.option.ConnectionURL은 PostgreSQL 데이터베이스를 가리켜야 합니다. 저는 pi3(192.168.1.13)에 설치했습니다.

 

이제 다음 파일을 편집하세요.

 

/opt/hive/conf/hiveserver2-site.xml 

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

	<property>
		<name>hive.metastore.uris</name>
		<value>thrift://pi2:9083</value>
		<description>By specify this we do not use local mode of metastore</description>
	</property>

	<property>
		<name>hive.server2.authentication</name>
		<value>NONE</value>
	</property>

</configuration>

 

 

참고 — hive.metastore.uris는 hive metastore 서버를 가리켜야 합니다. 저는 pi2(192.168.1.12)에 설치했습니다.

 

이제 파일을 편집하세요:

 

/opt/hive/conf/hive-env.sh 

 

######  hadoop 

export HADOOP_HOME=/opt/hadoop
export HIVE_HOME=/opt/hive
export HIVE_CONF_DIR=$HIVE_HOME/conf

 

PostgreSQL 사이트에서 JDBC 드라이버를 다운로드합니다.

 

https://jdbc.postgresql.org/download.html

 

다음에 복사합니다.

 

/opt/hive/lib/postgresql-9.4.1208.jre7.jar

 

참고 - 현재 버전이므로 more 업데이트를 설치해야 합니다.

 

 

5.5 Postgres 준비

 

Windows 노트북에 pgAdmin4를 설치하고 PostgreSQL에 연결했습니다.

 

pgAdmin4 GUI를 사용하여 다음 단계를 실행했습니다.

 

먼저 암호 hive로 새 역할 hive를 만듭니다(이 정보는 hivemetastore-site.xml 구성에서 사용되었습니다).

 

그런 다음 소유자가 사용자 'hive'인 'metastore'라는 새 데이터베이스를 만들어야 합니다. 

 

5.5.1 메타스토어 데이터베이스 스키마 시작

 

이 절차는 hivemetastore-site.xml을 읽어 연결 정보(IP, 포트, 사용자, 비밀번호, 데이터베이스 이름)를 알아냅니다.

 

pi@pi1:/opt/hive/bin$ ./schematool -dbType postgres -initSchema

 

 

출력: 

 

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Metastore connection URL:        jdbc:postgresql://pi3:5432/metastore
Metastore Connection Driver :    org.postgresql.Driver
Metastore connection User:       hive
Starting metastore schema initialization to 3.1.0
Initialization script hive-schema-3.1.0.postgres.sql
Initialization script completed
schemaTool completed

 

pgAdmin4 인터페이스에서 새 데이터베이스를 확인할 수 있습니다. 또는 명령줄에서 pgsql을 사용합니다.

 

편집:

 

/home/pi/.bashrc

 

추가: 

 

export HIVE_HOME=/opt/hive
export HIVE_CONF_DIR=/opt/hive/conf
export PATH=$PATH:$HIVE_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

 

깃허브에서 .bashrc의 최종 버전을 참조하세요. 

 

 

5.6 네트워크를 통해 hiveserver2와 hive-metastore 연결 시 문제

 

hiveserver2를 hive-metastore에 연결할 때 악몽 같은 일이 발생했습니다. 결국 이 글에서 제안한 해결 방법을 성공적으로 구현했습니다: 

 

https://kontext.tech/column/hadoop/303/hiveserver2-cannot-connect-to-hive-metastore-resolutionsworkarounds?source=post_page-----8a1da8d49b48--------------------------------

 

 

이 웹페이지에서는 HiveServer2 클라이언트용 Hive 3.X에 삽입된 새로운 인증 기능으로 인해 발생하는 오류를 설명합니다. HiveServer2 서비스(Hive 버전 3.0.0)를 시작할 때.

 

제안된 해결 방법은 Hadoop(모든 노드)의 core-site.xml 파일에서 proxyuser 속성을 수정해야 합니다.

 

/opt/hadoop/etc/hadoop/core-site.xml 

 

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
	<property>
		<name>fs.default.name</name>
		<value>hdfs://pi1:9000</value>
	</property>
	<property>
		<name>hadoop.proxyuser.pi.hosts</name>
		<value>*</value>
	</property>
	<property>
		<name>hadoop.proxyuser.pi.groups</name>
		<value>*</value>
	</property>
	<property>
		<name>hadoop.security.authorization</name>
		<value>false</value>
		<description>Is service-level authorization not enable</description>
	</property>
	<property>
		<name>hadoop.security.authentication</name>
		<value>simple</value>
		<description>Possible values are simple (no authentication), and kerberos
		</description>
	</property>

</configuration>

 

 

이는 GitHub에 반영됩니다.

 

참고: 문제가 발생하면 오류와 서비스를 탐색해야 할 수 있습니다. 각 서버에서 수신 중인 포트를 확인할 수 있도록 netstat을 설치하는 것을 고려해야 합니다.

 

 

Hiveserver 2 — 포트 1000 및 10002(10002는 webUI용)

 

sudo netstat -plnt | grep ‘1000’

 

 

5.7 하이브 배포

 

이제 hiveserver2, hivemetastore를 실행하려는 노드와 CLI(Beeline)를 실행하려는 노드에 설치를 복사해야 합니다. 저는 3개 노드에 모두 복사했습니다.

 

이전에 말했듯이 제 설치에서는 pi1에 hiveserver2를 사용하고 pi2에 hivemetastore를 사용합니다. hiveserver2와 metastore의 구성 파일은 독립형입니다. 이러한 서비스를 시작할 때 시작하려는 서비스를 나타내는 매개변수를 제공합니다. 예를 들어 hiveserver2를 명시할 때 하이브는 hivemetastore-site.xml 파일을 읽지 않습니다. 따라서 두 구성을 같은 폴더에 저장하고 설치를 배포해도 안전합니다.

 

다른 노드에 하이브 설치를 복사하려면:

 

pi2에서: 

 

sudo mkdir /opt/hive
sudo chown -R pi:pi /opt/hive

 

pi3에서: 

 

sudo mkdir /opt/hive
sudo chown -R pi:pi /opt/hive

 

 

pi1에서: 

 

rsync  -vaz /opt/hive/   pi2:/opt/hive
rsync  -vaz /opt/hive/   pi3:/opt/hive

 

 

5.8 하이브 시작

 

먼저 Hadoop과 yarn(start-dfs.sh와 start-yarn.sh)과 postgres를 시작해야 합니다!!!

 

처음에는 자세한 로그로 서비스를 시작하는 것을 선호합니다. 모든 것이 잘 진행되는지 확인하고 하이브가 백그라운드에서 어떻게 작동하는지 알아보는 데 도움이 됩니다. hive-metastore와 hiveserver2 모두 개별 터미널이 필요하고, 세 번째 터미널은 beeline에 필요합니다.

 

먼저 hive-metastore를 시작해야 합니다.

 

pi2에서:

 

hive --service metastore --hiveconf hive.root.logger=INFO,console

 

 

hive-metastore를 초기화한 후 hiveserver2를 시작해야 합니다.

 

pi1에서:

 

hive --service hiveserver2 --hiveconf hive.root.logger=INFO,console

 

 

hiveserver2 명령을 사용하여 자세한 로그 없이 시작할 수 있습니다.

 

이 서비스를 초기화한 후 jps 및 netstat 명령으로 확인할 수 있습니다. 

 

5.9 Beeline

 

이제 Beeline을 실행하여 모든 것이 잘 진행되는지 확인할 수 있습니다. 저는 pi3에서 테스트했습니다.

 

먼저 Beeline을 시작하고 하이브 서버에 연결합니다. 

 

pi@pi3:~$ beeline
WARNING: log4j.properties is not found. HADOOP_CONF_DIR may be incomplete.
WARNING: log4j.properties is not found. HADOOP_CONF_DIR may be incomplete.
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Beeline version 3.1.2 by Apache Hive
beeline> !connect jdbc:hive2://192.168.1.11:10000/default
Connecting to jdbc:hive2://192.168.1.11:10000/default
Enter username for jdbc:hive2://192.168.1.11:10000/default:
Enter password for jdbc:hive2://192.168.1.11:10000/default:
Connected to: Apache Hive (version 3.1.2)
Driver: Hive JDBC (version 3.1.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ

 

이제 하이브에서 데이터베이스에 액세스할 수 있습니다. 

 

0: jdbc:hive2://192.168.1.11:10000/default> show databases;
INFO  : Compiling command(queryId=pi_20200604081053_b4992aba-814a-40cd-a32e-12d5b33f0926): show databases
INFO  : Concurrency mode is disabled, not creating a lock manager
INFO  : Semantic Analysis Completed (retrial = false)
INFO  : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:database_name, type:string, comment:from deserializer)], properties:null)
INFO  : Completed compiling command(queryId=pi_20200604081053_b4992aba-814a-40cd-a32e-12d5b33f0926); Time taken: 6.27 seconds
INFO  : Concurrency mode is disabled, not creating a lock manager
INFO  : Executing command(queryId=pi_20200604081053_b4992aba-814a-40cd-a32e-12d5b33f0926): show databases
INFO  : Starting task [Stage-0:DDL] in serial mode
INFO  : Completed executing command(queryId=pi_20200604081053_b4992aba-814a-40cd-a32e-12d5b33f0926); Time taken: 0.215 seconds
INFO  : OK
INFO  : Concurrency mode is disabled, not creating a lock manager
+----------------+
| database_name  |
+----------------+
| default        |
+----------------+
1 row selected (8.228 seconds)
0: jdbc:hive2://192.168.1.11:10000/default>

 

5.10 Hive Server2 WebUI

 

하이브 서버2는 포트 10002에서 기본 웹UI를 사용할 수 있습니다:

 

http://pi1:10002/

 

 

 

[1] P. G. Taranti. https://github.com/ptaranti/RaspberryPiCluster

[2] R. Tang. HiveServer2 Cannot Connect to Hive Metastore Resolutions/Workarounds (2018)

 

 

 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^