시작하기에 앞서 Docker 엔진을 설치해야한다.

윈도우 사용자의경우 Docker for Windows or Docker Toll Box 

Mac의 경우 Docker for MAC을 다운로드하고 설치하자

 

docker-compose 확인하기

$docker-compose version

위의 코드를 사용해서 해당 docker엔진에 docker-compose가 설치되어있는지 확인한다. 없다면  docker가 설치된 상태에서 아래의 방법으로 설치가 가능하다.

Docker for winodws 혹은 도커 툴박스를 설치했다면 최신버전의 경우 docker-compose가 자동적으로 설치되어있다. 하지만 혹시 모르니 버전확인은 필수

$ curl -L "https://github.com/docker/compose/releases/download/1.11.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

kafka-docker 레파지토리 클론

$ git clone https://github.com/wurstmeister/kafka-docker

혹시 fatal: could not create work tree dir 'kafka-docker': Permission denied 이런 오류가뜬다면 docker계정이 root계정 혹은 루트 위치가 아닐경우다 오류검색을해보면 계정에 루트권한을 주라고 나오는거 밖에없었는데 필자 같은경우는 해결이 안되서 cd..으로 루트위치로 이동하니 해결이 되었다

레퍼지토리를 클론 받으면 이런 창이 뜨면 성공이다

docker-compose-single-broker.yml 수정

로컬에서 실행하기 위해 KAFKA_ADVERTISED_HOST_NAME 값을 127.0.0.1로 변경한다.

version: '2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    build: .
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

docker-compose-single-broker.yml을 어디서 수정해야하는지 몰랐서 좀 붕떳는데 그냥 내pc서 파일을 검색하던가 오래걸린다면 C드라이브/사용자폴더/kafka-docker 폴더안에가면 docker-compose-single-broker.yml폴더가있다.

메모장으로 실행후 KAFKA_ADVERTISED_HOST_NAME 의 ip값을 수정해주면된다

docker-compose 시작하기

$ cd kafka-docker
$ docker-compose -f docker-compose-single-broker.yml up # Single Broker

설정이 끝났으면 위 명령어로 zookeeper 1대, 카프카 클러스터 1대를 시작한다. docker-compose.yml에 정의된 대로 docker-compose를 통해 서버를 실행한다.

처음에 설치하려니 아예 진행이안되서 

$ docker-machine restart default  

를사용해 도커 엔진을 재실행하고 하니 일단 다운은 진행되었다.. 근데

...

이렇게 신나게 설치되다가 또 오류가 발생했다.. 하.. 해결법 찾아도 마땅한게없어서 무시하고 진행해보자

추가) git config --global core.autocrlf false 명령어를 사용하면 

캐리지 리턴 오류가 해결되서 정상적으로 다운로드된다.

그럼 zookeeper Server와 Kafka Server를 실행하는 수고를 안해도 Docker 컨테이너속에 로컬 서버가 만들어진다.

(아래 서버 2개 키는거 할 필요 x)

 

정상적으로 설치가 진행되는 화면

이 화면이 나왔다면 터미널을 하나 더켜주고 밑에내용을 진행하면 된다.

Kafka 다운로드

카프카 다운로드하기

필자는 window TollBox를 사용해서 카프카 서버를 생성해서 wget명령어가 사용이 안되었다.ㅜㅜ 그래서 위의 카프카 다운로드하기 주소를 클릭하면 다운로드 할수있다. download kafka_2.12-0.10.2.0.tgz 파일을 일단 다운받는다.

$ wget https://www.apache.org/dyn/closer.cgi?path=/kafka/0.10.2.0/kafka_2.12-0.10.2.0.tgz
$ tar xzvf kafka_2.12-0.10.2.0.tgz
$ cd kafka_2.12-0.10.2.0

 

wget명령어가 사용이 가능한 터미널이라면 위의 코드를 사용한다.

다운받은 파일을 kafka-docker 폴더에 직접 넣어준후

$ tar xzvf kafka_2.12-0.10.2.0.tgz

명령어를 실행해주면

이렇게 다운로드가시작된다.

다운로드가 끝나면 위의 cd명령어로 설치한 카프카에 접속한다.

 

 

 

 

잘되나 싶더니 또 막혔다. 파일을 못찾는다고한다.. 확인해보면 kafaka-run-class.sh파일 제위치에 잘있는데 왜 오류라뜨는건지 모르겠다

타블로그 보고 따라하다가 윈도우의 경우 명령어 자체가 다른걸 늦게 확인했다. 다 mac o/s 만 쓰나보다..

https://kafka.apache.org/quickstart

 

Apache Kafka

Apache Kafka: A Distributed Streaming Platform.

kafka.apache.org

위 사이트를 확인해보면 windows의 경우 bin앞에 winodws폴더로 접근하고 sh 대신 bat을 사용하라한다 이런

 

