728x90

1.  목적

CSV 데이터를 가져와서, DB type 변형없이 Database 에 적재하기 위함. 

 

2. 프로세스

적재 중 CSV 내의 timestamp 와 같은 컬럼의 데이터를 DB로 적재 시 type 을 못 읽는 오류가 발생하는데, 

(ERROR: column "column2" is of type timestamp without time zone but expression is of type character varying
  Hint: You will need to rewrite or cast the expression.)

위의 해결을 위해선 두 가지 방법이 존재함. 

 

(1) tmp 임시테이블 생성 → column type 모두 varchar   →  csv 데이터 그대로 적재  →  본 테이블에 쿼리로 캐스팅하여 적재 ( insert into test select cast(reg_dtm as timestamp) from test_tm,p ) → 임시테이블 truncate

(2) nifi 상에서 프로세서를 통해 type 을 변경하여 본테이블에 바로 적재

 

이 글에선 (2) 의 방법을 기술함. 

 

nifi ver.2.0

 

 

3. 상세 설명

 

(1) GetFile

 

Input directory 밑의 경로에 있는 File Filter 의 파일을 찾아서 가져오기. 

(t_emal~ 로 시작하는 csv 형식의 파일을 가져온다.)

 

 

 

 

(2) ConvertRecord
    : 다양한 입력 데이터 포맷을 다른 포맷으로 변환하는 기능을 제공

 

 

CSV 데이터를 JSON으로 변환하기. 

 

다음단계에서 DB 에 insert 할 때 type 지정해줄 것이기 때문에

Reader, Writer 모두 default 그대로 사용. 

 

 

 

 

(3) PutDatabaseRecord

 

DB Type, DB Connection pool, schema, table name 등 입력.

 

 

JsonRecordSetWriter 에서 timestamp 형식을 지정해준다. 

 

필자는 timestamp 데이터가 밀리세컨드단위까지 있어서 ss.SSS 까지 지정해줬다.

 

 

 

 


 

 

더 많은 방법이 있겠지만

최대한 간단히 적은 프로세서를 사용해서 만들어봤다.

728x90

배경)

 

각기 다른 port 를 사용하는 trino cluster 2대에 tls 적용 시

 

 

 

http-server.http.port 설정값을 지우고

http-server.https.port 설정값을 지정해줬다.

 

 

trino cluster 가 한 대라면 실행 시 문제가 없으나, 

두 대 이상이라면 나중에 실행한 클러스터가 실행 불가.

 

server.log 의 Error Message )

Caused by: UncheckedIOException: Failed to bind to /0.0.0.0:8080

 

 

https 를 지정해주더라도, 기본 default http port 인 8080 을 통해 접속 후 동작하는 방식인 것 같다. 

참고 )

https://trino.io/docs/current/security/tls.html?highlight=http+server+port

 

TLS and HTTPS — Trino 445 Documentation

TLS and HTTPS Trino runs with no security by default. This allows you to connect to the server using URLs that specify the HTTP protocol when using the Trino CLI, the Web UI, or other clients. This topic describes how to configure your Trino server to use

trino.io

 

 

 

 

해결 )

 

 

두대 중 한대는 http port 를 임의로 지정해줬다. ( 나머지 한대는 http 설정 미지정으로 유지 )

 

 

 

cluster 재실행 시 해결 완료!

728x90

배경) 

 

스탠바이 네임노드, 데이터노드에서 각 소프트웨어( 저널노드, 네임노드, zkfc , datanode 등)

root 계정이 아닌, 다른 계정으로 실행 하고

 

Actuve NameNode에서 root 계정으로 저널노드, 네임노드, zkfc 를 실행했을 때

 

 

 

yarn 실행 시 

실행이 안된다. 

 

 

https://bloodguy.tistory.com/m/entry/Hadoop-hdfs-yarn-%EA%B4%80%EB%A0%A8-%EB%8D%B0%EB%AA%AC%EC%9D%84-root%EB%A1%9C-%EC%8B%A4%ED%96%89%ED%95%A0-%EB%95%8C-%EC%97%90%EB%9F%AC-%EB%B0%9C%EC%83%9D%EC%8B%9C

 

[Hadoop] hdfs, yarn 관련 데몬을 root로 실행할 때 에러 발생시

권장사항대로 hadoop용 사용자를 따로 생성해서 하는게 제일 좋겠지만, 어떤 사정이 있거나 귀찮거나 여하튼 root로 굳이 하려는데, sbin/start-all.sh 등을 실행시키면 아래와 같은 에러가 발생함. # sbi

