반응형
반응형
사용자 정의 플러그인으로 jQeury 확장하기

jQuery를 사용하면 페이지에 특정코드 스타일을 사용하게 되는데, 엘리먼트를 확장 집합의
형태로 표현하고 jQuery 커맨드나 커맨드체인을 확장 집합에 사용하는 코드 스타일을 자주 쓰게 된다. 물론 자신만의 코드를 작성할 때는 마음대로 코드를 작성할 수 있다.

자신만의 코드를 패턴화하여 jQuery 확장으로 만들면 좋은 이유는 사이트 전체에 일관된 코드 스타일을 유지하는데 도움을 주고, 재사용이 가능하며, jQuery 가 제공하는 기반코드를 확용할 수 있다.

플러그인이 다른 jQuery 플러그인이나 자바스크립트 라이브러리와 충돌하지 않고 잘 동작하는지가 확실하게 보장되기 위해 알려진 일반적인 지침을 사용한다.

이름을 충돌하지 않도록 만드는 방법은
* 접두어로 jquery. 를 사용한다.
* 이어서 플러그인 이름을 적는다.
* .js 로 파일 이름을 끝맺는다.
예를 들어서 jquery.ngio.js

 그리고, jQuery 대신 $ 를 사용하는 편이 훨씬 편한데, 충돌을 피하기 위해 $ 대신 jQuery를
사용하는 것이다.  하지만 $ 쪽이 훨신 편리하기에 포기하고 싶지 않다.
그래서, $ 라는 매개변수를 정의한 함수에 jQuery를 전달하면  $는 함수 안에서 jQuery의 참조임이 보장된다.
(function($) {
//
//
//  여시에 플러그인을 정의한다.
//
})(jQuery);'