서버 실행하기 

bin/windows/zookeeper-server-start.bat config/zookeeper.properties   //zookeeper실행 
bin/windows/kafka-server-start.bat config/server.properties //  터미널 하나 더열고 kafaka server 실행

 서버를 실행할때는 반드시 터미널을 하나 더 실행시켜줘야하는걸 숙지하자

토픽 생성 및 생성된 토픽확인

$ bin/windows/kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test12
3 // 토픽 생성 "test123"
Created topic "test123". 

$ bin/windows/kafka-topics.bat --list --zookeeper localhost:2181 //생성된 토픽확인
test123 // 출력물

Producer와 Consumer 연결

bin/windows/kafka-console-producer.bat --broker-list localhost:9092 --topic test123//프로듀서 연결

터미널 하나더키고

$ bin/windows/kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test123 --from-beginning
//컨슈머 연결해준다

필자같은경우는 서버를켰던 터미널은 그대로 두고 새로 터미널창을 열어서 producer를 연결했다.

그리고 터미널창을 또 연결해서 컨슈머를 연결했다(cd kafka-docker/kafka_2.12-0.10.2.0) 으로 접속해서 ㅇㅇ

왼쪽이 porducer 오른쪽이 consumer 결과화면

위 화면을 보면 프로듀서 입력한내용이 컨슈머로 가는걸 확인했다. 

반대로 컨슈머서는 채팅자체가 안쳐진다.

 

막상 연결되니 간단한데 대부분 블로그서 bin..../.sh 를 사용하니 오래 해맸다...

zookeeper 와 kafka Server연결은 서버단 만들때 터미널창 2개띄우는거 필수(docker-compose)가 정상적으로되면 이번 목적은 로컬 연결로 테스트하기 때문에 Server단 연결은 필요없어보임

 

'Coding > Server' 카테고리의 다른 글

Docker DB 생성 연결  (0) 2019.11.08
REST API 를 쓰는이유  (0) 2019.11.08
Docker 메모  (0) 2019.11.07

HashMap

 인자로,null값이 허용되는 key,value값을 <K,V>로 허용한다.

해쉬맵의 순서는 정해져있지 않으므로,정해진 순서대로 iterate을 하고 싶다면,LinkedHashMap을 사용할 것

여러 워커 쓰레드를 사용하는 경우, 자동으로 동기화 되지않으므로, synchronized을 해야할 필요가 있다.

Serialzable을 사용하므로, intent로 넘기기에도 유용하다.

1 Map<String, String> map = Maps.newHashMap();
2 map.put("c", "1");
3 map.put("a", "1");
4 map.put("b", "1");
5 map.put("k", "1");
6 for (String s : map.keySet()) {
7     System.out.println(s);
8 }
9 // b, c, a, k 출력

내부 hash값에 따라서 키순서가 정해지므로 특정 규칙없이 출력됨.

TreeMap

 유저가 제공해주는 comparators 나 키의 natural order에 의해서 sort가된다.

내부 알고리즘서 RedBlack Tree를 사용

Map<String, String> map = Maps.newTreeMap();
2 map.put("c", "1");
3 map.put("a", "1");
4 map.put("b", "1");
5 map.put("k", "1");
6 for (String s : map.keySet()) {
7     System.out.println(s);
8 }
9 // a, b, c, k 출력

키값이 알파벳 순서대로 정렬된다. 트리에 저장되므로 키값은 일정 기준으로 정렬된 상태로 출력

LinkedHashMap

doulbly-linked list 자료구조로 저장됨

linked-list이므로 넣은 순서대로 빠져나온다.

HashMap과 마찬가지로 다중쓰레드 사용시에 synchronized가 되지 않음.

linked-list와 같이 들어간 순서대로 iterate이 되서 출력이 된다.

1 Map<String, String> map = Maps.newLinkedHashMap();
2 map.put("c", "1");
3 map.put("a", "1");
4 map.put("b", "1");
5 map.put("k", "1");
6 for (String s : map.keySet()) {
7     System.out.println(s);
8 }
9 // c, a, b, k 출력

키값을 입력한 순서대로 출력이 되서 나온다.

 

결론

  • 특별한 이유가 없다면 검색 성능이 좋은(O(1)) HashMap 을 사용하자
  • 키값이 일정한 수준대로 iterate 하려고 한다면 TreeMap 을 사용하자. 하지만 랜덤 접근에 대해서는 O(logn) 성능을 지니므로 많은 데이터를 넣을경우 좋지 않은 성능이 나올수 있다.
  • 입력 순서가 의미있다면 LinkedHashMap 을 사용하자. 랜덤 접근에 대해 O(n) 성능을 지니므로 많은 데이터를 입력할 경우 사용하지 않는것이 좋겠다!

 

출처

 