bloodguy.tistory.com

 

 

 

- 가장 최선의 방법은 root 로 실행한 프로세서를 kill 하고, 처음 실행했던 계정으로 다시 실행하기. 

- 혹은, 위의 블로그처럼 etc/hadoop/hadoop-env.sh 에 각 사용자를 root로 등록해주기.

728x90

현상 )

 

linux ppc64le 환경에서 trino cli 가 제대로 동작하지 않음. 

- 접속은 정상!

 

- 하지만, ctrl+z ( 종료) 외에 enter 등 모든 키가 입력되지 않는다. 

 

 

 

 

 

 

https://github.com/trinodb/trino/issues/10438

 

Unable to start trino-cli on ppc64le · Issue #10438 · trinodb/trino

OS Debian 11 Bullseye (ppc64le) Version trino server 367 After deployment of trino server 367 I am able to successfully start trino with python3 bin/launcher.py run However when trying to start tri...

github.com

나와 같은 사람을 찾은 결과 .. 

모두 cli jar 파일을 도커 환경에서 다시  build 하였고

 

 

https://trino.io/docs/current/search.html?q=ppc64le#

 

Search — Trino 444 Documentation

Search Please activate JavaScript to enable the search functionality.

trino.io

 

공식홈페이지에 trino cli 에 관한 ppc64le 업데이트는 존재하지 않는다.

728x90

Output Grouping (One Line Per Object / Array )

결과 확인

 

 

(1) Array

[] 배열안에 모든 값 넣기!

행 나눴을 때, 총 1개의 Key/Value 값 생성.

 

 

(2) One Line Per Object

한 키값 쌍마다 줄바꿈해서 변환

 

행 나눴을 때, 총 4개의 Key/Value 값 생성. 

728x90
  • 모든 프로세서는, 각 프로세서에 맞는 시작/종료 수행 결과를 입력해야 한다.

 

 

1. MergeContent , LogAttribute

- MergeContent 

MergeContent 

 

 

 

- LogAttribute

728x90

Hadoop에서 "split brain"은 주로 고가용성(High Availability) 설정에서 발생하는 문제를 가리킵니다.

 

Split brain은 네트워크 분할이나 네임노드 간 통신 장애로 인해 클러스터의 네임노드들이 서로 독립적으로 운영되는 상태를 의미합니다.

 

일반적으로 Hadoop의 고가용성 구성에서는 두 개의 네임노드가 서로 통신하여 클러스터 상태를 동기화합니다.

하지만 네트워크 분할이 발생하거나 네임노드 간 통신이 실패하는 경우,

각 네임노드는 자신이 활성(active)인지 스탠바이(standby)인지 판단할 수 없게 됩니다.

 

이렇게 되면 각각의 네임노드가 독립적으로 파일 시스템에 대한 읽기 및 쓰기 작업을 수행할 수 있게 됩니다.

이러한 상황에서는 데이터의 불일치가 발생할 수 있으며, 클러스터의 안정성과 일관성이 보장되지 않습니다.

 

Split brain을 방지하기 위해 Hadoop은 주로 주키퍼(ZooKeeper)와 같은 조정자 서비스를 사용하여 네임노드 간의 통신 및 상태 동기화를 관리합니다.

주키퍼를 사용하면 네임노드 간의 네트워크 분할이나 통신 장애를 탐지하고,
정확한 활성 네임노드를 선정하여 클러스터의 일관성을 유지할 수 있습니다.

 

 

따라서 split brain은 Hadoop 클러스터에서 중대한 문제를 발생시킬 수 있는 상황이며, 이를 방지하기 위해서는 적절한 고가용성 설정과 조정자 서비스의 사용이 필요합니다.

728x90

배경 )

 

호스트명 test1, test2 --> namenode 이중화

 

 

 

현상 )

 

1. 정상동작

test1 test2
active standby

 

 

일 때, 

test1 namenode stop

-->

test2 namenode active 정상 변경 완료

 

 

 

 

2. 비정상동작

 

test1 test2
standby active

 

일 때, 

test2 namenode stop

-->

test1 namenode active 변경 실패. (standby상태 유지)

 

 

 

2-1. 

위의 상태에서, 

test2 namenode start 시 

test1, test2 모두 standby 상태.

 

 


 

 

해결 )

 

1번 현상에서 failover가 정상동작하는걸로 보아, 

