SyntaxHighlighter.all();

1. ElasticSearch vs RDB

ElasticSearch RDB
Get Select
Put Update
Post Insert
Delete Delete

 

2.  인덱스

1) 인덱스 있나 없나 확인

         curl -XGET http://localhost:9200/classes?pretty

 

2) 인덱스 없으면 데이터 생성

         curl -XPUT http://localhost:9200/classes

 

2) 인덱스 없으면 인덱스 생성

         curl -XPUT http://localhost:9200/classes

 

3) 인덱스 지우기

         curl -XDELETE http://localhost:9200/classes

 

4) 인덱스 조회

 

3. Document 

1) Document 생성 및 조회

         curl -XPOST http://localhost:9200/classes/class/1/ -d '{~~~~~~}'

          인덱스명 : classes      , 타입명 : class          , id : 1

 

 

2) Document 생성 및 조회 (파일을 활용)

         curl -XPOST http://localhost:9200/classes/class/1/ -d @test.json

test.json

        *에러 발생 -> 해결

에러 사항

         수정 전 : curl -XPOST http://localhost:9200/classes/class/1/ -d @test.json

         수정 후 : curl -XPOST http://localhost:9200/classes/class/1/ -d @test.json -H 'Content-Type: application/json'

에러 해결

 

3) Document 수정

curl -XPOST http://localhost:9200/classes/class/1/_update?pretty -d '{"doc":{"unit":1}}'

수정 완료

 

 + 추가) 다른 변경 방법

다른 수정 방법으로 수정완료

 

* sarding : 처리 성능 향상을 위해 index를 분산하여 저장하는 것

3) Document 여러개 입력

test2.json 파일

 


참고 : YouTube ( Minsuk Heo 허민석 )

 

 

 

 

 

'빅데이터 > 엘라스틱서치' 카테고리의 다른 글

[ElasticSearch] 엘라스틱서치 구축  (0) 2020.08.20

 

본 게시물은 엘라스틱서치 공부 목적으로,

엘라스틱 서치 관련 구글링해서 나온 것들을 참고하여 구축하였습니다.


 

Test 환경 : Ubuntu server 16.04

다운url : www.elastic.co/kr/downloads/elasticsearch

 

1. 설치 과정

1) FTP를 활용하여 elasticsearch 다운

2) chmod 755 elasticsearch-7.9.0-amd64.deb

3) dpkg -i elasticsearch-7.9.0-amd64.deb

       -> sudo 권한으로 

4) 설치 다되면 reboot

5) sudo systemctl enable easudo systemctl enable elasticsearch.service

       -> 엘라스틱을 안전하게 start/stop 가능

 

2. 사용 명령어

1) 시작

     sudo service elasticsearch start

2) 종료

     sudo service elasticsearch stop

3) 실행되고 있는지 확인

     curl -XGET 'localhost:9200' # check if elasticsearch run

 

 


참고 : YouTube ( Minsuk Heo 허민석 )

YARN의 스케줄러 : FIFO , 캐퍼시티(가용량), 페어(균등) 스케줄러

 

1. FIFO

- 선입선출 스케줄러

- 장점 : 이해하기 쉽고, 설정이 필요없음

- 단점 : 공유 클러스터 환경에서는 적합하지 않음

          모든 자원 점유하면 다른 애플리케이션은 자기 차례가 올 때가지 계속 대기

대형 잡, 작은 잡 순서대로 실행시 효율성

 

* 그림 간단 설명 *

(2) 캐퍼시티
      작은 잡을 제출되는 즉시 분리된 전용 큐에서 처리
      해당 큐는 잡을 위한 자원을 미리 예약해두기 때문에 전체 클러스터의 효율성은 떨어짐

(3) 페어
     실행 중인 모든 잡의 자원을 동적으로 분배하기 때문에 미리 자원의 가용량을 에약할 필요가 없음
     작은 잡이 추가로 시작되면 클러스터 자원의 절반을 이 잡에 해당함

 

2. 캐퍼시티 스케줄러

(1) 작동원리

     각 조직은 전체 클러스터의 지정된 가용량을 미리 할당받음

     각 조직은 분리된 전용 큐를 가지며 클러스터 가용량의 지정된 부분을 사용하도록 설정할 수 있음

     큐는 1단계 이상의 계층 구조로 분리할 수 있음 -> 다른 사용자 그룹 사이의 클러스터의 가용량 공유 가능

      (큐 내부에 있는 애플리케이션 스케줄링은 FIFO방식)

 

