728x90

💡 파이프라이닝 (Pipelining) 💡

🔍 정의

동시에 여러 개의 명령어를 처리하여 처리량을 올리는 기법

파이프라이닝 (Pipelining)은 명령어를 순차적으로 실행하는 프로세서에 적용되는 기술이다.

하나의 명령어가 실행될 때, 다른 명령어를 실행시켜서 동시에 여러 개의 명령어를 실행시키는 기법이다.

이렇게 동시에 여러 개의 명령어를 처리하여 처리량을 올리는 것이 핵심이다.

이때 명령어에 따라 실행하는 각 단계 수행 속도는 변화가 없으며 처리량만 증가한다.

또한 명령어가 동시에 여러 개가 실행되면서 전체 수행 속도는 향상된다.

🔍 이해

파이프라이닝 (Pipelining)을 이해하기 위해 세탁소에서 세탁물을 처리하는 예제를 많이 사용한다.

세탁소에서 세탁물을 처리하는 절차

  1. (세탁) 세탁물을 세탁기에 넣고 동작시킨다.
  2. (건조) 세탁된 옷을 건조기에 넣고 동작시킨다.
  3. (접기) 건조된 옷을 접는다.
  4. (보관) 접은 옷을 보관한다.

위와 같이 4단계의 절차가 있고, 세탁물 A, B, C가 있다고 가정해 보자.

각 단계를 처리하는데 소요되는 시간은 1시간이라고 가정한다.

위의 순서대로 세탁물 A, B, C를 차례대로 세탁을 하면 아래와 같은 표로 정리할 수 있다.

  1 2 3 4 5 6 7 8 9 10 11 12
세탁물 A 세탁 건조 접기 보관                
세탁물 B         세탁 건조 접기 보관        
세탁물 C                 세탁 건조 접기 보관

각 단계별로 세탁물 A, B, C를 처리하는데 전체 12시간 소요된다.

각 단계가 종료되면 다음 세탁물이 들어올 때까지 계속 대기하고 있는 idle task가 발생하게 된다.

이러한 idle task를 줄여 동일 한 시간 내에 작업 처리량을 증가시키기 위해 파이프라이닝을 사용한다.

아래 표는 파이프라이닝을 적용한 내용을 정리한 표이다.

  1 2 3 4 5 6 7 8 9 10 11 12
세탁물 A 세탁 건조 접기 보관                
세탁물 B   세탁 건조 접기 보관              
세탁물 C     세탁 건조 접기 보관            

각 단계별로 세탁물 A, B, C를 처리하는데 전체 6시간 소요된다.

위 와 같이 동시에 처리 가능한 일들은 동시에 처리하여 전체 작업 속도를 향상하고 동일한 시간 내에 처리량을 증가시킬 수 있다.

파이프라이닝 기술 적용 유무에 대해 비교하면 아래와 같다.

  • p: 단계 수
  • n: 작업 수
  • T: 전체 시간
  • sp: 파이프라이닝을 적용하여 얻을 수 있는 속도 향상
  파이프라이닝 X 파이프라이닝 O
전체 작업 시간 (T) T = p*n 4*3 = 12 T = p+(n-1) 4+(3-1) = 6
속도 향상 (sp)     sp = (p*n) / {p+(n-1)} (4*3)/{4+(3-1)} = 2

위 예제의 경우 파이프라이닝을 적용했을 때, 속도가 2배 상승함을 알 수 있다. 

 

🔍 효율적인 파이프라인 조건

명령을 세분화하여 단계를 더 나눌 수 있다면 처리 속도 향상을 기대할 수 있다.

그러나, 실행할 수 있는 명령어 수에 비해 단계가 너무 많이 세분화되어 있다면 효율성을 기대하기는 힘들다.

  • 각 단계별 처리 시간 일정
  • 각 명령어 처리 단계 균일

또한 위와 같은 두 가지 조건에서 파이프라이닝의 효율이 좋다.

