'helloworld'에 해당되는 글 2건

  1. 2016.04.10 KafKa Cluster ~ HelloWorld
  2. 2016.04.10 RabbitMQ Hello World

RabbitMQ vs KafKa를 테스트한 자료가 외국블로그에 소개가 되는글을 우연히 본후 

이 두가지를 동시에 사용하면서 메세지 전송을 위한 작업을 진행해보고자 한다.


그래서 우선 요거부터 기본설치를 한다.


카프카 프로젝트 : http://kafka.apache.org

설치 버전 : 0.9.0.1


* 구성형태


사실 이건 설치고자시고 할것도 없더라.

그냥 바로 사용해되 된다. ㅎㅎ... 우선 나같은 경우는 zookeeper 가 있는 상태이고 사용중이기때문에 (hbase에서) 

그냥 바로 이용한다.


카프카에서는 Topic 이라고 하는가본데 이 Topic 을 등록하고 그 Topic 을 통해서 메세지를 주고받는것인가보더라.


내가 구성한 형태는 아래와 같다.


* 카프카를 주키퍼가 있는 서버에 같이 설치를 했으니 그림은 아래와 같은형태이며 

  주키퍼가 이 카프카들의 통신을 해주는 녀석이 되는것이다.


  아래 은색의 원통이 주키퍼가 되며 

  검은색서버같은게 노드가 되겠다 ㅡ_ㅡ;;; ( 저렇게 링형으로 통신하는거 아님 ;;;;; 그냥 저들끼리 연결대있다 라고 표시만 한거임 )


  실제로는 난 5대만 설치해서 사용한다. 

  (hadoop 과 hbase의 마스터 노드가 1번인지라 1번은 안힘들게하려구 ㅋ )

  

  
















* 설정 


config 디렉토리에 server.properties 을 복사해서 설정파일을 카프카를 설치할 노드수만큼 복사해서 이름을 바꾼다.


참고로난 아래와 같다. 

아래 콘솔 스크린샷을 보면 server1.properties ~ server5.properties5 까지가 보일껀데 

저게 각 5대의 노드에 설정할 설정파일이다. 

server.properties 를 복사해서 설정파일을 저렇게 만들고 각파일을 각노드에 맞게 돌어갈수있게 수정하고 각서버에 복사함.




server.properties  ( 1~5번까지 ) ~ 설정변경한 부분


아래 내용은 2번서버다. ( broker.id는 1,2,3,4,5 각 파일별로 )

port 도 9093 ~ 9097까지 다르게 

host.name은 당연히 각 서버명 

zookeeper.connect 는 주키퍼 연결서버에 맞게. ㅋ 주었다.


broker.id=1 

port=9093

host.name=os2.local

zookeeper.connect=os2.local:2181,os3.local:2181,os4.local:2181,os5.local:2181,os6.local:2181




* 터미널상에서 실행한 명령


Topic 만들기 

[hadoop@os2 config]$ ./kafka-topics.sh --create --zookeeper os2.local:2181 --partitions 20 --replication-factor 5 --topic test2  


각서버 스타트~ 

1번 /apps/kafka/bin/kafka-server-start.sh /apps/kafka/config/server1.properties

2번 /apps/kafka/bin/kafka-server-start.sh /apps/kafka/config/server2.properties

3번 /apps/kafka/bin/kafka-server-start.sh /apps/kafka/config/server3.properties

4번 /apps/kafka/bin/kafka-server-start.sh /apps/kafka/config/server4.properties

5번 /apps/kafka/bin/kafka-server-start.sh /apps/kafka/config/server5.properties



------------------------------------------------------------------------------------------------------------------------------------------


그리고나서 Producer가 될곳 아무데나 프로세스를 띄우고. ( 난 첫번째 서버에서 띄움 )

[hadoop@os2 bin]$ ./kafka-console-producer.sh --broker-list os2.local:9092 --topic test2

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/home/hadoop/classes/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/home/hadoop/classes/logback-classic-1.1.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/apps/kafka/libs/slf4j-log4j12-1.7.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]


이렇게 대기중~



------------------------------------------------------------------------------------------------------------------------------------------


그리고 Consumer 가 될곳도 프로세스를 띄우자 ㅋ 

아래 예제는 다섯번째 서버

[hadoop@os6 bin]$ ./kafka-console-consumer.sh --zookeeper os6.local:2181 --topic test2 --from-beginning

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/home/hadoop/classes/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/home/hadoop/classes/logback-classic-1.1.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/apps/kafka/libs/slf4j-log4j12-1.7.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]


Consumer 가 될놈을 난 예시로 3군데를 띄움 ( 아래 결과 사진 )

그리고 Producer 쪽에서 아무거나 입력을 하면 Consumer 쪽에서 짠짠하고 나온다. ㅋㅋㅋ



* 결과 


 192.168.0.112번이 Producer ( 발송하는놈 ) 가 되고 여기서 메세지를 입력하면 


 나머지 콘솔에서 그대로 출력을 한다. ( 이쪽은 Consumer 라고 부른다. ) 


저작자 표시
신고
Posted by ORACLE,DBA,BIG,DATA,JAVA 흑풍전설

댓글을 달아 주세요

RabbitMQ HelloWorld 를 찍어보기로 한다.

원래 이건 인터넷 서핑중에 우연히 발견한 오픈소스? 이다. 

원래 얼랭을 뒤져보다가. 발견한건데. 메세지 서버로 쓸만하다. 메세지 큐서버 라고 해야하나??? 