Java Map - HashMap, TreeMap, LinkedHashMap 차이

Java Map 자바에는 여러 Map 이 있다. 생각없이 아무거나 쓰지말고 차이를 알아보자 HashMap 내부적으로 Entry [] Entry 의 array 로 되어 있다. 해당 array 에 index 는 내부 해쉬 함수를 통해 계산된다. String 은 sun.misc.Hashing.stringHash32 함수를 사용하고 일반 Object는 내부 hashcode 함수와 비트연산으로 계산되어진다. 1 Map map = Maps.newHashMap();

rangken.github.io

  

 

 

'Coding > Java' 카테고리의 다른 글

비공개저장용  (0) 2019.12.06
Set ->hashset, treeset, linkedhashset, sortedset  (0) 2019.11.13
List -> ArrayList,LinkedList,Vector  (0) 2019.11.13
JAVA 기본형과 참조형  (0) 2019.11.13
GIT 과 SVN의 차이 + Git의 Rebase와 Merge  (0) 2019.11.13

SET

 

순서에 상관없이, 어떤 데이터가 존재하는지를 확인하기 위한 용도로 많이 사용된다. 중복되는 것을 방지하고, 원하는 값이 포함 되어 있는지를 확인하는것이 주 용도이다.

  1. HashSet: 순서가 전혀 필요없는 데이터를 해시 테이블 hash table 에 저장한다. Set중에서 가장 성능이 좋다.
  2. TreeSet: 저장된 데이터의 값에 따라서 정렬되는 셋이다. red-black 이라는 트리 tree타입으로 값이 저장되며, HashSet보다 약간 성능이 느리다.
  3. LinkedHashSet:연결된 목록 타입으로 구현된 해시 테이블에 데이터를 저장한다. 저장된 순서에 따라서 값이 정렬된다. 대신 성능이 이 셋 중에서 가장 나쁘다.

 

HashSet

package com.example.test;

import java.util.HashSet;
import java.util.Iterator;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SetTest {

	public static void main(String[] args) {
		SpringApplication.run(SetTest.class, args);
		
		HashSet set = new HashSet();
		
		set.add("달걀");
		set.add("치즈");
		set.add("치킨");
		set.add("피자");
		set.add("치즈");
		
		Iterator it = set.iterator();
		
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		
		
	}

}

실행 결과 화면

결과 화면을 확인하면 중복되는 Value인 치즈 1개를 제외하고 나머지 4개가 출력된것을 확인 할 수 있다.

확인해보면 HashSet은 순서가 상관없는 데이터를 hash table에 중복된 값을 제외해서 저장하는걸 알 수 있었다.

List<String> list = new ArrayList<String>(set);
Collections.sort(list); 

Set을 정렬이가능하게 List로 변화시켜주고

Collections.sort()를 활용하면 정렬되지 않았던 hashSet도 정렬이 가능하다.

TreeSet

TreeSet은 이진검색트리(binary search tree)라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스 이다. 이진 검색 트리는 정렬, 검색, 범위검색에 높은 성능을 보이는 구조로 TreeSet은 이진 검색트리의 성능을 향상 시킨 레드-블랙-트리로 구현되어있다. 

또한 위의  Set인터페이스로 구현했기 때문에 중복된 데이터의 저장을 허용하지 않으며, 저장 순서또한 유지 하지 않는다. 값의 순서에따라 정렬해준다

package com.example.test;

import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SetTest {

	public static void main(String[] args) {
		SpringApplication.run(SetTest.class, args);
		
		TreeSet set = new TreeSet();
		
		for(int i=15; i>0;i--) {
			set.add(i);
		}
		set.add(-3);
		set.add(-4);
		set.add(15);
		set.add(11);
		
		Iterator it = set.iterator();
		
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		
		
	}

}

TreeSet 결과창

위의 사진을보면 -4~15까지 정렬되서 출력되는것을 확인 할 수있다.

여기서 위의 TreeSet을 HashSet으로 다시돌려보면 

HashSet결과창

음수를 구분하지 못한채로 정렬되어있는것을 확인 할 수있다.

 

또한 subSet을 통한 탐색도 가능하다

System.out.println(set.subSet(1,5));

통해서  1부터 5미만의 수를 출력하거나 String Value값을 통해 원하는 단어가 포함된 값도 탐색이 가능하다.

Compareble 인터페이스로 구현하여 정렬하는법