zkfc 실행 자체에는 문제가 없다고 판단, 

fencing 작업에 문제 가능성 발견.

 

 

 

test1의 

zkfc logs 파일 ( hadoop-유저명-zkfc-test2.log )  에서

 

 

 

 PATH=$PATH:/sbin:/usr/sbin fuser -v -k -n tcp 8020 via ssh: bash: fuser: command not found

 

fuser의 command not found 발견 !

 

--> test1 내 fuser 설치해주기. 

# yum -y install psmisc

참고 : https://coconuts.tistory.com/730

 

CentOS fuser 명령어 개요 fuser command not found 해결방법

fuser command not found on centos 리눅스에서 fuser는 특정파일 또는 프로세스의 사용자를 알고자 할 때 사용합니다. 저 같은 경우에는 어떤 대상에 대해서 명령어가 동작하지 않을 때 어떤 유저나 프로

coconuts.tistory.com

 

 

 

 

 

 


정리 ) 

 

1. test1, test2 에서 zkfc가 각각의 실행상태를 바라보고있을 때, 

2. test1 이 종료되어

3. test2를 zkfc가 standby  -->  active상태로 변경하기 위해

4. test1 에 접속시도를 할 때, fuser 사용.   --> split brain 현상 발생

5. test1 fuser 설치

6. 해결완료

 

 

 

 

Sol2 ) 

https://hadoop.apache.org/docs/r3.2.2/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithNFS.html

 

Apache Hadoop 3.2.2 – HDFS High Availability

<!--- Licensed 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 a

hadoop.apache.org

 

 

sshfence 로 설정했을 시 

1. 이 포스팅 내용과 같이 패키지설치가 안되어 오류가 나거나, 

2. 누가 랜선을 뽑으면 ssh 연결이 안되어 오류가 날 수 있다. 

 

이를 방지하기 위해 

 

다양한 옵션이 있는데

 

shell 로 옵션을 주면, 

연결 시 True 값을 반환하며 연결 완료를 확인할 수 있다. 

 

 

 

 

Sol3)

sshfence 와 shell 옵션을 둘 다 주어

sshfence 로 연결이 완료될 때까지 timeout 상태로 대기 후

shell 의 True 로 연결을 확인하는 방법도 있다 !

 

728x90

 

 

vi workers

 

hadoop 1인가? 에서 master 도 있었다는데 

지금은 없음. 

 

원래 데이터노드만 적어야 하는데 
데이터노드 원래 필수 3대 있어야 하는데 우리는 서버 3대밖에 없으니 일단 다 적음. ( 네임노드든 데이터노드든 다 적어도 되긴 함 ) 
원래는 데이터노드들만 적긴 함

 

 

 

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

- 클러스터 내의 네임노드에서 실행되는 하둡 데몬에 관한 설정

-로그파일, 네트워크 튜닝, I/O튜닝, 파일 시스템 튜닝, 압축 등 하부 시스템 설정 파일

- HDFS(hdfs-site.xml)와 맵리듀스(mapred-site.xml)에서 공통적으로 사용할 환경정보 설정

-만약 core-site.xml 이 없을 경우 core-default.xml 에 있는 기본값을 사용한다.

 

vi core-site.xml

HDFS와 맵리듀스에서 공통적으로 사용할 환경 정보 설정

 

fs.defaultFS

- hdfs의 기본 이름. 

    hdfs dfs -ls 명령어 가능하게 하기 위해 쓴다 !

    만약 안쓴다면 hdfs dfs -ls hdfs://HA ~... 이렇게 써야할 것이다. 참으로 귀찮은 일이 아닐 수 없다.

- URI 형태

- 데이터 노드는 여러 작업을 진행하기 위해 반드시 네임노드의 주소를 알아야 함

ha.zookeeper.quorum

- 주키퍼 HA 구성시 사용

