2021년 1월 11일 월요일

[ SQL ] - 조회된 결과값 파티션으로 순번 매기기 ( ROW_NUMBER() )


ID | NAME 스키마의 테이블을

- SELECT * FROM db.test;

|   ID | NAME |
|------|------|
| 1525 |    a |
| 1528 |    b |
| 1525 |    w |
| 1526 |    b |
| 1526 |    v |
| 1528 |    c | 
| 1525 |    b |


Order by 된 결과에 순번을 매기는 방법은 ROW_NUMBER() 함수를 이용한다. 


- SELECT *, ROW_NUMBER()OVER(PARTITION BY id ORDER BY name ) AS nums

|   ID | NAME | RN |
|------|------|----|
| 1525 |    a |  1 |
| 1525 |    b |  2 |
| 1525 |    w |  3 |
| 1526 |    b |  1 |
| 1526 |    v |  2 |
| 1528 |    b |  1 |
| 1528 |    c |  2 |



2021년 1월 8일 금요일

Hive [8] - Encoding 과 Decoding

 

예제 20528978에 대하여 인코딩 디코딩.


[ 인코딩 ]

select base64(encode('20528978', 'UTF-8'))

결과 값 : MjA1Mjg5Nzg=


[ 디코딩 ]

select decode(unbase64('MjA1Mjg5Nzg='), 'UTF-8')

결과 값 : 20528978


[ 다양한 형식 ]

select decode(unbase64('MjA1Mjg5Nzg='), 'ISO-8859-1');

select decode(unbase64('MjA1Mjg5Nzg='), 'UTF-16LE');



변환해주는 웹사이트 

https://www.base64encode.org/

2021년 1월 3일 일요일

[ AWS ] Elasticache 원격접속


[ EC2에서 접속 ]


1. 접속할 EC2보안그룹 추가

사용자지정TCP / 포트범위: 6379 / 소스: 보안그룹ID 


- 설치

$ yum install gcc make gcc-c++

# $ wget http://download.redis.io/redis-stable.tar.gz

$ wget http://download.redis.io/releases/redis-5.0.8.tar.gz 

$ tar xvzf redis-stable.tar.gz

$ cd redis-stable

$ make distclean      

$ make


- 접속

$ src/redis-cli -c -h redis-endpoint.example.cluster.apne1.cache.amazonaws.com -p 6379


- 테스트

redis]set a "hellow"

redis]get a 


- 접속하지 않고 명령어 실행 ( 키삭제 )

./redis-cli -c -h 123.12.26.166 -p 6379 -a redistest KEYS "myobj/*" | xargs ./redis-cli -c -h 123.12.26.166 -p 6379 -a redistest  DEL




[ Direct 접속 ]


EC2를 거치지 않고 전용회선을 접속하고자 하는 곳에 열어주어 Direct로 접속할 수 있다.

추가금액과 시간이 소모된다.


1. AWS에 Direct전용회선 사용신청

2. 사용신청 확인메일을 amazon에게 받음

3. 사용신청확인메일을 amazon에게 응답( Location of Data Center / Network provider or vendor 정보)

4. LOA-CFA(확인코드)을 DX로케이션(전용회선설치회사)에 전달하여 회선설치요청

5. DX로케이션으로부터 회선설치 완료통지



참고 :

https://www.slideshare.net/awskorea/aws-direct-connect-58456263

https://docs.aws.amazon.com/ko_kr/directconnect/latest/UserGuide/create-connection.html


Apache Nifi - Kafka to HDFS

 

Kafka에서 데이터를 받아 HDFS에 json, csv형태로 입력받는다.

저장 후 Hive, Spark 등으로 데이터를 처리할 수 있으며 실시간 데이터 인풋을 Nifi를 통해 

확인할 수 있는 장점이 있다.



1. [ ConsumeKafka ] 

컨슈머로 연결하여 브로커에서 보내는 메세지를 소비


Properties : 

Kafka Brokers : 172.31.11.11:9092, 172.31.22.22:9092, 172.31.33.33:9092

Topic Name(s) : your-topic-name

Group ID : your-kafka-group-id




2. [ UpdateAttribute ]

들어오는 카프카데이터에 createdAt를 추가하기 위한 프로퍼티

filename은 HDFS저장시 파일명을 시간으로 지정하기 위함


Property : 

createdAt : ${now():format("yyyy-MM-dd:HH:mm:ss")}

filename : st_${now():format("yyyyMMddHHmmssSS")}_${random():mod(99):plus(1000)}




3. [ ReplaceText ]

2.에서 지정한 createdAt값을 Json으로 입력받는 Kafka데이터 맨뒤에 추가한다.


Property :

Search Value : (?s:(^.*)}$)