package com.example.test;

 class Student implements Comparable<Student> {
	private String name;
	private int point;

	public Student(String name, int point) {
	
		this.name = name;
		this.point = point;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getPoint() {
		return point;
	}

	public void setPoint(int point) {
		this.point = point;
	}
	
	@Override
	public int compareTo(Student student) {
	
		return this.point -student.point; //점수로 비교하기위함 오름차순 순 (내림차순은 반대)
	}

	@Override
	public String toString() {
		return " [name=" + name + ", point=" + point + "]";
	}

}

Student클래스를 만들어 Comparable을 구현받아준다. Stduent클래스는 TreeSet이 삽입될때 오버라이딩된 compareTo 메소드를 이용하여 정렬을 진행한다.

 

package com.example.test;

import java.util.Iterator;
import java.util.TreeSet;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SetTest {

	public static void main(String[] args) {
		SpringApplication.run(SetTest.class, args);
		
		TreeSet<Student> set = new TreeSet<Student>();
		
		set.add(new Student("A",100));

		set.add(new Student("B",120));

		set.add(new Student("C",130));

		set.add(new Student("D",140));

		set.add(new Student("E",110));
		
		Iterator it = set.iterator();
		
		while(it.hasNext()) {
			System.out.print(it.next()+" ");
		}
		
	
		
	}

}

결과 화면

결과창을보면 point의 점수순으로 정렬된것을 확인 할 수있었다.

 

linkedhashset

linkedHashSet도 set인터페이스를 참조하므로 중복된 데이터를 저장할수없다. 또한 입력한 순서되로 저장이 되는 특징이있다.

package com.example.test;

import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.TreeSet;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SetTest {

	public static void main(String[] args) {
		SpringApplication.run(SetTest.class, args);
		
		LinkedHashSet<Student> set = new LinkedHashSet<Student>();
		
		set.add(new Student("A",100));
        
      	  set.add(new Student("C",130));

		set.add(new Student("B",120));

		set.add(new Student("D",140));

		set.add(new Student("E",110));
		
		Iterator it = set.iterator();
		
		while(it.hasNext()) {
			System.out.print(it.next()+" ");
		}
		
	
		
	}

}

LinkedHashSEt결과화면 

 위의 결과창을보면  A C B D E 가 순서대로 출력된것을 확인 할 수있었다.

sortedset

SortedSet은 컬렉션중 하나로 Collection이기도 하며 Set이기도 하다.

실제로 SortedSet은 Set을 상속한 인터페이스이다. 이 이유로 Set에서 할 수있는 모든 메소드 호출을 SortedSet에서도 사용이 가능하다.

또한 SortedSetd은 Set과 다른점이 있다면 Set은 객체의 순서를 상관하지 않고 객체의 중복여부에만 관심을 갖는데 반해 SortedSet은 객체의 중복여부뿐만 아니라 객체 끼리의 순서에도 관심을 갖고 있다.

물론 SortedSet에 있는 객체끼리의 순서가 있다고 해서 List처럼 지정한 위치에 객체를 넣을수 있는건 아니다. 객체의 순서에 관심이 있다는것은 iterator을 통해서 객체를 탐색할 때 적절한 순서에 따라 객체를 얻어내는 것이다.

 

 

  SortedSEt
Comparator comparator()

SortedSet Comparator를 구합니다.

SortedSet이 객체의 Natural Ordering을 이용해서 객체

순서를 정하고 있다면 null

그외 SortedSet Comparato

Object first() SortedSet의 첫번째 객체를 구합니다.
SortedSet     headSet(Object to)

SortedSet to 객체보다 작은 객체의 부분으로 구성한

SortedSet을 구합니다.

Object last() SortedSet의 마지막 객체를 구합니다.
SortedSet subSet(Object fromElement, Object toElement)

SortedSet toElement(포함)보다 크고,

fromElement(제외)보다 작은 객체로 구성한 SortedSet




SortedSet tailSet(Object fromElement)

SortedSet fromElement(포함)보다 큰 객체로

구성한 SortedSet

SortSet을 사용할때 유의할점!

  • SortedSet에 포함된 객체가 Comparable 인터페이스를 구현한 객체이거나
  • Comparator인터페이스를 구현한 객체여야 한다

 

 

[자바] SortedSet 사용법

SortedSet 사용법에 대해서 알아보록 하겠습니다. SortedSet은 원소들이 정렬되어 있는 Set입니다.따라서 SortedSet 하여금 객체 간 대소 비교가 가능한 상황을 만들어줘야 합니다.여기서 “객체 간 대소 비교가 가능한 상황”이란 다음 2가지로 생각해볼 수 있습니다. Comparable 인터페이스를 구현하고 있는 클래스의 객체를 원소로 사용

www.daleseo.com

SortedSet사용예제가 간단히 나와있는 사이트

'Coding > Java' 카테고리의 다른 글

비공개저장용  (0) 2019.12.06
Map- HashMap,TreeMap,LinkedHashMap 비교하기  (0) 2019.11.13
List -> ArrayList,LinkedList,Vector  (0) 2019.11.13
JAVA 기본형과 참조형  (0) 2019.11.13
GIT 과 SVN의 차이 + Git의 Rebase와 Merge  (0) 2019.11.13

+ Recent posts