아무튼 내가 X라고 보내면 서버에서 메세지를 가지고 있다가 받는쪽에서 X라고 받는 이런형태더라.


아래와 같은 형태로 HelloWorld를 찍기로 했다.


사용한 RabbitMQ 버전 : 3.6.1

Java Client 버전 : 3.6.1 ( 이건 당연히 이클립스에 서버콘솔쪽에 classpath추가함 )

JDK : 1.8



192.168.0.5 : 내가 작업하는 컴퓨터 ( 이클립스에서 Console java 하나 만들어서 실행 )

192.168.0.111 : RabbitMQ 서버가 설치된 서버

Console Result : 192.168.0.111안에 자바로 실행한 결과 받는 콘솔.



https://www.rabbitmq.com/ 에 있는 tutorial 에서 helloworld 를 그대로 실행하면 아래처럼 에러가 날것이다.

Exception in thread "main" com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.

        at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:339)

        at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:716)

        at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:760)

        at mqtest.main(mqtest.java:21)


그도 그럴것이 rabbitmqctl 로 help를 살펴보면 웬 사용자 추가, 호스트설정, 퍼미션 어쩌구 저쩌구등이 있다.

그래서 그것들을 추가함.

대충 그럴듯한것들을 추가해봤다 ㅋㅋ


id : testman 

pw : 1234

vhost : /testhost

퍼미션은 전부를 준것같음 ( 인터넷 구글링 뒤져봤을땐 대충 그런거같음 ㅋㅋ 잘모르니;;; 나중에 자세히 파보면 또기록을 남길예정. ) 

[root@os1 ~]# rabbitmqctl add_user testman 1234

[root@os1 ~]# rabbitmqctl add_vhost /testhost

[root@os1 ~]# rabbitmqctl set_permissions -p /testhost testman ".*" ".*" ".*" 




192.168.0.111에 있는 자바소스 (받을놈)

import java.io.IOException;

import java.util.concurrent.TimeoutException;


import com.rabbitmq.client.ConnectionFactory;

import com.rabbitmq.client.Connection;

import com.rabbitmq.client.Channel;

import com.rabbitmq.client.Consumer;

import com.rabbitmq.client.Envelope;

import com.rabbitmq.client.AMQP;

import com.rabbitmq.client.DefaultConsumer;


public class mqrecv {

  private final static String QUEUE_NAME = "testqueue_namessssssss";


  public static void main(String[] argv)

      throws java.io.IOException,

             java.lang.InterruptedException {


    ConnectionFactory factory = new ConnectionFactory();

         factory.setHost("192.168.0.111");

            factory.setUsername("testman");

            factory.setPassword("1234");

            factory.setVirtualHost("/testhost");

    Connection connection;



        try {

                connection = factory.newConnection();



                Channel channel = connection.createChannel();


            channel.queueDeclare(QUEUE_NAME, false, false, false, null);

            System.out.println(" [*] Waiting for messages. To exit press CTRL+C");




        Consumer consumer = new DefaultConsumer(channel) {

              @Override

              public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)

                  throws IOException {

                String message = new String(body, "UTF-8");

                System.out.println(" [x] Received '" + message + "'");

              }

            };

            channel.basicConsume(QUEUE_NAME, true, consumer);



        } catch (TimeoutException e) {


                e.printStackTrace();

        }



}

}


위에꺼 컴파일 하고 실행하면 아래처럼 나온다.

받을것대기중인상태.




그리고나서~



아래 보내는부분 만들기.


192.168.0.5인 내가 작업하는 곳 이클립스에서 사용한 소스 (보낼놈)


import java.util.concurrent.TimeoutException;


import com.rabbitmq.client.ConnectionFactory;

import com.rabbitmq.client.Connection;

import com.rabbitmq.client.Channel;


public class mqsend {

private final static String QUEUE_NAME = "testqueue_namessssssss";

public static void main(String[] args) throws java.io.IOException 

{

    ConnectionFactory factory = new ConnectionFactory();

    factory.setHost("192.168.0.111");

    factory.setUsername("testman");

    factory.setPassword("1234");

    factory.setVirtualHost("/testhost");

    Connection connection;

try {

connection = factory.newConnection();

Channel channel = connection.createChannel();

    channel.queueDeclare(QUEUE_NAME, false, false, false, null);

    String message = "Hello Ocmpromaster hahahahahahah !!!!!!";

    channel.basicPublish("", QUEUE_NAME, null, message.getBytes());

    System.out.println(" [x] Sent '" + message + "'");

    channel.close();

    connection.close();

    

} catch (TimeoutException e) {

e.printStackTrace();

}

    

}

}


위의 소스를 만들고 실행(메세지보내기) 하면 아래 이클립스 OutPut쪽에 send메세지가 보임.



위의 받는쪽 결과에 메세지에 이클립스에서 보낸 메세지가 바로 보인다 ㅋㅋㅋ~~~~ 오~~~~~~~~~~~~~




이제 이걸로 뭘할까 ㅡ_ㅡ;;;;;;;;;

우선 tutorial 부분몇개보고 내가 테스트중인 6노드 서버에 다 설치를 해서 뭔가를 해볼려고 한다. ~ 뭔가 쓸모가 있을듯. ㅎㅎ...

 

저작자 표시
신고
Posted by ORACLE,DBA,BIG,DATA,JAVA 흑풍전설

댓글을 달아 주세요


티스토리 툴바