(2) 큐 배치

     애플리케이션의 종류마다 큐 배치 방법은 달라진다.

     큐 지정하지 않으면 기본 큐인 default에 배치됨 

     ex) 맵리듀스는 큐 이름 지정가능 , 지정한 이름 없을 시 제출 시점에 에러 발생

                               

              

3. 페어 스케줄러

기본 스케줄러는 캐퍼시티 스케줄러라서 변경해야됨

(1) 작동원리

     실행 중인 모든 애플리케이션에게 동일하게 자원 할당 

     균등공유는 큐 사이에만 적용 가능

     (아래 그림은 사용자 B가 잡2, 3을 시작한 경우)

 

(2) 큐 설정

큐를 계층구조 설정 가능, 균등 공유의 비율을 정할 수 있음

 

(3) 큐 배치

규칙 기반 시스템을 이용하여 큐배치

큐를 명시적으로 지정하지 않으면 사용자 이름의 큐를 사용(없으면 자동 생성)

모든 애플리케이션을 동일한 큐에 저장하는 단순한 큐 배치 정책도 있음

 

(4) 선점 

선점 : 잡의 시작 시간을 어느 정도 예측 가능하게 만들기 위한 기능

        스케줄러가 자원의 균등 공유에 위배되는 큐에서 실행되는 컨테이너를 죽일 수 있도록 허용하는 기능

        큐에 할당된 자원은 균등 공유 기준을 반드시 따라야 함

       (중단된 컨테이너는 반드시 다시 수행되어야함 -> 전체적 효율성 떨어짐)

        최소 공유 선점 타임아웃, 균등 공유 선점 타임아웃 설정 해야됨 (기본값 설정 안되어있음)

* 최소 공유 선점 타임아웃, 균등 공유 선점 타임아웃 설정이유*

- 큐가 최소 보장 자원을 받지 못한 채 지정된 최소 공유 선점 타임아웃이 지나면 스케줄러는 다른 컨테이너를 선취
- 큐가 균등 공유의 절반 이하로 있는 시간이 균등 공유 선점 타임아웃을 초과하면 스케줄러는 다른 컨테이너를 선취

 

 

4. 지연 스케줄링

  - YARN의 모든 스케줄러는 지역성 요청을 중요시 

  - 지연 스케줄링 : 원하는 노드를 조금 더 기다려서 할당받음 (클러스터의 효율성 증가)

                         캐퍼시티, 페어 스케줄러 모두 지연 스케줄링 기능 제공

(1) 작동원리

     모든 노드 매니저는 주기적으로 리소스 매니저에 하트비트 요청을 보냄

     하트비트를 통해 노드 매니저가 정보 주고 받음 (실행 중인 컨테이너의 정보, 새로운 컨테이너위한 가용한 자원)

        -> 하트비트는 애플리케이션이 실행할 컨테이너를 얻을 수 있는 중요한 스케줄링 기회

        

5. 우성 자원 공평성

   - 우성자원 공평성 : 각 사용자의 우세한 자원을 확인한 후 이를 클러스터 사용량의 측정 기준으로 삼음!

 

 

 

 

맵리듀스 1 - 맵리듀스 분산 구현

맵리듀스 2 - YARN을 이용한 구현


1. 맵리듀스 1

- 두 종류의 데몬 (잡의 실행을 제어하는 하나의 잡트래커, 하나 이상의 테스크트래커)

    → 잡 트래커 : 여러 태스크트래커에서 실행되는 태스크를 스케줄링함으로써 시스템에서 실행되는 모든 잡 조율

                        태스크 실패시 잡트래커는 다른 태스크 트래커에 그 태스크를 다시 스케줄링 함

        태스크 트래커 : 태스크를 실행하고 진행 상황을 잡트래커에 전송 

                               (잡트래커는 전체 진행상황 파악가능)

 

2. 맵리듀스2 ( YARN ) 

1) 맵리듀스 1, 2 차이

맵리듀스 1  맵리듀스 2 (YARN)
잡트래커 리소스 매니저,
애플리케이션 마스터 (맵리듀스 잡당 하나),
타임라인 서버
태스크트래커 노드 매니저
슬롯 컨테이너

 

  맵리듀스 1 맵리듀스 2
잡트래커,
리소스 매니저,
애플리케이션 마스터 
타임라인 서버
- 잡 스케줄링 (태스크와 태스크트래커 연결)
- 태스크 진행 모니터링
  (태스크를 추적하고, 실해하거나 느린 태스크를 다시 시작,
    전체 카운터를 유지하는 방법으로 태스크 장부 기록)
- 완료된 잡에 대한 잡 이력을 저장
   (잡트래커의 부하를 줄이기 위해 데몬사용)