처리 시간이 일정하지 않거나 명령어 처리 단계가 균일하지 않으면 문제가 발생하기도 한다.

이때 시스템에서 발생할 수 있는 잠재적인 위험을 가리키는 '파이프라인 해저드'라는 용어를 사용한다. 


 

💡 해저드 (Hazard) 💡

🔍 정의

파이프라인을 사용하는 명령어가 클럭 사이클 내에 실행하지 못해서 다른 명령어들이 대기하는 상황.

처리 성능을 향상하기 위해 파이프라이닝을 적용하면 명령어를 여러 단계로 분할하여 동시에 실행하면서 문제가 발생할 수 있다.

이를 파이프라인 해저드라고 한다.

파이프라인 해저드 (Pipeline hazard)는 3가지 종류가 있다.

  • 구조적 해저드 (Structural Hazard)
  • 데이터 해저드 (Data Hazard)
  • 제어 해저드 (Control Hazard)

🔍 구조적 해저드 (Structural Hazard)

여러 단계의 파이프라인에서 동시에 수행되는 작업들 사이에 자원 충돌이 발생하는 경우 발생

프로세스의 자원 부족으로 발생한다.

예를 들어,

하나의 명령어가 실행 단계에서 필요한 자원을 이미 사용 중인 경우

다음 명령어의 실행이 지연되거나 중단될 수 있다.

 

🔍 데이터 해저드 (Data Hazard)

파이프라인의 한 단계에서 결과가 아직 사용되지 않은 상태에서
다음 단계에서 해당 결과를 필요로 하는 경우 발생

잘못된 결과가 생성되거나 파이프라인의 동작이 불안정해질 수 있다.

 

위와 같이 데이터의 의존성으로 인해 발생하는 문제를 해결하기 위해

전방전달 (Forwarding) (or 우회전달 (Bypassing)) 이 사용된다.

전방전달은 실행 중인 명령어의 결과를 파이프라인의 이후 단계로 직접 전달하여 데이터 의존성을 우회하는 방법이다.

즉, 이전 명령어의 결과가 아직 메모리에 기록되지 않았더라도,

해당 결과를 다음명령어의 연산에 사용할 수 있도록 한다.

이를 통해 데이터 의존성으로 인한 대기 시간을 줄이고, 파이프라인 성능을 향상할 수 있다.

 

 

🔍 제어 해저드 (Control Hazard)

분기 명령어나 예외 상황과 같이 명령어 흐름을 변경하는 상황에서 발생

예를 들어,

분기 예측이 실패하거나 분기 결과가 다음 명령어의 실행에 영향을 주는 경우

잘못된 명령어가 실행될 수 있다.

 

위와 같은 파이프라인 해저드 문제가 발생하지 않기 위해서

파이프라인 간단화, 지연 슬롯, 예측 기술들을 사용할 수 있으며

파이프라인을 잘 관리하여야 한다.

728x90

'Computer Science > Computer Architecture' 카테고리의 다른 글

5. 패리티비트 & 해밍코드  (0) 2021.08.02
4. 고정소수점 & 부동소수점  (0) 2021.08.02
3. Cache Memory  (0) 2021.07.20
2. CPU  (0) 2021.07.18
1. Structure  (0) 2021.07.14

728x90

Inverted Index

먼저 예시를 보면

Doc1: apple banana coconut
Doc2: apple doughnut egg
Doc3: apple coconut melon

위와 같이 있다고 했을 때, Inverted Index는 아래와 같습니다.

apple -> Doc1:1, Doc2:1, Doc3:1
banana -> Doc1:7
coconut -> Doc1:14, Doc3:7
doughnut -> Doc2:7
egg -> Doc2:16
melon -> Doc3:15

위와 같이 각각의 단어가 어느 문서에서 어느 위치에 있는지 list로 가지고 있는것을 Inverted Index라고 합니다.

 

728x90

'Hadoop > 이론' 카테고리의 다른 글