Replacement Value : $1,"createdAt":"${createdAt}"}

Replacement Strategy : Regex Replace




4. [ PutHDFS ]

해당되는 파일의 Path를 입력한다.


Property :

Hadoop Configuration Resources : /etc/hadoop/conf.cloudera.hdfs/core-site.xml,

/etc/hadoop/conf.cloudera.hdfs/hdfs-site.xml

Directory : /user/nifi/yourpath





PutEmail을 추가하여 Nifi에러시 Email을 받게 설정할 수도 있다.



Apache Kafka - Simple테스트 Python Code

 

[ Ubuntu ]

* 사전설치 Python3


sudo apt-get upgrade


# Pip설치

sudo apt-get install python3-pip


#Kafka Lib 설치

sudo pip3 install kafka-python




[ 테스트 코드 ]

from kafka import KafkaProducer

import time


producer = KafkaProducer(bootstrap_servers=[ '172.31.11.11:9092', '172.31.22.222:9092', '172.31.33.33:9092' ])


for i in range(1,50):

    producer.send( 'Topic-Name', str.encode('kafka:-%d' % i) )

    time.sleep(0.5)




2021년 1월 2일 토요일

[ Zookeeper ] CLI명령어와 ACL


[ CLI 명령어 ]


zookeeper/bin/zkCli.sh에서 CLI 접속


create /znode "first-app"

ls /znode

get /znode

set /znode "date-updated"

rmr /znode  




[ ACL (Action Control List) ]


znode접근시 Authentication is not valid : /znode-ex 라는 메세지가 뜬다면

인증권한을 확인할 필요가 있다.


ACL은 znode에 액세스 하기위한 인증제어이며

5가지의 종류로 구분된다.

  • CREATE - 생성
  • READ - 읽기 
  • WRITE - 쓰기
  • DELETE - 삭제
  • ADMIN - 위4가지 권한 부여


ls -l 명령어로 확인할 수 있는 리눅스 파일권한 스키마(user:group:others)와는 달리 아래 4가지로 권한을 부여한다.

  • WORLD - 모든 요청 
  • AUTH - 인증된 세션
  • DIGEST - username/password로 인증된 요청
  • IP - 해당 ip요청



[ 조작 명령어 ]

getAcl /znode 결과-> world/anyone/crdwa (c : create, r :read ... )


DIGEST로 인증설정

addauth digest [username]:[password]

setAcl /znode auth:[username]:[password]:crdwa


호스트네임으로 인증설정

setAcl /znode host:[hostname]:crdwa


IP주소로 인증설정

setAcl /znoe ip:[IpAdressIPv4]:crdwa




[ Cloudera Manager ACL ]

znode인증설정을 풀어서 작업을 해야 할 경우 일일히 바꿀수 없기에 

CDH에서는 ACL을 모두 무시하고 접근가능하게 설정 할 수 있다.  


CM -> ZooKeeper -> Configuration 페이지 -> Java Configuration Options for Zookeeper Server에서 아래텍스트를 입력 후 Restart.

-Dzookeeper.skipACL=true


또는 

znode의 모든 권한을 갖는 superDigest 계정을 설정하는 방법도 있다.




참조 :

https://www.mynotes.kr/zookeeper-aclaction-control-list-%EC%84%A4%EC%A0%95/

[Algorithm] 요일구하기


문제 ] 

a와 b 정수 값을 입력 받아 2016년 a월 b일의 요일을 리턴한다.



코드1 ]

import java.util.*;
import java.text.*;

class Solution {
    public String solution(int a, int b) {

        String answer = "";     
        String aa = String.valueOf(a);
        String bb = String.valueOf(b);
        String[] week = {"SUN","MON","TUE","WED","THU","FRI","SAT"};

        if(aa.length() < 2){
            aa = '0' + aa;
        }
        if(bb.length() < 2){
            bb = '0' + bb;
        }
        
        String input_date = "2016"+aa+bb;
        DateFormat date_format = new SimpleDateFormat("yyyyMMdd");
        Date get_date = new Date();
        
        try{
            get_date = date_format.parse(input_date);
        }catch(ParseException e){
            e.printStackTrace();
        }
        
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(get_date);
        
        int idx = calendar.get(Calendar.DAY_OF_WEEK)-1;
        answer = week[idx];

        return answer;
    }
}



코드2]

자바 8에서는 Calendar클래스의 단점들을 보완하는 LocalDate클래스가 등장한다.

아래 코드는 코드1과 같은 결과다.


import java.time.*;

class Solution {
    public String solution(int a, int b) {

        return LocalDate.of(2016, a, b).getDayOfWeek().toString().substring(0,3);

    }
}



LocalDate 클래스 참조 :

https://jeong-pro.tistory.com/163