복잡한 매개변수 목록을 단순하게 만들기.
플러그인은 대부분 매개변수를 몇 개만 요구할 정도로 단순하다. 선택적인 매개변수가 생략되면 적절한 기본값이 제공되며,매개변수가 생략되면 매개변수의 순서에 내포된의미도 변경된다.

    function complex(p1,p2,p3,p4,p5){
이 함수는 매개변수가 5개인데, 이 중에 첫 매개변수를 제외한 모든 매개변수가 선택사항일 경우, 선택적인 매개변수가 너무 많다면 매개변수가 생략되었을 때 호출자의 의도를 합리적으로 추측하기가 어려워진다. 이 함수의 호출자가 마지막 매개변수만 생력했다면 마지막 선택적 인수를 null 값으로 확인할수 있기 때문에 문제되지 않지만,
but 호출자가 p5를 명시하고 p2~p4 까지는 기본값으로 지정하고 싶은 경우엔 호출자는 생략된 매개변수 부분에 생략표시를 하고 다음과 같이 작성해야 한다.
     complex(valueA, null, null, null, valueB);

위와 같은 경우 null 과 매개변수의 순서를 주의깊게 봐야하는 단점이 있다.
일반적으로 이러한 문제를 해결하는 데 선택사항의 해기(option hash)를 많이 사용한다.
 선택사항의 해시를 사용하면 선택적인 매개변수 정보를 이름/값 쌍 형식의 프로퍼티로
가지는 자바스크립트의 Object 인스턴스로 전달한다.
    complex( valueA, { p5:valueB } );
  또는
    comlplex( valueA, {
       p3 : valueC,
       p5 : valueD
    } );

위와 같은 방법을 사용하면 null을 사용하여 생략된 매개변수를 표시할 필요가 없고 매개변수의 개수를 세지 않아도 된다.
필수 매개변수 하나와 선택항목을 여섯 개 가진 복잡한 함수 예제를 다시 살펴보자
    complex(p1, options)
함수 내에서 $.extend() 유틸리티 함수를 사용해 기본값에 전달된 옵션을 합칠 수 있다.
    function comlex( p1, options ){
        var settings = $.extend({
            option1: defaultValue1 ,
           option2: defaultValue2 ,
           option3: defaultValue3 ,
           option4: defaultValue4 ,
           option5: defaultValue5 ,
           option6: defaultValue6 
         , options || { } );
         // 함수의 나머지 부분
    }
settings 변수는 페이지 개발자가 options 매개변수로 전달한 값과 기본값을 합친 값을 가진다. 주목할 점은 ||{}를 사용하여 options 객체가 null이거나 undefined 인지를 확인하고 있다는 것이다. 만약 options 변수가 false라면 (null과 undefined는 조건식에서 false이다) 빈 객체가 사용된다.

ex)
 $.say = function(what) { alert( 'I say ' + what ); }

jQuery.say = function(what) { alert( 'I say ' + what ); }

(function($) {
    $.say = function(what) { alert( 'I say ' + what ); }
}) (jQuery);

## 데이터를 조작하는 유틸 함수 만들기
고정폭으로 숫자 값을 표시하려면 숫자 값과 고정폭 필드(폭은 문자의 수로 정의)에 맞는 형식이 필요하다. 대개 이러함 형식은 값을 고정폭 필드에 우측 정렬시키고 값의 길이와 필드의 길이 차이를 조정하기 위해 채움 문자( fill character )로 앞 여백을 채운다.

함수 문법 : $.toFixedWidth
$.toFixedWidth( value, length, fill )
 : 매개변수 - value (Number) 형식화될 값
                   - length (Number) 결과 필드의 길이
                   - fill (String) 앞 단의 값을 채울 채움 문자, 생략하면 0을 사용한다.

(function($){
    $.toFixedWidth = function( value, length, fill ){
        var result = value.toString();
        if( !fill ) fill = 0;
        var padding = length - result.length;
        if( padding < 0 ){
            result = result.substr(-padding);
        }
        else{
            for(var n = 0; n < padding; n++)
                result = fill + result;
        }
        return result;
    };
})(jQuery);






반응형
반응형
소프트웨어 개발? 웹 사이트 구현? 정도(正道)는 무엇인가?

개발자가 자리에 앉아서 근무하는 시간에 비례해서 개발OUTPUT이 잘 나오는걸까?
근무시간에 비례해 성과가 잘 나온다면 공장에서 단순작업하는 것과 다른 것이 무엇인가?
아침일찍 나와서 밤 늦게 들어가야 일한거 같고, 주말에라도 나와서 책상 차지하고 있어야 열심히 하는 것이라고 믿는다면, 그것이 소위 말하는 개발환경이라는 것인가?
개발에 몸담은지 10년이 다되어 가는데 아직도 그런 마인드가 갑/을을 떠나서 만연해있는데,  소위 요즘 말하는 smart 라는 단어를 사용하기 부끄럽지 아니한가?
UX 라는 말을 잘들 사용하지만, 사용자환경이란 실제 완성된 프로그램 혹은 웹사이트를
사용하게 되는 사용자층을 겨냥해야 하는 것이라 생각하는데  그 사용자층이 되어 보려고
노력은 해봤는지 의문스럽다.

고객이 정말 원하는게 무엇인지 유도해내는 것이 최우선이 아닐까? 그 다음에 구현이 있고~
아키텍쳐라는 개념은 아직 자리잡기 어려운 것일지도 모른다.
문서에 문서를 더하면 프로젝트가 완료되는 것이 아닌데, 문서의 노예가 되어가는 갑/을 구조는 참 2011년, 이 시점에서 너무 잘 어울리는 것일지도 모른다.

실용주의를 생각해야 할 것이다. 언제나 그러하듯 필요에 의해서 세상은 바뀌는것이기때문에~

프로젝트에 필요한건 정확한 일정을 예측해서, 체계적인 개발 방법을 유도하고, 합리적으로 일정을 이끌어 가는 것? ㅎㅎㅎ

반응형
반응형

jQuery Alert Dialogs (Alert, Confirm, & Prompt Replacements)

http://abeautifulsite.net/blog/2008/12/jquery-alert-dialogs/

Overview

This jQuery plugin aims to replace the basic functionality provided by the standard JavaScript alert(), confirm(), and prompt() functions. What’s the benefit of using custom methods? Well, a few good reasons, really.

Implementation

Include the following in the <head> section of your HTML document(s):

<!-- Dependencies -->
<script src="/path/to/jquery.js" type="text/javascript"></script>
<script src="/path/to/jquery.ui.draggable.js" type="text/javascript"></script>
<!-- Core files -->
<script src="/path/to/jquery.alerts.js" type="text/javascript"></script>
<link href="/path/to/jquery.alerts.css" rel="stylesheet" type="text/css" media="screen" />

Make sure you update the path to the respective files. If you are already using the jQuery UI Draggable plugin (including the UI core), simply omit the link to jquery.ui.draggable.js.

For IE to display the dialogs properly, you’ll also need to make sure that you’re using Standards Mode.  Just add the appropriate DTD at the very top of your page:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Usage

This plugin utilizes the $.alerts namespace, but there are three built-in shortcut functions that make implementation easier:

  • jAlert(message, [title, callback])
  • jConfirm(message, [title, callback])
  • jPrompt(message, [value, title, callback])

Unlike their native JavaScript counterparts, you can use HTML in the message parameter. To specify a newline, you can use either \n or <br />.

These methods do not return the same values as confirm() and prompt(). You must access the resulting values using a callback function. (See the demo for more details.)

Compatibility

This plugin requires jQuery 1.2.6 or above and has been tested to work in the following browsers:

  • Internet Explorer 6 & 7
  • Firefox 2 & 3
  • Safari 3
  • Chrome
  • Opera 9

Known Issues

  • ENTER and ESC keys (to accept/cancel) don’t work in WebKit browsers
  • The draggable plugin doesn’t currently work in Opera
  • IE6 acts a bit differently as position: fixed isn’t supported.
반응형
반응형
jQuery는 HTML 문서, 보다 정확하게는 문서 개체 모델(DOM)과 자바스크립트 사이의 상호작용을 간단하게 해주는 오픈 소스 자바스크립트 라이브러리이다.

jQuery는 오픈소스이고, 작으며(최소화버전 18KB),  웹브라우저 간의 차이를 표준화하고, 깔끔한 플러그인 아키텍처를 사용하여 경량으로 제작되었고, 플러그인의 자료실(http://plugin.jquery.com)은 광범위하며, 출시 이후 꾸준히 성장하고 있다.
API는 인라인 코드 예제를 포함하여 완전하게 문서화되어 있고, 몇년동안이나 훌륭하게 유지되고 있으며, 상당히 친화적(다른 자바스크립트 라이브러리와의 충돌을 피하는 여러방법을 제공한다. ) 이다.
커뮤니티 지원은 여러 메일링 목록, IRC 채널 그리고 jQuery 커뮤니티의 수 많은 튜토리얼, 아티클, 그리고 플로그의 포스트들을 포함하기에 실제로 꽤 유용하다.
공개적으로 개발되고 있으며, jQuery 개발팀이 업데이트에 대한 출시를 두려워하지 않기 때문에 꾸준하고 일관적이다.
큰 조직(예를 들어 Microsoft, Dell, CBS...)에서 jQuery를 사용하는 것은 꾸준히 늘어날 것이며, 오래도록 지속될 것이다.
브라우저보다도 앞서 W3C의 명세를 수용하고 있다. 일례로 CSS3 셀렉터의 대부분을 지원한다.
최신 브라우저에서 개발을 위한 테스트 및 최적화를 수행하였다.
개발자뿐만 아니라 디자이너에게도 상당히 강력하다. 차별적이지 않다.
자바스크립트의 작성 방식을 바꾸고 있는 jQuery의 간결함, 방법론 그리고 철학은 그 자체가 표준이 되어가고 있다.

jQuery 철학
- "Write less, do more(적게 작성하고, 보다 많이 한다. )"
* 몇몇 요소를 찾아서 (CSS Selector 를 이용해서)  그들로 어떤 작업을 수행한다.(jQuery 메서드를 사용하여).
* 요소의 집합에 대해 여러 jQuery  메서드를 체인으로 연결한다.
* jQuery 래퍼와 암시적인 반복을 사용한다.
반응형
반응형
이미 2009년에 클라우드에 대한 얘기는 했었는데, 인지를 못하고 있다가 지금 보니 이미 옆에 와있군.  클라우드 서비스 업체인 클루넷이 주가가 오르니 안오르니 그런 얘기가 오갔었는데 ㅋㅋㅋ
관심을 가져봐야 할껀 Hadoop 이 아닐까 한다. 뭔지는 잘 모르겠다고 생각하겠지만, 결국 나중엔 우리 옆에서 가장 많이 사용되는 것 중의 하나가 될지도 모르니 말이다.

클라우드 컴퓨팅 입문


클라우드 컴퓨팅은 일종의 컴퓨팅 솔루션으로 이 솔루션을 이용하면 사용자가 기술이나 서비스를 이용하여 액세스하는 방법에 관계없이 직접 연결이나 LAN, WAN 또는 인터넷을 통해 필요에 따라 온 디맨드 형태로 실제 자원이나 가상의 자원 그리고 전용 자원이나 공유 자원 형태의 컴퓨팅 자원을 액세스할 수 있습니다. 클라우드는 고객이 필요할 때 필요한 만큼 자원을 얻을 수 있게 하는 셀프 서비스 인터페이스라고 할 수 있습니다. 또한, 클라우드는 기능이 강화되고 있는 서버와 가상화 기술을 활용하는 IT 서비스를 구축하는 데 필요한 기본적인 개념이기도 합니다.

클라우드 컴퓨팅의 중요성은 인프라에 대한 투자 비용을 절약하고 애플리케이션의 개발과 배치에 소요되는 시간을 줄이며 자원 할당과 관련된 오버헤드를 낮출 수 있는 클라우드의 잠재력에 있습니다.

사설 클라우드와 공용 클라우드의 차이점은 무엇입니까? 그리고 하이브리드의 개념은 무엇입니까?

일반적으로 공용(외부) 클라우드는 회사의 방화벽 외부에 존재하는 환경을 말합니다. 공용 클라우드는 써드파티 벤더에서 제공하는 서비스일 수 있습니다. 또한, 셀프 서비스 포탈을 통해 관리되는 가상화된 공유 인프라라고 할 수 있습니다.

사설(내부) 클라우드는 공용 클라우드의 서비스 제공 모델과 동일하지만 방화벽 뒤에서 조직과 그 고객만을 위해 서비스를 제공합니다. 수집할 IT 인프라 자원이 내부에 있는 경우에도 셀프 서비스 관리 인터페이스는 계속해서 역할을 수행합니다.

하이브리드 클라우드 환경에서는 외부 서비스를 활용하여 내부 클라우드를 확장하거나 보완합니다.

클라우드 컴퓨팅은 SaaS(Software-as-a-Service), IaaS(Infrastructure-as-a-Service) 및 PaaS(Platform-as-a-Service)와 같은 것입니까?

웹상에서 제공되는 소프트웨어 애플리케이션인 SaaS(Software-as-a-Service)를 클라우드 컴퓨팅의 서브세트로 생각하는 사람들이 업계에서 많아지고 있습니다. 그리고 원격으로 액세스할 수 있는 서버와 스토리지 용량을 의미하는 IaaS와 개발자가 호스트 인프라에서 웹 애플리케이션을 빌드하고 전개할 수 있게 도움을 주는 PaaS에 대해서도 이와 같이 생각할 수 있습니다.

클라우드 컴퓨팅을 자세히 배울 수 있는 곳은 어디입니까?

기술 자료, 튜토리얼, 데모 및 기타 참고자료는 먼저, 참고자료 및 이벤트 탭을 확인하십시오. 그런 다음, My developerWorks를 이용하는 동료와 협력하여 축적한, 다양한 클라우드 컴퓨팅 관련 대화식 지식을 살펴보십시오.

클라우드에서는 어떤 유형의 애플리케이션을 실행할 수 있습니까?

클라우드에서는 어떤 애플리케이션이든지 실행할 수 있지만 그렇다고 해서 모든 애플리케이션을 클라우드에서 실행해야 하는 것은 아닙니다. 데스크탑이나 워크스테이션에 상주해 있으면서 사용자에게 도움을 주는 시스템 분석 도구나 조각 모음 유틸리티와 같은 소프트웨어는 로컬에 남겨두는 편이 더 좋습니다. 또한, 중요한 고객 데이터는 공용 클라우드에 두지 말아야 합니다.

클라우드는 IT 관리, 비즈니스 및 생산성, 개발 및 배치, 용량(서버 및/또는 스토리지) 그리고 협업을 처리하는 애플리케이션에 적합합니다.

클라우드 간에 애플리케이션을 이동할 수 있습니까?

그렇습니다. 그러나 클라우드 벤더가 표준 기술을 채택하여 난이도가 높은 태스크가 아니라 쉽게 수행할 수 있는 조작을 이동할 수 있는 자유와 상호 운용성을 확보해야 한다는 점을 유의해야 합니다. 다음 세 가지 참고자료는 클라우드 컴퓨팅 표준에 참여할 수 있게 도움을 줍니다.

IBM에는 클라우드가 있습니까? 현재 사용 가능한 클라우드 컴퓨팅 플랫폼은 어떤 것입니까?

IBM에서는 신속하고 비용 면에서 효과적인 개발과 테스트를 지원하도록 설계된 전체적인 컴퓨팅 옵션을 제공합니다. 예:

클라우드 컴퓨팅을 개발하고 설계하는 데 도움을 줄 수 있는 제품, 기술 및 서비스는 무엇입니까?

IBM에서는 클라우드 애플리케이션을 개발하고 시스템을 관리하는 데 사용할 수 있는 다양한 제품과 기술을 제공합니다. Products 탭에서 사용 가능한 클라우드 레디 제품의 목록을 확인하고 바로 몇 가지 제품을 다운로드하십시오.

클라우드 애플리케이션 개발과 관련된 기본적인 기사가 있습니까?

물론 있습니다. 먼저, 다음과 같은 기사를 확인하십시오.

_M#]



Linux와 Apache Hadoop을 사용한 클라우드 컴퓨팅

http://www.ibm.com/developerworks/kr/library/au-cloud_apache/index.html

클라우드 컴퓨팅 소개

최근에는 클라우드 컴퓨팅에 관한 선전이 증가하고 있으며 이러한 현상은 IT 산업에 대한 앞으로의 경향을 보여준다. 간단히 말해서 클라우드 컴퓨팅은 외부 환경에서 서비스 형태로 제공되는 확장 가능한 컴퓨팅 리소스를 사용량에 따라 요금을 지불하는 방식으로 사용하는 것이라고 정의할 수 있다. 인터넷을 통해 "클라우드"에 있는 모든 리소스를 액세스할 수 있으며 컴퓨팅 능력, 대역폭, 스토리지, 보안 및 신뢰성에 관해 걱정할 필요가 없다.

이 기사에서는 가상 Linux® 서버를 임대할 수 있는 Amazon EC2와 같은 클라우드 컴퓨팅을 간략하게 소개한 후 가상 Linux 서버에 구축하여 클라우드 컴퓨팅 프레임워크를 설정할 수 있는 오픈 소스 MapReduce 프레임워크인 Apache Hadoop을 소개한다. 그러나 벤더에서 호스트하는 VM에서만 Hadoop을 전개할 수 있는 것은 아니며 사용자는 실제 시스템에서 실행되는 일반 Linux OS에서 Hadoop을 전개할 수 있다.

Apache Hadoop을 자세히 살펴보기 전에 클라우드 컴퓨팅 시스템의 구조에 대해 간략히 소개한다. 그림 1에는 클라우드 컴퓨팅의 계층과 기존의 몇 가지 오퍼링이 표시되어 있다. 클라우드 컴퓨팅의 계층에 관한 자세한 사항은 참고자료 섹션을 참고한다.

IaaS(Infrastructure-as-a-Service)와 같은 인프라스트럭처는 인프라스트럭처(컴퓨팅 리소스 및 스토리지)를 서비스 형태로 임대하는 것을 말한다. IaaS에는 서비스 품질에 특정한 제한조건(특정 운영 체제 및 소프트웨어를 실행할 수 있는 기능)을 두고 컴퓨터나 가상 호스트 또는 데이터 센터를 임대할 수 있는 기능이 있다. Amazon EC2는 이러한 계층에서 IaaS로서 역할을 하여 사용자에게 가상 호스트를 제공한다. 이러한 플랫폼(Platform-as-a-Service 또는 PaaS)에서는 인프라스트럭처에서 "클라우드" 컴퓨팅에 API 기능을 제공하는 서비스나 소프트웨어 프레임워크에 집중한다. Apache Hadoop은 PaaS로서 역할을 하며 가상 서버에서 클라우드 컴퓨팅 플랫폼으로 구축된다.


그림 1. 클라우드 컴퓨팅과 기존 오퍼링으로 구성된 계층
클라우드 컴퓨팅의 다양한 계층 보기

Amazon EC2

Amazon EC2는 사용자가 가상 시스템을 다양한 기능(CUP, 디스크, 메모리 등)과 함께 요청할 수 있는 웹 서비스이다. 사용자는 컴퓨터를 사용한 시간에 대해서만 비용을 지불하며 호스팅 작업은 Amazon에서 처리한다.

이러한 인스턴스 즉, AMI(Amazon Machine Image)는 Linux를 기반으로 하며 원하는 모든 애플리케이션이나 소프트웨어를 실행할 수 있다. Amazon에서 서버를 임대한 후에야 일반 SSH 도구를 사용하여 연결을 설정하여 해당 서버를 실제 서버처럼 조작할 수 있다.

이 기사에서는 EC2를 자세히 소개하지 않는다. 추가 정보는 참고자료 섹션을 참고한다.

Hadoop 클라우드 컴퓨팅 프레임워크에 대한 베스트 프랙티스는 AMI에서 이 프레임워크를 전개하는 것이며 컴퓨팅 기능, 대역폭, 스토리지 등이 문제가 되지 않는다면 AMI을 통해 클라우드 기능을 활용할 수 있다. 그러나 Hadoop은 클라우드 솔루션에서만 전개되는 것이 아니므로 이 기사의 다음 부분에서는 로컬에서 호스트되는 Linux 서버의 VMware 이미지에서 Hadoop을 구축한다. 그전에 Apache Hadoop을 간단히 소개한다.


Apache Hadoop

Apache Hadoop은 대량의 데이터를 분산 처리할 수 있는 소프트웨어 프레임워크(플랫폼)이다. 2006년에 도입되었으며 Google, Yahoo! 및 IBM 등에서 지원한다. 이 Apache Hadoop을 PaaS 모델로 생각할 수도 있다.

디자인의 핵심은 MapReduce를 구현했다는 점과 MapReduce(Google의 자료에서 소개됨)와 Google File System에서 영향을 받은 HDFS(Hadoop Distributed File System)에 있다.

MapReduce

MapReduce는 Google에서 도입한 소프트웨어 프레임워크로 컴퓨터 클러스터나 노드 클러스터에서 대용량 데이터 세트 분산 컴퓨팅을 지원한다. MapReduce에는 Map 프로세스와 Reduce 프로세스가 결합되어 있다.

Map 프로세스에서는 마스터 노드가 작업을 입력 받아서 더 작은 하위 작업으로 나눈 후 작업자 노드에 분배한다.

작업자 노드는 이러한 하위 작업을 처리한 후 그 결과를 다시 마스터 노드에 전달한다.

그러면 Reduce 프로세스에서 마스터 노드가 모든 하위 작업의 결과를 받아서 서로 결합시켜 원래 작업의 결과인 출력을 얻는다.

MapReduce 플로우에 관한 개념은 그림 2를 참조한다.

MapReduce의 장점은 맵과 리덕션 조작을 분산 처리할 수 있다는 점이다. 각 맵핑 조작은 독립적이기 때문에 모든 맵은 병렬로 실행될 수 있으며 따라서 총 컴퓨팅 시간을 줄일 수 있다.

HDFS

HDFS에 대한 자세한 소개와 이 파일 시스템을 조작하는 방법은 이 기사에서 다루지 않는다. 추가 정보는 참고자료 섹션을 참조한다.

일반 사용자 관점에서 보면 HDFS는 기존 파일 시스템과 동일하다. 특정 디렉토리 경로를 사용하여 파일에 CRUD 조치를 실행할 수 있다. 그러나 분산 스토리지의 특성으로 인해 각각 역할이 다른 "NameNode"와 "DataNode"가 있다.

NameNode는 DataNode의 마스터이다. NameNode는 HDFS 내에서 메타데이터 서비스를 제공한다. 메타데이터는 DataNode의 파일 맵핑을 표시한다. 또한 조작 명령을 승인하고 어느 DataNode가 조작과 복제를 실행해야 하는지 결정한다.

DataNode는 HDFS의 스토리지 블록으로 동작한다. 또한 NameNode에서 수신된 블록을 작성하고, 삭제하거나 복제하는 명령에 응답한다.

JobTracker 및 TaskTracker

애플리케이션을 실행할 때에는 HDFS에 있는 입력과 출력 디렉토리를 함께 제공해야 한다. JobTracker는 MapReduce 애플리케이션을 실행하기 위한 단일한 제어점으로, 작성될 TaskTracker와 종속 작업의 수를 결정하여 각 하위 작업을 TaskTracker에 할당한다. 각 TaskTracker가 상태를 보고하면 완료된 작업은 JobTracker로 돌아간다.

일반적으로 하나의 마스터 노드가 NameNode와 JobTracker로 동작하며 슬레이브 노드는 DataNode와 TaskTracker로 동작한다. Hadoop Cluster에 대한 개념과 MapReduce에 대한 흐름이 그림 2에 표시되어 있다.


그림 2. Hadoop Cluster에 대한 개념 및 MapReduce 흐름
Hadoop Cluster의 개념

Apache Hadoop 설정하기

이제 Linux VM에서 Apache Hadoop Cluster를 설정한 후 Apache Hadoop Cluster에서 MapReduce 애플리케이션을 실행한다.

Apache Hadoop은 다음과 같은 세 가지 개발 모드를 지원한다.

  • 독립형 모드: 기본적으로 Hadoop은 비분산 독립형 모드로 실행하도록 구성한다. 이 모드는 애플리케이션을 디버그하기가 유용하다.
  • 의사 분산 모드: 또한 Hadoop은 단일 노드 의사 분산 모드로 실행할 수 있다. 이 경우에 각 Hadoop 디먼은 개별 Java™ 프로세스로 실행된다.
  • 완전 분산 모드: Hadoop은 다른 호스트에 구성되며 클러스터로 실행된다.

Hadoop을 독립형이나 의사 분산 모드로 설정하려면 Hadoop 웹 사이트의 참고자료를 참조한다. 이 기사에서는 완전 분산 모드에서 Hadoop을 설정하는 과정만을 다룬다.

환경 준비

이 기사에서는 세 대의 GNU/Linux 서버가 필요하며 한 대는 마스터 노드로 동작하며 다른 두 대는 슬레이브 노드이다.


표 1. 서버 정보
서버 IP 서버 호스트 이름 역할
9.30.210.159 Vm-9-30-210-159 마스터(NameNode 및 JobTracker)
9.30.210.160 Vm-9-30-210-160 슬레이브 1(DataNode 및 TaskTracker)
9.30.210.161 Vm-9-30-210-161 슬레이브 2(DataNode 및 TaskTracker)

각 시스템에 Hadoop 바이너리와 Java SE 6를 설치해야 한다. 자세한 정보는 참고자료 섹션을 참조한다. 이 기사에서는 Hadoop 버전 0.19.1을 사용한다.

또한 SSH를 설치하고 각 시스템에서 sshd를 실행해야 한다. SUSE 및 RedHat과 같은 일반적인 Linux 릴리스를 설치하면 이러한 것들이 기본적으로 설치된다.

통신 설정

/etc/hosts 파일을 갱신하고 IP와 호스트 이름을 사용하여 세 대의 시스템이 서로 연결되는지 확인한다.

Hadoop 마스터 노드는 SSH를 사용하여 슬레이브 노드와 통신하기 때문에 마스터 노드와 슬레이브 노드 간에 암호가 필요없는 인증된 SSH 연결을 설정해야 한다. 각 시스템에서 다음 명령을 실행하여 RSA 공용 키와 개인용 키를 생성한다.

	ssh-keygen –t rsa 

이렇게 하면 /root/.ssh 디렉토리 밑에 id_rsa.pub가 생성된다. 마스터 노드의 id_rsa.pub를 59_rsa.pub로 이름을 바꾸고 슬레이브 노드로 복사한다. 그런 다음 명령을 실행하여 마스터 노드의 공용 키를 슬레이브 노드의 인증된 키에 추가한다.

	cat /root/.ssh/59_rsa.pub >> /root/.ssh/authorized_keys 

이제 SSH를 사용하여 슬레이브 노드로 연결한다. 암호를 입력하지 않아도 연결이 되어야 한다.

마스터 노드 설정

<Hadoop_home>/conf/ 디렉토리 밑에 있는 해당 구성 파일을 구성하여 완전 분산 모드에서 작업하도록 Hadoop을 설정한다.

hadoop-site.xml 파일에서 Hadoop 전개를 구성한다. 이렇게 구성하면 hadoop-default.xml에 구성된 내용은 무시된다.

표 2. 구성 등록 정보
등록 정보 설명
fs.default.name NameNode URI
mapred.job.tracker JobTracker URI
dfs.replication 복제 수
hadoop.tmp.dir Temp 디렉토리

hadoop-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://9.30.210.159:9000</value>
  </property>
  <property>
    <name>mapred.job.tracker</name>
    <value>9.30.210.159:9001</value>
  </property>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/root/hadoop/tmp/</value>
  </property>
</configuration>

hadoop-env.sh 파일을 구성하여 JAVA_HOME을 지정한다. 해당 라인을 코멘트 아웃하고 JAVA_HOME 디렉토리를 지정한다.

	export JAVA_HOME=<JAVA_HOME_DIR>

마스터 노드의 IP 주소를 마스터 파일에 추가한다.

9.30.210.159

슬레이브 노드의 IP 주소를 슬레이브 파일에 추가한다.

	9.30.210.160
	9.30.210.161


슬레이브 노드 설정

SCP나 기타 복사 유틸리티를 사용하여 hadoop-site.xml, hadoop-env.sh, masters 및 slaves를 각 슬레이브 노드로 복사한다.

HDFS 포맷하기

다음 명령을 실행하여 Hadoop 분산 파일 시스템을 포맷하여 초기화한다.

	<Hadoop_home>/bin/hadoop namenode -format

Hadoop Cluster를 확인한다.

이제 bin/start-all.sh를 사용하여 Hadoop Cluster를 시작한다. 그러면 마스터 노드와 슬레이브 노드에 몇 가지 로그가 출력된다. 이 로그를 검증하여 모든 사항이 올바른지 확인한다. 오류가 있으면 HDFS를 포맷하여 hadoop-site.xml 파일에 지정된 Temp 디렉토리를 지우고 다시 시작한다.

다음 URL에서 마스터 노드와 슬레이브 노드가 이상이 없는지 확인한다.

NameNode: http://9.30.210.159:50070
JobTracker: http://9.30.210.159:50030

클라우드에서 Hadoop Cluster를 설정했으므로 이제 MapReduce 애플리케이션을 실행할 차례이다.

MapReduce 애플리케이션을 작성한다.

MapReduce 애플리케이션은 "Map"과 "Reduce"의 특성을 갖고 있어야 하며 이는 작업을 더 작은 부분으로 나누어 병렬로 처리할 수 있다는 것을 의미한다. 그런 다음 각 하위 작업의 결과가 정리되어 원래의 작업에 대한 결과가 작성된다. 이에 대한 예로 웹 사이트 키워드 검색을 들 수 있다. 검색 및 그래빙 작업은 분할되어 슬레이브 노드에 위임되며 그 후에 각 결과가 집계되어 마스터 노드에서 최종 결과가 출력된다.

샘플 애플리케이션 실행하기

Hadoop에는 테스트용 샘플 애플리케이션이 있다. 이 중에는 여러 개의 파일에서 특정 단어의 빈도 수를 세는 단어 계수기가 있다. 이 애플리케이션을 실행하여 Hadoop Cluster를 확인한다.

먼저 conf/ 디렉토리 밑에 있는 input 파일을 분산 파일 시스템에 삽입한다. 그런 다음 이 파일에서 단어 수를 센다.

$ bin/hadoop fs –put conf input 

그런 다음 샘플 애플리케이션을 시작하여 "dfs"로 시작하는 단어의 빈도 수를 계산한다.

$ bin/hadoop jar hadoop-*-examples.jar grep input output 'dfs[a-z.]+'

이 명령은 Map과 Reduce 프로세스를 출력한다.

앞에 있는 두 명령을 실행하면 HDFS 밑에 "input"과 "output" 디렉토리가 생성된다. 다음 명령을 사용하면 이 디렉토리가 표시된다.

$ bin/hadoop fs –ls

분산 파일 시스템에서 출력된 파일을 보자. 이 파일에는 "dfs"로 시작하는 단어의 빈도 수가 키 값 쌍으로 표시되어 있다.

$ bin/hadoop fs -cat ouput/*

이제 JobTracker 사이트에서 완료된 작업 로그를 확인한다.

Log Analyzer MapReduce 애플리케이션 작성하기

이제 Hadoop의 WordCount 애플리케이션과 유사한 IBM WebSphere® Portal v6.0 Log Analyzer 애플리케이션을 작성한다. 이 분석기는 IBM WebSphere Portal v6.0의 모든 SystemOut*.log 파일을 분석하여 특정 기간에 이 Portal에서 애플리케이션이 실행된 횟수를 표시한다.

Portal 환경에서는 모든 로그가 5MB로 분할되어 몇 개의 노드에서 병렬로 분석된다.


hadoop.sample.PortalLogAnalyzer.java
public class PortalLogAnalyzer {
	
public static class Map extends MapReduceBase 
	implements Mapper<LongWritable, Text, Text, IntWritable> {

	private static String APP_START_TOKEN = "Application started:";
	 private Text application = new Text();
		
	 public void map(LongWritable key, Text value, 
		 OutputCollector<Text, IntWritable> output, 
		Reporter reporter) throws IOException {
			 
	    String line = value.toString();
	    if(line.indexOf(APP_START_TOKEN) > -1) {
		int startIndex = line.indexOf(APP_START_TOKEN);
		startIndex += APP_START_TOKEN.length();
		String appName = line.substring(startIndex).trim();
		application.set(appName);
		output.collect(application, new IntWritable(1));
	    }
	}
}
	
public static class Reduce extends MapReduceBase 
	    implements Reducer<Text, IntWritable, Text, IntWritable> {
		
	public void reduce(Text key, Iterator<IntWritable> values, 
		OutputCollector<Text, IntWritable> output, 
		Reporter reporter) throws IOException {
	
	    int sum = 0;
	    while(values.hasNext()) {
		sum += values.next().get();
	    }
	    output.collect(key, new IntWritable(sum));
	}
}
	
public static void main(String[] args) throws IOException {
	JobConf jobConf = new JobConf(PortalLogAnalyzer.class);
	jobConf.setJobName("Portal Log Analizer");
	jobConf.setOutputKeyClass(Text.class);
	jobConf.setOutputValueClass(IntWritable.class);
	jobConf.setMapperClass(Map.class);
	jobConf.setCombinerClass(Reduce.class);
	jobConf.setReducerClass(Reduce.class);
	jobConf.setInputFormat(TextInputFormat.class);
	jobConf.setOutputFormat(TextOutputFormat.class);
		
	FileInputFormat.setInputPaths(jobConf, new Path(args[0]));
	FileOutputFormat.setOutputPath(jobConf, new Path(args[1]));
	JobClient.runJob(jobConf);
}
}

Hadoop API에 대한 자세한 설명은 Hadoop 사이트의 API 문서를 참조한다. 다음은 간단한 설명이다.

Map 클래스에서는 로그 파일의 각 라인을 분석하여 애플리케이션의 이름을 가져오는 맵 함수를 구현한다. 그런 다음 애플리케이션의 이름을 키 값 쌍으로 출력 콜렉션에 삽입한다.

Reduce 클래스는 키 또는 애플리케이션 이름이 동일한 모든 값을 합한다. 그러면 이 애플리케이션은 Portal에서 각 애플리케이션이 시작된 횟수를 표시하는 키 값 쌍을 출력한다.

Main 함수는 MapReduce 작업을 구성하고 실행한다.

PortalLogAnalyzer 실행하기

먼저, Java 코드를 마스터 노드로 복사한 후 이 코드를 컴파일한다. Java 코드를 <hadoop_home>/workspace 디렉토리로 복사한다. 이 코드를 컴파일하여 나중에 Hadoop 명령을 사용하여 실행할 수 있도록 Jar 파일로 아카이브한다.

$ mkdir classes
$ javac –cp ../hadoop-0.19.1-core.jar –d classes
			hadoop/sample/PortalLogAnalyzer.java
$ jar –cvf PortalLogAnalyzer.jar –C classes/ .

Portal의 로그를 workspace/input으로 복사한다. 2009년 5월의 모든 로그를 포함하고 있는 몇 개의 로그 파일이 있다고 가정한다. 이 로그를 HDFS에 가져다 놓는다.

$ bin/hadoop fs –put workspace/input input2

PortalLogAnalyzer를 실행하면 출력에 Map과 Reduce의 프로세스가 표시된다.

$ bin/hadoop jar workspace/PortalLogAnalizer.jar hadoop.sample.PortalLogAnalizer input2 
     output2


그림 3. 작업의 출력
$ bin/hadoop jar workspace/PortalLogAnalizer.jar hadoop.sample.PortalLogAnalizer input2       output2

애플리케이션이 종료하면 아래 그림 4와 같은 내용이 출력된다.

$ bin/hadoop fs –cat output2/*


그림 4. 부분 출력
$ bin/hadoop fs –cat output2/*

JobTracker 사이트에서 또 다른 완료된 작업을 확인할 수 있다. 그림 5의 마지막 라인에 유의한다.


그림 5. 완료된 작업
또 다른 완료된 작업


_M#]




반응형
반응형

json text를 json object로 바꿀때.

Json.parse() 를 사용한다. 단, json2.js 가 필요하다.

json.stirngify()는 오브젝트를 텍스트로 변환한다.

반응형

+ Recent posts