Matrix Addition  (0) 2021.09.16
Partitioner Class  (0) 2021.09.15
맵리듀스 프레임워크 이해하기  (0) 2021.08.25
728x90

Partitioner Class

Map 함수의 출력인 (Key, Value) 쌍이 Key에 의해서 어느 Reducer (머신)로 보내질 것인지를 정해지는데
이러한 결정을 정의하는 class

하둡의 기본 타입은 Hash 함수가 Default로 제공되고 있어서 Key에 대한 해시 값에 따라 어느 Reducer(머신)으로 보낼지를 결정한다.

하둡의 기본타입
- Text
- IntWritable
- LongWritable
- FloatWritable
- DoubleWritable

Partitioner Class 예제 코드

소문자로 시작하면 0번 머신으로, 대문자로 시작하면 1번 머신으로 보내는 파티셔너 예제 코드

 public static class MyPartitioner extends Partitioner<Text, IntWritable> {
   @Override
   public int getPartition(Text key, IntWritable value, int numPartitions) {
     if(key.toString().charAt(0) < 'a') return 0;
     else return 1;
   }
 }

 

728x90

'Hadoop > 이론' 카테고리의 다른 글

Matrix Addition  (0) 2021.09.16
Inverted Index  (0) 2021.09.15
맵리듀스 프레임워크 이해하기  (0) 2021.08.25
728x90

[문제]

https://programmers.co.kr/learn/courses/30/lessons/42586

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

    제한 사항
    • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
    • 작업 진도는 100 미만의 자연수입니다.
    • 작업 속도는 100 이하의 자연수입니다.
    • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

[문제 풀이]

Queue에 걸리는 시간을 계산해서 넣어준다.
걸리는 시간은 (100.0-progresses[i]/speeds[i])을 올림하면 된다.

그리고 while문을 돌면서 하나씩 뽑는데 그 다음것도 뽑을 수 있으면 뽑고 cnt 를 증가시킨다.
cnt를 하나씩 list에 넣어주고 list를 int[] array로 변환하여 return하면 된다.

[코드]

public boolean solution(String[] phone_book) {
        Queue<Integer> q = new LinkedList<>();
        for (int i=0; i<progresses.length; i++) {
            q.offer((int)Math.ceil((100.0-progresses[i])/speeds[i]));
        }

        List<Integer> answer = new ArrayList<>();
        while(!q.isEmpty()) {
            int cur = q.poll();
            int cnt = 1;

            while (!q.isEmpty() && cur >=q.peek()) {
                cnt++;
                q.poll();
            }
            answer.add(cnt);

        }
        return answer.stream().mapToInt(Integer::intValue).toArray();
}
728x90
728x90

[문제]

https://programmers.co.kr/learn/courses/30/lessons/42577

 

코딩테스트 연습 - 전화번호 목록

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조

programmers.co.kr

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
    • 각 전화번호의 길이는 1 이상 20 이하입니다.
    • 같은 전화번호가 중복해서 들어있지 않습니다.

[문제 풀이]

Map에 전화번호를 하나씩 넣어주고 각 스트링을 스트링의 길이까지 하나씩 증가시키면서 쪼갰을 때 그 값을 키로 가지는것이 Map에 있으면 false를 출력하고 다 비교해도 없으면 true를 출력한다.

[코드]

public boolean solution(String[] phone_book) {
        int n = phone_book.length;

        Map<String, Integer> map = new HashMap<>();
        for (int i=0; i<n; i++) {
            map.put(phone_book[i], i);
        }
        
        for (int i=0; i<n; i++) {
            for (int j=0; j<phone_book[i].length(); j++) {
                String str = phone_book[i].substring(0, j);
                if (map.containsKey(str)) {
                    return false;
                }
            }
        }
        return true;
}

 

728x90
728x90

⚒ 하둡 설치하기

1. 리눅스 환경 구축