- 맵리듀스 1과 동일한 역할을 수행
- 잡 스케줄링, 태스크 진행 모니터링
  (리소스매니저, 애플리케이션 마스터)
- 완료된 잡에 대한 잡 이력을 저장 
   (애플리케이션의 이력을 저장하는
     타임라인 서버가 저장함)

 

2) 맵리듀스 1의 한계 극복!!! 

  (1) 확장성 

       맵리듀스 1보다 큰 클러스터에서 실행가능 -> YARN은 10000노드와 100000태스크까지 확장 가능

  (2) 가용성

       YARN은 리소스 매니저, 애플리케이션 마스터로 분리되었기 때문에 HA서비스가 '분할 후 정복'문제로 바뀜

   (3) 효율성

       맵리듀스 1에서 각 태스크 트래커는 맵슬롯, 리듀스슬롯으로 구분하여 관리 (각각의 태스크에서만 사용가능)

       YARN은 슬롯 대신 일종의 리소스 풀로 관리

       -> 이득 : 리듀스 슬롯이 모자라서 리듀스 태스크가 계속 대기할 일은 없음

                   YARN은 잘 쪼개져 있기 때문에 필요한 만큼만 자원 요청가능

   (4) 멀티테넌시 (다중 사용자)

        가장 큰 장점!! -> 하둡이 맵리듀스를 뛰어넘어 다양한 분산 애플리케이션을 수용가능

YARN : 하둡의 클러스터 자원 관리 시스템

          클러스터의 자원을 요청하고 사용하기위한 API 제공

YARN 애플리케이션, 하둡완벽가이드

 

1. YARN 애플리케이션

 YARN은 장기 실행 데몬을 통해 서비스 제공

YARN이 애플리케이션을 구동하는 방식, 하둡완벽가이드

   1) 리소스 매니저

       클러스터 전체 자원의 사용량을 관리 (한개)

   2) 노드 매니저

       컨테이너를 구동하고 모니터링하는 역할 (모든 머신에서 실행됨)

        * 컨테이너 : 자원(메모리,cpu)의 사용 한도를 가진 특정 어플리케이션 프로세스는 컨테이너에서 실행됨

   3) YARN이 애플리케이션을 구동하는 방식

        (1) YARN 애플리케이션 제출

                 클라이언트는 YARN에서 애플리케이션을 구동하기 위해 리소스 매니저에 접속

                 애플리케이션 마스터 프로세스의 구동을 요청

        (2) 컨테이너 시작하기(2a), 구동(2b)

                 리소스 매니저는 컨테이너에서 애플리케이션 마스터를 시작할 수 있는 노드 매니저를 하나 찾음

                 * 애플리케이션 마스터가 딱 한번 실행될지는 애플리케이션에 따라 다름

                         ex) 한번 실행되는 경우 - 애플리케이션 마스터가 단순한 계산을 단일 컨테이너에서 수행하고

                                                          그 결과를 클라이언트에 반환한 후 종료되는 경우

                             여러번 실행되는 경우 - (3), (4) 과정 진행

        (3) 리소스 할당-하트비트(3), 컨테이너 시작하기(4a), 구동(4b)

                 리소스 매니저에 더 많은 컨테이너 요청(3)한 후 분산 처리를 수행함 (4a, 4b)

 

2. YARN 애플리케이션 - 자원요청

 - 다수의 컨테이너 요청시 각 컨테이너에 필요한 컴퓨터 자원의 용량, 요청에 대한 컨테이너의 지역성 제약도 표현

* 지역성 제약
    - 분산 데이터 처리 알고리즘에서 클러스터의 네트워크 대역폭을 효율적으로 활용하기 위해서는 지역성 보장이 중요
    - 지역성 제약은 특정 노드나 렉 or 클러스터의 다른 곳(외부렉)에서 컨테이너를 요청할 때 사용
    - 지역성 제약이 불가능할 때 : 할당이 실패하거나 선택적으로 제약을 조금 느슨히 적용할 수 있음

 

- YARN 애플리케이션은 실행 중에는 아무 때나 자원 요청을 할 수 있다. (2가지 방식)

      (1) 스파크 방식

             - 애플리케이션은 처음에 모든 요청을 함

             - 클러스터에서 고정 개수의 수행자를 시작함

       (2) 맵리듀스 방식

             - 애플리케이션은 유동적적인 접근이 필요한 경우에 애플리케이션의 요구에 따라 동적으로 자원 추가를 요청

             - 두 단계로 이루어짐 ( 처음에 필요한 맵 태스크 컨테이너 요청,

                                             But! 리듀스 태스크 컨테이너는 맵 태스크 실행 했을때만 가능)

 

 