- 구성 갯수는 3, 5, 7과 같은 홀수개로 구성

    ( 짝수개여도 문제는 없지만, 장애 발생 시 과반수 이상이 동의해야 중단되어야 하는데 짝수는 의미가 없기 때문이다. )

     ( 참고 : https://paulsmooth.tistory.com/156 )

- 주키퍼 설정파일에서 포트를 2181로 설정하지 않았으면 설정한 포트로 수정할 것

 

 

< 다른 옵션 >

fs.default.name

- hdfs-site.xml 에서 설정한 하둡 클러스터의 이름으로 설정

hadoop.tmp.dir

- hdfs와 yarn이 사용할 임시 디렉토리

- 하둡에서 발생하는 임시 데이터를 저장하기 위한 공간

- 디폴트로 /root/tmp 에 데이터를 생성함

 

 

 

 

 

 

네임노드, 보조 네임노드, 데이터노드 등과 같은

HDFS에서 사용할 환경정보 설정

 

- dfs.namenode.name.dir : 네임노드가 영속적인 메타데이터를 저장할 디렉토리 목록을 지정한다. 네임노드는 메타데이터의 복제본을 목록에 디렉토리별로 지정한다. 

- dfs.datanode.name.dir : 데이터노드가 블록을 저장할 디렉토리의 목록. 각 블록은 이 디렉터리 중 오직 한 곳에서만 저장한다. 

 

타입 서버 포트 종류 사용법 설명
hdfs hdfs 8020 RPC hadoop fs -ls hdfs://$(hostname -f):8020/ 네임노드 호출
hdfs webhdfs 50070 http curl -s http://$(hostname -f):50070/webhdfs/v1/?op=GETFILESTATUS jq
    9870   마스터노드 웹 UI  

 

참고 : https://velog.io/@anjinwoong/Hadoop

 

[Hadoop] Hadoop 서비스 포트 정리

Hadoop 서비스 포트 정리

velog.io

 

 

 

fencing ? 

--> active 노드에서 장애발생으로 standby 가 active 로 전환될 때, 

    그 찰나에 active 노드의 장애가 해결되어 다시 정상으로 돌아와 active 중복이 되는 상황을 막기 위해 

    장애복구컨트롤러(failover) 가 기존 active 노드를 확실히 죽인다.

 

 

 

 

 

Namenode 를 HA 구성하여 SPOF(Single Point Of Failure)에서 벗어났지만,

이번엔 리소스관리자인 YARN이 또다른 SPOF입니다.

Resource Manager를 HA 구성해야 합니다. 

참고 : https://tdoodle.tistory.com/entry/Hadoop-Resource-Manager-HA-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0

 

Hadoop Resource Manager HA 구성하기

Namenode 를 HA 구성하여 SPOF(Single Point Of Failure)에서 벗어났지만, 이번엔 리소스관리자인 YARN이 또다른 SPOF입니다. 이번에는 Resource Manager를 HA 구성하는 방법에 대하여 알아보겠습니다. 1. 서버 구성

tdoodle.tistory.com

맵리듀스에서 사용할 환경정보를 설정

- framework.name : yarn 을 사용하겠다. 

 

<configuration>

	<!-- Site specific YARN configuration properties -->
	<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>
	<property>
		<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
		<value>org.apache.hadoop.mapred.ShuffleHandler</value>
	</property>
	<property>
		<name>yarn.nodemanager.local-dirs</name>
		<value>/home/hadoop/hadoopdata/yarn/nm-local-dir</value>
	</property>
	<property>
		<name>yarn.resourcemanager.fs.state-store.uri</name>
		<value>/home/hadoop/hadoopdata/yarn/system/rmstore</value>
	</property>
	<property>
		<name>yarn.resourcemanager.hostname</name>
		<value>hadoop01</value>
	</property>
 	<property>
		<name>yarn.web-proxy.address</name>
		<value>0.0.0.0:8089</value>
	</property>

	<!-- for Resource Manager HA configuration -->
	<property>
		<name>yarn.resourcemanager.ha.enabled</name>
		<value>true</value>
	</property>
	<property>
		<name>yarn.resourcemanager.cluster-id</name>
		<value>cluster1</value>
	</property>
	<property>
		<name>yarn.resourcemanager.ha.rm-ids</name>
		<value>rm1,rm2</value>
	</property>
	<property>
		<name>yarn.resourcemanager.hostname.rm1</name>
		<value>hadoop01</value>
	</property>
	<property>
		<name>yarn.resourcemanager.hostname.rm2</name>
		<value>hadoop02</value>
	</property>
	<property>
		<name>yarn.resourcemanager.webapp.address.rm1</name>
		<value>hadoop01:8088</value>
	</property>
	<property>
		<name>yarn.resourcemanager.webapp.address.rm2</name>
		<value>hadoop02:8088</value>
	</property>
	<property>
		<name>hadoop.zk.address</name>
		<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
	</property>

</configuration>

 

- yarn.nodemanager.aux-services 속성은 mapreduce.shuffle이라는 보조 서비스를 사용할지를 노드매니저에 알려준다. 보조 서비스를 구현하는 노드매니저에 전달한 후, 서비스를 구현하는 수단으로서 클래스 이름을 전달한다. 이런 특정 설정을 통해 어떤 방식으로 셔플이 일어날지를 맵리듀스에게 알려준다. 기본적으로 비 맵리듀스 잡에 대해서는 노드매니저가 데이터를 셔플하지 않기 때문에, 맵리듀스 서비스를 설정할 필요가 있다.

 

- yarn.resourcemanager.recovery.enabled : ResourceManager 시작 시 state 복구 여부

https://bloodguy.tistory.com/entry/Hadoop-YARN-ResourceManager-HA-HighAvailability

 

[Hadoop] YARN - ResourceManager HA (HighAvailability)

Hadoop 2.X 부터 NameNode가 HA를 통해 SPOF(SinglePointOfFailure)에서 벗어났지만, YARN의 ResourceManager는 새로운 SPOF 였음. 하지만 Hadoop 2.4 부터 ResourceManager HA가 도입됨에따라 Hadoop은 이제 SPOF가 완전히 제거된

bloodguy.tistory.com

 

 

 

* 중요 yarn 데몬 속성

속성명 종류 기본값 설명
yarn.resourcemanager.hostname 호스트명 0.0.0.0 리소스 매니저가 수행된 머신의 호스트명. 
yarn.resourcemanager.address 호스트명과 포트 호스트네임:8032 리소스 매니저의 RPC 서버( 클라이언트 애플리케이션에서 서버 애플리케이션으로 함수를 호출하는 방식 ) 가 동작하는 호스트명과 포트
yarn.nodemanager.local-dirs 콤마로 분리된 디렉토리명 /nm-local-dir 컨테이너가 임시데이터를 지정하도록 노드매니저가 정한 디렉토리 목록. 애플리케이션 종료 시 데이터가 지워진다.
yarn.nodemanager.aux-services 콤마로 분리된 서비스명   노드 매니저가 수행하는 보조 서비스 목록. 기본적으로 보조 서비스가 지정되지 않는다.  
yarn.nodemanager.resource.memory-mb int 8192 노드 매니저가 수행할 컨테이너에 할당되는 물리 메모리
yarn.nodemanager.vme-pmem-ratio float 2.1 컨테이너에 대한 가상/물리 메모리 비율. 가상 메모리 사용량은 이 비율에 따라 초과할당 될 수도 있다.  
yarn.nodemanager.resource.cpu-vcores int 0 노드 매니저가 컨테이너에 할당할 수 있는 CPU 코어의 수
yarn.app.mapreduce.am.command-opts String   애플리케이션 마스터의 힙사이즈 

 

 

 

 

https://wikidocs.net/23575

 

3-메모리 설정

맵리듀스의 메모리 설정은 mapred-site.xml 파일을 수정하여 변경할 수 있습니다. 기본값은 [mapred-default.xml](https://hadoop.apache…

wikidocs.net

 

 

 

 

 

 

 

 

 

 

vi hadoop-env.sh  

jdk , hadoop 경로 설정

 

 

728x90

NTP: 네트워크로 연결되어있는 컴퓨터들 끼리 클록 시각을 같게 동기화 시키는 프로토콜

하둡에 저장되는 데이터의 신뢰성을 위해 각 서버간 시각을 같게 동기화

https://mindnet.tistory.com/entry/NTP

 

[ 네트워크 쉽게 이해하기 21편 ] NTP 란?

NTP (network time protocol) ; 네트웍 시각 프로토콜 "NTP"는 네트웍으로 연결되어 있는 컴퓨터들끼리 클록 시각을 동기화시키는데 사용되는 프로토콜이다. "NTP"는 미국 델라웨어 대학의 데이빗 밀스에

mindnet.tistory.com

 

 

빅데이터는 노드들이 서로 상호작용하며 처리하는 것이기 때문에 

메인서버를 정해두고, 

나머지 서버들이 그 메인서버의 시간을 기준으로 작업하겠다! 라는 의미.

 

 

-> hdfs 실행 자체에는 문제가 없지만, 혹시라도 나중에 데이터 안맞아서 오류가 발생하는 것을 방지한다!

 

 

 

$ ssh-keygen

$ ssh-copy-id -p 포트번호 -i ~/.ssh/id_rsa.pub root@test2

 

 

 

 

 

 

+ Recent posts