하둡 설치에 앞서 리눅스 환경을 만들어줘야 합니다. 계정 이름은 hadoop으로 합니다!
리눅스 환경 구축 방법: https://dos-soles.tistory.com/24

 

WSL2을 이용한 리눅스 설치

💡 설치 방법 💡 리눅스 서버를 구하기 위해서는 다음과 같이 4가지 방법이 있습니다. 🔨1. PC에 우분투 설치  우분투를 기본 OS로 설치하는 기본적인 방법입니다. 설치가 어렵게 느껴질

dos-soles.tistory.com

2. 하둡 설치

하둡 다운로드: https://hadoop.apache.org/

 

Apache Hadoop

위에 링크에 들어가서 다운로드 -> 원하는 버전 바이너리 선택

저 링크를 눌러서 다운을 받으면 됩니다.
저는 3.2.2 버전을 설치하였고 /usr/local/hadoop/ 에 압축을 풀어서 넣었습니다.

3. 자바 설치

하둡은 자바로 개발 되었고 데몬을 구동할 때 jar 파일을 수정하기 때문에 자바를 설치 주어야 합니다.

$ sudo apt install ssh openjdk-8-jdk ant -y

4. 환경 설정

미리 작성한 파일을 실행 시킵니다.

$ ./set_hadoop_env.sh
$ source ~/.bashrc

5. ssh 키 설정

$ ssh-keygen -t rsa -P “”

뭐 물어보면 enter 누르면 됩니다.
키가 생성되면 키를 아래와 같은 이름으로 하나 복사합니다.

$ cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

키가 잘 복사가 됐다면 ssh localhost 실행시 키를 묻지 않고 바로 실행 되야 합니다.
저는 여기서 다음과 같은 에러가 났습니다.

ssh: connect to host localhost port 22: Connection refused

방화벽 문제인 것 같아서 아래 명령어로 해결했습니다.

$ ufw allow ssh

다시 실행하면 실행은 되는데 키를 물어봅니다.

Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Enter passphrase for key '/home/hadoop/.ssh/id_rsa': 

여러 방법 다 해보다가 키 생성할 때 -P "" 부분을 지우고 생성해주었더니 잘 작동됩니다.

$ ssh-keygen -t rsa

이 명령어로 다시 키를 생성해서 ssh localhost 입력했고 키를 물어보지 않고 잘 작동 됩니다!

6. 하둡 실행 준비

/home/hadoop에서 아래 명령어를 입력합니다.

$ source .bashrc
$ hadoop namenode -format

$ start-dfs.sh

$ jps

위와 같이 나오면 성공입니다!

7. HDFS 디렉토리 생성

$ hdfs dfs –mkdir /user
$ hdfs dfs –mkdir /user/Hadoop

/user와 /user/hadoop 두개의 디렉토리를 생성해줍니다.

이렇게 하면 하둡 실습 전 환경 구성 완료입니다.

728x90

'Hadoop > 실습' 카테고리의 다른 글

WSL2을 이용한 리눅스 설치  (0) 2021.09.01
728x90

💡 설치 방법 💡

리눅스 서버를 구하기 위해서는 다음과 같이 4가지 방법이 있습니다.

🔨1. PC에 우분투 설치  

우분투를 기본 OS로 설치하는 기본적인 방법입니다. 설치가 어렵게 느껴질 수 있다는 단점이 있습니다.
윈도우를 사용하지 못하기 때문에 남는 컴퓨터를 사용하거나 듀얼 부팅을 이용해서 사용할 수 있습니다.

🔨2. WSL2

WSL은 Windows Subsystem for Linux의 약자로 리눅스용 윈도우 하위 시스템입니다.
윈도우 10을 사용하고 있으면 window 내에서 리눅스를 사용할 수 있습니다.
리눅스와 완전 동일한 것은 아니지만 빠른 속도와 호환성이 높다는 장점이 있습니다.

🔨3. 가상 머신  