3. YARN 애플리케이션 - 애플리케이션의 수명

 - 실행 시간보다는 사용자가 실행하는 잡의 방식에 따라 애플리케이션을 분류

   1) 첫 번째, 사용자의 잡 당 하나의 애플리케이션이 실행

          -  ex) 맵리듀스 잡

   2) 두 번째, 워크플로나 사용자의 잡 세션당 하나의 애플리케이션이 실행

          -  순차적으로 실행되는 잡이 동일한 컨테이너를 재사용할 수 있음(효율적)

          - 잡 사이에 공유 데이터를 캐싱할 수 있음 

         - ex) 스파크

   3) 세 번째, 서로 다른 사용자들이 공유할 수 있는 장기 실행 애플리케이션

          - 일종의 코디네이션 역할 

          -  ex) 아파치 슬라이더 - 클러스터에서 다양한 애플리케이션을 구동시키는 장기 실행 App마스터임

                  임팔라

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

알고리즘 꽃

정렬 : 자료를 특정 순서대로 정렬하는 것

정렬의 종류 : 선택정렬, 삽입정렬, 병합정렬,  퀵정렬, 거품정렬

 

1. 선택정렬 

선택정렬 : 리스트 중에 순서대로 선택해서 정렬시키기!

1) 선택정렬 알고리즘 (쉽게)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def find_min_idx(a):
    n=len(a)
    min_idx=0
    for i in range(1,n):
        if a[i]<a[min_idx]:
            min_idx=i
    return min_idx
 
 
def sel_sort(a):
    result=[]
    while a:
        min_idx=find_min_idx(a)
        Value = a.pop(min_idx)
        result.append(Value)
    return result
 
d=[2,4,5,1,3]
print(sel_sort(d))
cs

 

2) 선택정렬 알고리즘 (일반)

1
2
3
4
5
6
7
8
9
10
11
12
def sel_sort(a):
    n=len(a)
    for i in range(0,n-1):
        min_idx = i
        for j in range(i+1,n):
            if a[j] < a[min_idx]:
                min_idx = j
        a[i], a[min_idx] = a[min_idx],a[i]
    
d=[2,4,5,1,3]
sel_sort(d)
print(d)
cs

 

3) 알고리즘 분석

시간복잡도 = O(n^2)

 

 

2. 삽입정렬

삽입정렬 : 리스트를 하나하나 뽑아서 제자리로 정렬

1) 삽입정렬 알고리즘 (쉽게)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def find_ins(r,v):
    for i in range(0,len(r)):
        if v < r[i]:
            return i
    
    return len(r)
 
 
def ins_sort(a):
    result=[]
    while a:
        value = a.pop(0)
        ins_idx = find_ins(result,value)
        result.insert(ins_idx,value)
    return result
 
d=[2,4,5,1,3]
print(ins_sort(d))
cs

 

2) 선택정렬 알고리즘 (일반)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def ins_sort(a):
   n = len(a)
   for i in range(1, n):
       key = a[i]
       j = i - 1
       while j >= 0 and a[j] < key:  # 부등호 방향 뒤집기
           a[j + 1= a[j]
           j -= 1
       a[j + 1= key
 
= [24513]
ins_sort(d)
print(d)
 
cs

 

3) 알고리즘 분석

시간복잡도 = O(n^2)

'컴퓨터 과학 > 알고리즘' 카테고리의 다른 글

[알고리즘] 4. 탐색  (0) 2020.06.22
[알고리즘] 3. 재귀 호출  (0) 2020.06.22
[알고리즘] 2. 알고리즘 기초  (0) 2020.06.22
[알고리즘] 1. 알고리즘이란  (0) 2020.06.09

1.순차탐색

순차탐색 : 리스트 안에 있는 원소를 하나씩 순차적으로 비교하면서 탐색한다

1) 순차 탐색 알고리즘

리스트에서 특정값을 찾아서 해당 위치 번호를 반환

1
2
3
4
5
6
7
8
9
def search_list(a,x):
    for i in range(0,len(a)):
        if x == a[i]:
            return i
    return -1
 
v=[12,13,46,78,69]
print(search_list(v,46))
cs

 

2) 알고리즘 분석

시간복잡도 = O(n) 

 


연습문제 

7-1.

1
2
3
4
5
6
7
8
9
def search_list(a,x):
    answer=[]
    for i in range(0,len(a)):
        if x == a[i]:
            answer.append(i)
    return answer
 
v=[12,13,46,78,69,46]
print(search_list(v,46))
cs

 

7-2. n

7-3. 

1
2
3
4
5
6
7
8
9
10
 
def search_list(stu_no,stu_name,n):
    for i in range(0,len(stu_no)):
        if n == stu_no[i]:
            return stu_name[i]
    return '?'
 
stu_no=[39,14,67,105]
stu_name=["justin","john","mike","summer"]
print(search_list(stu_no,stu_name,39))
cs

'컴퓨터 과학 > 알고리즘' 카테고리의 다른 글

[알고리즘] 5. 정렬  (1) 2020.06.22
[알고리즘] 3. 재귀 호출  (0) 2020.06.22
[알고리즘] 2. 알고리즘 기초  (0) 2020.06.22
[알고리즘] 1. 알고리즘이란  (0) 2020.06.09

1. 팩토리얼 구하기

팩토리얼 알고리즘 : 1부터 n까지 연속한 정수의 곱 구하기

1) 팩토리얼 알고리즘 (재귀없이)

1
2
3
4
5
6
7
8
#1부터 n까지 곱하기
def fact(n):
    f = 1
    for i in range(1,n+1):
        f = f*i
    return f
 
print(fact(10))
cs

 

2) 팩토리얼 알고리즘 (재귀)

재귀 호출 : 어떤 함수 안에서 자기 자신을 부르는 것

1
2
3
4
5
6
7
#1부터 n까지 곱하기
def fact(n):
    if n <=1: #종료조건
        return 1
    return n*fact(n-1)
 
print(fact(10))
cs

 

3) 알고리즘 분석

시간복잡도 = O(n)

 

2. 최대공약수 구하기

최대공약수 : 두 개 이상의 정수의 공통 약수 중에서 가장 큰 값

1) 최대공약수 알고리즘

1
2
3
4
5
6
7
8
9
10
def gcd(a,b):
    i = min(a,b)
    while True:
        if a % i ==0 and b%i==0:
            return i
        i = i-1
 
    
print(gcd(3,6))
 
cs

 

2) 유클리드 알고리즘

유클리드 최대공약수 : 1. a와 b의 최대공약수는 'b'와 'a를 b로 나눈 나머지'의 최대공약수와 같다.

                                     -> gcd(a,b)=gcd(b,a%b)

                             2. 어떤 수와 0의 최대공약수는 자기자신이다.  -> gcd(n,0)=n

1
2
3
4
5
6
7
8
def gcd(a,b):
    if b==0:
        return a
    return gcd(b,a%b)
 
    
print(gcd(3,6))
 
cs

 

3. 하노이의 탑 옮기기

1) 하노이의 탑 알고리즘 

하노이의 탑 알고리즘 : 원반이 n개일 때 n-1개를 다른 기둥에 옮기는 것이 포인트! 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# n = 옮기려는 원반의 개수
# from_pos = 옮길 원반이 현재 있는 출발점 기둥
# to_pos = 원반을 옮길 도착점 기둥
# aux_pos =  보조 기둥
def hanoi(n,from_pos, to_pos, aux_pos): 
    if n==1:
        print(from_pos, "->", to_pos)
        return
    
    hanoi(n-1, from_pos,aux_pos,to_pos) #n-1개의 원반을 보조기둥으로
    print(from_pos,"->",to_pos)
    hanoi(n-1,aux_pos,to_pos,from_pos) #n-1개의 원반을 도착점 기둥으로
 
print("n=1")
hanoi(2,1,3,2)
 
 
cs

 

2) 알고리즘 분석

시간복잡도 = O(2^n)

 


연습문제

4-1. 

1
2
3
4
5
6
def sum(n):
    if n <=1:
        return 1
    return n+sum(n-1)
 
print(sum(10))
cs

 

4-2.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#처음에는 a[0]를 max로
#그뒤로 a[1],a[2]....비교하기
def find_max(a,n):
    if n ==1:
        return a[0]        #max값 첫번째 값으로
    max = find_max(a,n-1)
    if max > a[n-1]:
        return max
    else:
        return a[n-1]
 
 
a=[12,13,14,15,2]
print(find_max(a,5))
cs

 

5-1.

1
2
3
4
5
6
7
8
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-2+ fibonacci(n-1)
 
    
print(fibonacci(5))
 
cs

'컴퓨터 과학 > 알고리즘' 카테고리의 다른 글

[알고리즘] 5. 정렬  (1) 2020.06.22
[알고리즘] 4. 탐색  (0) 2020.06.22
[알고리즘] 2. 알고리즘 기초  (0) 2020.06.22
[알고리즘] 1. 알고리즘이란  (0) 2020.06.09

+ Recent posts