가상 머신은 PC에 VMWare 또는 무료인 VirtualBox와 같은 가상 머신을 이용하여 리눅스를 설치하는 방법입니다.
가상머신을 이용하여 리눅스를 설치하게 되면 속도가 매우 느리고 용량의 제한이 있다는 단점이 있습니다.

🔨4.  클라우드  

클라우드는 AWS, MS Azure, Google, Alibaba, Naver에서 서비스를 제공하고 있습니다.
클라우드를 이용하는 방법은 안정적이며 설치 시 어려운 점이 없다는 장점이 있습니다.
그러나 이러한 클라우드는 유료라는 큰 단점이 있습니다.
물론 무료 버전도 있습니다. 프리티어는 1년간 무료로 제공해주지만 무료 기간을 잘 확인하고 사용하지 않으면 가입 시 입력한 신용카드로 요금이 청구될 수 도 있습니다.

이 글에서는 WSL2방법으로 서버를 구축하는 방법에 대해서 설명하겠습니다.

💡 WSL2 설치하기 💡

1. Windows Terminal 설치하기

Default로 제공되는 window의 cmd는 다양한 terminal을 제공하지 않아 다소 불편했습니다. 
그래서 Windows Store에 있는 Microsoft에서 만든 cmd를 설치합니다.  

2. WSL2 리눅스 설치 명령어

windows 10에서 WSL2 설치 가이드에 따르면 아래 2가지 명령어를 수행하면 WSL2를 설치할 수 있습니다. 
관리자 권환으로 설치한 terminal을 실행시키고 다음 명령어를 입력합니다.

➡️ Linux용 Windows 하위 시스템" 옵션 기능을 사용하도록 설정
_WSL feature Enable_  

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

 

➡️ Virtual Machine 플랫폼 옵션 기능을 사용하도록 설정
_Virtual Machine Platform feature Enable_  

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

3. 원하는 Linux 버전 설치

- Ubuntu 20.04 LTS
- openSUSE Leap 15.1
- SUSE Linux Enterprise Server 15 SP1
- Kali Linux
- Debian GNU/Linux
- Fedora Remix for WSL
- Pengwin
- Alpine WSL

위와 같이 많은 버전들을 지원하고 있습니다. 
저는 Ubuntu 20.04 LTS 버전을 설치하도록 하겠습니다.  

실행을 했는데 다음과 같은 오류❗️가 나왔습니다.  

WslRegisterDistribution failed with error: 0x8007019e
The Windows Subsystem for Linux optional component is not enabled. Please enable it and try again.

해결하기 위해 개발자 모드를 활성화 시키고  

Linux용 Windows 하위 시스템에 체크를 하였는데 문제가 계속 해결되지 않았습니다.❌ 

알아본 결과 윈도우10 education 버전에서는 WSL2 기능을 제공하지 않는다는 것을 알게되었습니다.
그래서 윈도우10 Enterpise 버전이 깔린 다른 노트북으로 위 과정을 다시 했더니 정상적으로 작동 하였습니다.⭕️

정상적으로 작동된 화면은 다음과 같습니다.  

 

4. WSL2로 변환

설치한 linux버전을 wsl2로 변경해야합니다.  
그러기 위해 먼저 설치한 Linux에 할당된 WSL 버전을 확인합니다.

아래 명령어를 입력하면 버전을 확인할 수 있습니다.  

➡️ Linux 버전 확인  

wsl --list --verbose

➡️ Linux 배포 설정 변경  

wsl --set-version <distribution name> <versionNumber>

➡️ WSL2를 기본으로 설정

wsl --set-default-version 2

 

실행한 화면은 다음 그림과 같습니다.  

위 그림과 같이 버전 1에서 2로 바뀐 것을 확인할 수 있습니다.

이렇게 리눅스 우분투20.04 설치가 완료되었습니다!  

728x90

'Hadoop > 실습' 카테고리의 다른 글

하둡 설치 및 환경 구성  (0) 2021.09.02

+ Recent posts