스마트에너지 프로파일(SEP) 2.0 표준

표준
내용
- 스마트 미터, IHD, HEMS 등 전기 설비 장치 및 스마트 가전 간 상호호환을 위하여 표준화된 장치 정의 및 장치 간 통신을 위한 인터페이스를 제공
- 보안, 서비스 탐색, 장치의 전원 및 네트워크 상태, 수요 반응 및 부하 제어, 전력 측정, 요금 계산, 청구 및 지불 등의 다양한 응용 계층 메시지 규격을 정의하고 있어 계량기 원격 검침뿐만 아니라 기기의 에너지 수요 제어, 실시간 요금 정보와 같은 서비스의 제공에도 사용이 가능
추진
현황
- ZigBee Alliance와 HomePlug Powerline Alliance에 의해 주도되어 개발됨
- 2011년 8월부터는 공동 인증 및 시험 프로그램 개발을 위한 컨소시엄에 Wi-Fi Alliance 및 HomeGrid Forum도 참여하고 있음
- 2013년 2월 현재 Revision 0.9, Version R32의 draft가 나온 상태임 

디바이스상에서 기능셋과 그들의 리소스들은 HTTP URLs 를 통해 접근되어진다. 이런 디바이스들은 DNS-SD 나 mDNS 같은 기술을 사용하여 네트워크상에서 동적으로 주변의 서비스들을 탐색한다. 그리고 그들 자신을 SEP 2.0 기능셋을 구현한 리소스에 접근하기위해 스스로 등록한다. 

스마트 에너지 디바이스간에 진정한 상호작용할수있는 에코시스템을 제공하기위해 TCP/UDP 와 IP-Based 네트워킹의 사용은 필수적이다. 또한 외부 네트워크에 노출된 취약점이 있기때문에 디바이스간의 보안에 관한것도 중요하다. 



http://www.ksga.org/sub3/pds_read_newsletter.asp?ID=2284&read=143&article4=1&ForumID=0&kind=4  참고

http://www.csee.org.cn/Portal/zh-cn/Publications/atm/docs-13-0200-00-sep2-smart-energy-profile-2.pdf.pdf   스펙문서


Smart Energy Profile 2.0 (SEP2) 는 국제표준으로서, 홈 / 비지니스 부분의 에너지 디바이스에 대해 스마트 그리드 서비스를 제공하는  IP 기반의 어플리케이션 프로토콜 명세이다. 


Kitu 시스템이 제공하는 SEP2 스택 :

  • Small footprint   (공간을 적게 차지하며)
  • Flexible – robust API’s   (유연성있고 강력한 API 제공)
  • Hardware, PHY, OS agnostic   (모든 하드웨어 , OS 등에서 사용가능) 
  • Feature rich application environment and services simplifying application development and speeding TTM (개발이 쉽고,시장에 빠르게 진입할수있게함) 

Kitu 의 SEP2 스택은 가장 완벽하며 , 테스트되어있고 ,넓게 적용될수있으며 성숙된 SEP2
스택을 제공합니다.

SEP2 코어 



1. IP 기반으로 다양한 물리적 인터페이스 (Ethernet, Wi-Fi, ZigBee, PLC, 등) 에서 작동.

2. 표준 HTTP/HTTPS 방식과 XML/EXI 정의를  사용한 Restful 서버/클라이언트 아키텍쳐.

3. mDNS  기반 서비스 디렉토리를 사용하여  복잡한 설정을 제거.

(역주: mDNS
Rendezvous, Bonjour 혹은 mDNS라 불리는 기술은 근거리 망에서 각 노드상의 서비스를 발견할 수 있도록 알리는 방식을 정의한다. 리눅스에서는 그 구현체로 Avahi가 쓰이고 있다. (과거 구현체인 Howl과도 호환된다)애플 쪽에서 이걸 잘 쓰고 있는데 가령 iTunes에서 공유를 걸면 네트워크 안의 다른 아이튠즈에서 그 공유를 알아챌 수 있게 되어 있다.)

(역주: WiFi-Direct 는 기존의 uPNP 프로토콜이나  iOS 의 Bonjour 프로토콜을 사용하여 서로를 인증한다.

  uPNP, Bonjour 는  Multicase UDP 통신을 통해 기기를 검색하고 인증한다.)

4. ECC 기반 암호수트를 사용하여 높은 보안성 제공.

(역주: ECC 타원곡선기반 암호화,웹상의 자료들을 살펴보니 ECC가 분명히 RSA보다 상대적으로 안전한 알고리즘이라는 의견이 지배적입니다. 그러나 상대적으로 복잡하고 실제 구현을 위해 전문 지식이 필요하여 업계 전반으로 확대되는 데에는 많은 시간이 필요하다고 합니다. 또한, 특정 타원 곡선 유형에서는 쉽게 풀리는 문제점이 지적되고 있습니다.  


위키피디아에 소개된 ECC 관련 보안 위협 사례가 몇 가지 있습니다. 
  • 2010년 12월 소니는 PlayStation3에 ECDSA 개인키가 해킹되었으며, 잘못된 알고리즘 사용이 원인이였습니다. 
  • 2011년 3월 29일 서버의 TLS 개인키가 노출될 수 있는 가능성이 제기되어 OpenSSL 1.0.0e에서 수정되었습니다. 
  • 2013년 8월 자바 SecureRandom 클래스의 결함이 발견되었습니다.

현재 국가에서 진행중인 행정기관 인터넷 전화 보안의 기기인증 부문에서는 ECC와 RSA를 동시에 사용할 수 있도록 규정되어 있습니다. 또한, 무선 분야나 USN 분야에서는 ECC가 매우 효과적입니다. ECC의 짧은 키길이로 인해 기존 RSA보다 훨씬 짧은 시간에 키 생성 및 교환이 가능하기 때문입니다 )

기능성


수요조절, 과금, 미터링, 메세징, 흐름 예약, 분산 에너지 리소스 (DER), 빌링,  선불 및 확장


     KITU SEP2 스택 


1. Kitu 시스템은  클라이언트/서버에 대해  완전한  end-to-end SEP2 프로토콜 스택을 제공합니다. SEP2 통신 을 완전히 추상화 하였으며,  많은 프로토콜을 지원하는 어플리케이션으로 빠르게 시장에 진입할수있도록 도와줍니다. (protocol agnostic applications)

agnostic 의미 : http://whatis.techtarget.com/definition/agnostic

2. 많은 예제와 잘 구축된 문서

3. 적은 프로세서, 램을 요구하며 임베디드 RTOS 라든지 리눅스에서 돌아가는 게이트웨이 디바이스등 저전력디바이스에서도 작동합니다.

4. 엣지디바이스,게이트웨이/라우터,클라우드등에서 돌아가는 유연성 

5. 스마트한 엔드노드 어플리케이션 서비스를 제공합니다.그것은 멀티서버를 제공하는것을 포함하여 어플리케이션 개발을 단순화합니다.


            플랫폼  & 도구


Support for a wide range of standard and implementation-specific platforms.

Kitu Systems own platform modules also available for very constrained devices.

Powerful and flexible debug and monitoring tools for control, debug, logging and regression testing


Vert.x 클러스터링 (여러 머신상에서 vert.x 인스턴스끼리 데이터공유) 을 할때 대해서 정리


1. ClusterManager 를 사용한다.

ClusterManager clusterManager = ((VertxInternal)vertx).clusterManager();
Map map = clusterManager.getSyncMap("mapName"); // shared distributed map


뒤에 Hazelcast IMap 을 사용하게된다. -cluster  파라미터와 헤즐케스트에 대한 설정을 했다고 가정한다.

이것은 내부 API 로서 사용되므로 ,일반적으로 제품에 대해서 추천하지 않는다. 테스트용으로는 괜찮을지도.


2. 헤즐케스트를 적극적으로 사용한다.

Hazelcast 를 워커버티클에서 직접적으로 접근해서 사용하라 Hazelcast 의 정적함수를 이용.

    Set<HazelcastInstance> instances = Hazelcast.getAllHazelcastInstances();
    HazelcastInstance hz = instances.stream().findFirst().get();
    Map map = hz.getMap("mapName"); // shared distributed map


주의 : . 헤즐케스트 API 는 블러킹되기때문에 워커버티클에서만 사용하라


3. Vert.x 2 버전은 클러스터 공유데이터를 지원하지 않는다. Vert.x 3 부터는  헤즐케스트 클러스터 매니저를

감싼 비동기 api 를 통해서 지원한다. (비동기에 유념하라)  


4. 일반적인 공유DB 를 사용하라.


5. 하나의 버티클을 공유맵 인스턴스를 가지고 관리하는 전용으로 만들어라. 다른 버티클들과 이벤트버스를

    통해서  관리하라.  


6. 어플리케이션을 애초에 공유데이터가 필요없게 만들어라.




http://stackoverflow.com/questions/12299132/clustering-and-shared-data-in-vert-x  참고 





http://funnylog.kr/434 펌 

http://funnylog.tistory.com/439  펌


#1 삼바(SAMBA)를 이용한 윈도우에서 접근 가능한 공유폴더 만들기


순서대로 강좌를 끝나고 나면 대략 아래 그림과 같은 구성을 할 수 있게 됩니다.



  구성도에서 보여주는 것은 집이나 소규모 사무실 내부에서 공유폴더로 사용가능하고 외부에서도 인터넷을 통해 접근 가능한 구조 입니다.

 

오늘은 첫번째로 SAMBA를 이용한 공유폴더 만들기 입니다.

우분투 설치 PC 준비하기

   SAMBA 사용은 아주 간단하게 할 수 도 혹은 복잡하게 할 수 도 있지만. 여기서는 최소한의 설정으로 금방 공유 폴더가 될 수 있도록 하는 정도 만 다루게 됩니다. (강좌 전반에 최대한 간결 하는 방향으로 할 생각입니다.)

  우선 우분투가 설치된 PC 가 있어야 하는데 여기서는 현재 시점의 최신 LTS 버전인 12.04 를 기준으로 합니다.  LTS (Long Term Support)는 말그대로 오래 지원이 가능한 배포본으로 몇년동안은 OS 업데이트 유지가 비교적 용이합니다.

  우분투를 설치전이라면 http://www.ubuntu.com/download/desktop  에서 다운로드 하여 설치합니다.
우분투 서버버전도 있지만 네트워크 보안설정이나  XWindows 환경이 편한 데스크탑(32bit)  버전으로 합니다.  (서버버전도 물론 가능합니다만. 처음에는 데스크탑 버전으로 해보시길 권장합니다.)

다운 받은 .iso 를 CD 로 구워 부팅 설치 하면 됩니다. 하드디스크 파티션은 기본추천하는데로 하셔도 무방합니다. (우분투 설치는 "계속" 버튼을 누르면서 쭈욱 진행하면 되지만 혹 중간에 잘 모르겠으면 설치방법을 검색하면 글이 많이 있습니다.)


삼바(SAMBA) ?


   SAMBA는 윈도우용 네트워크 파일시스템을 리눅스와 같은 Unix-like OS에서 지원하도록 만들어진 서버 프로그램입니다. 즉, 리눅스에 디렉토리를 윈도우에서 공유폴더로 접근하여 쓸 수 있도록 해주는 소프트웨어 프로그램이라는 뜻입니다.  물론 MS윈도우를 파일서버로 사용가능 하나 그만큼 OS를 추가 구매 해야 하나 리눅스는 무료입니다. 그리고 다양한 리눅스의 백업 솔루션을 활용 할 수 있고,  단순히 공유폴더 서버로만 쓰더라도  최근의 복잡해진 윈도우 공유폴더 보다 (아이러니하게도 오히려) 더 간단하게 설정이 가능합니다.

프로그램 설치하기

우분투에 SAMBA를 설정하려면 먼저 패키지를 설치해야 합니다.

설치는 간단합니다.


$sudo apt-get  install samba



이렇게 하면 일단 프로그램 자체는 설치가 끝났습니다.


다음에 접속할 사용자를 추가합니다.


먼저 리눅스 사용자를 추가합니다.




$sudo adduser user1

$sudo adduser user2




그리고 SAMBA 접속 가능 사용자로 등록및 패스워드 설정합니다.


$sudo smbpasswd -a user1

$sudo smbpasswd -a user2



이때 설정하는 패스워드는 윈도우에서 공유폴더로 접속할때 인증할 패스워드가 됩니다. 


그리고 설정파일 입니다.   vi 에디터나 nano 에디터 등으로  /etc/samba/smb.conf 파일을 열어 맨아래에
아래 내용을 추가합니다.


$sudo nano /etc/samba/smb.conf


# 아래 내용 추가

[user1_home]

        comment= My  Folder

        path = /home/user1

        read only = no

        browseabale = yes

        guest ok = no

        create mask = 0666

        valid users = user1


[pub]

        comment=public                           # 폴더설명

        path = /sharefolder/pub                # 공유 대상 경로

        read only = no                              # 읽기 전용 여부

        browseable = yes                         # 해당 폴더가 보일지 여부

        guest ok = no                               # 누구나 접근 가능여부

        create mask = 0666                  # 1. 파일 생성시 권한 비트

        force create mode = 0                   # 2. OR masking

        security mask = 0777                     # 3. AND masking

        force security mode = 0                 # 4. OR masking with security mask

        directory mask = 0777                    # 5. 디렉토리 생성시 권한 비트 

        force directory mode = 0                # 6. OR masking

        directory security mask = 0777        # 7. AND masking

        force directory security mode = 0    # 8. OR masking with directory security mask



 
각각 항목별로 옆에 코멘트를 달아 드렸는데  크게 어려운 것은 없을 것(?) 입니다.

  다만 기본적으로 알아두면 좋을 것은  valid users 와 create mask 입니다.  
아래 [pub] 폴더처럼 valid users 에 지정된 사용자가 없으면 누구나 접근 가능한 폴더가 되고, [user1_home] 폴더 처럼 user1을 지정한 경우에는 user1만 접근 가능하게됩니다.

  그리고 create mask 는  리눅스에서 파일에 대한 접근권한 부분입니다.  윈도우에서 해당 폴더를 공유해서 파일을 생성하게 되었을때 어떠한 파일권한을 갖게 할것인지를 설정하는 것이죠.

그런데 이것만으로는 파일 생성권한이 잘 먹히지 않습니다. 왜냐면  security mask 에서 허용이 되어있어야 하기 때문 입니다.   

            관련해서 SAMBA에서는 최종 권한을 적용할때 다음과 같은 로직으로 설정됩니다.


 create permission =  

( create mask  OR force create mode ) AND (security mask OR force security mode)



즉 security mask 에서 허가되지 않은 부분은 create mask 로 설정이 되어있더라도 적용이 안됩니다. 만일 create mask에서 설정하는데로 되게 하고 싶으면 security mask를 0777로 해두면 됩니다. 위에 예처럼 말이죠.

현재 우리가 적용하는 상황은 보안보다는 편의성이 중요한 상황이라고 보고 일단 접근 가능한 사용자라면 누구나 생성/삭제가 가능하도록 적용하였습니다.

이렇게 해서 파일을 추가하고 나면 SAMBA 데몬(서버프로그램)을 다시 시작해야 합니다.


$sudo  /etc/init.d/smbd restart



다시 시작하면 이제 윈도우에서 접근해봅니다.  

접근 방법은 리눅스의 IP를 조회하면 됩니다.  ifconfig 명령을 이용하면 조회가 가능합니다.
보통 eth0 또는 eth1 랜카드에 ip가있을 겁니다. 아래의 예는 랜포트가 2개 있는 PC인 경우이고 현재 eth1에 연결되어있습니다.


$ ifconfig

eth0      Link encap:Ethernet  HWaddr 00:1b:1b:0a:8f:f7

          UP BROADCAST MULTICAST  MTU:1500  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

          Interrupt:16 Memory:96400000-96420000


eth1      Link encap:Ethernet  HWaddr 00:1b:1b:40:a9:c5

          inet addr:192.168.1.109  Bcast:192.168.1.255  Mask:255.255.255.0

          inet6 addr: fe80::21b:1bff:fe40:a9c5/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:592504491 errors:0 dropped:0 overruns:0 frame:0

          TX packets:218177502 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:895777159784 (895.7 GB)  TX bytes:16078571519 (16.0 GB)

          Interrupt:17 Memory:94400000-94420000




위에 보면 노랗게 되어있는 부분이 주소 입니다.  이 주소를 이용해서 윈도우폴더에서
\\192.168.1.109 를 입력하면 됩니다.

아래 윈도우 7 에서 접근 한 그림을 참고하세요.


위처럼 2개의 폴더가 조회됩니다.


그러면 접근해서 파일을 보관사용하면 되겠습니다.


이렇게해서 첫번째 리눅스를 이용한 파일서버(NAS)구축하기 강좌를 마치겠습니다. 


혹시나 가능한 필요한 부분만 쓴다고 불친절한 글이 됐는지 모르겠습니다.  감사합니다.



#2 RSYNC를 이용한 공유폴더 자동(동기화)백업


이번에는 두번째 강좌인 rsync 백업 입니다.


  저장공간을 만들었으면 그 다음 우선적으로 할일을 백업입니다.  (단순 개인적인 용도로 영화파일이나 음악파일정도 보관하는 용도라면 백업에 대한 부담이 덜하겠지만,  중요한파일도 같이 보관하거나, 여럿이 사용할 파일 서버라면 백업은 필수 입니다.  


 컴퓨터로 자료를 보관하는 입장이라면 , 일단 기본적으로 저장매체는 믿지 마십시오, 언제든 파괴될 수 있고, 장애를 일으킬 수 있습니다. 저장매체가  무엇(HDD, SSD, CD, DVD, 테이프 등) 이든 말입니다. 믿을 수 있는것은 이중화 뿐입니다.




위 그림에서 보면 1~3 가지 정도로 자동백업 상황을 고려 해볼 수 있습니다. 자료의 중요도에 따라 백업은 이중, 삼중으로 되어야 하고, 필요시에는 원격지 다른장소에 구성하여 서버의 장애는 물론, 화재나, 해킹, 지진등에 도 대비를 해야 겠죠.  심지어 국가를 넘어서 자료를 백업하기도 합니다. 사실 개인도 그러한 구성도 얼마든지 가능합니다.


어째든 최소한 다른미디어에 백업하는 정도라도 구성하기를 권장합니다.


여기서 다루게될 백업(동기화)도구인 rsync 는 위 그림에서나오는 모든 경우에 대해 적용이 가능합니다.


 rsync 는 Unix-like 환경을 유틸리티로  한곳의 파일이나 디렉토리를 다른 곳에 동일하게 동기화 할 수 있도록 합니다.  처음 발표된건 1996년도입니다. 당시는 지금과 같은 네트워크 대역폭이 넓지 않은 상태인 만큼, 네트워크를 통한 파일 전송을 최소화 하는것이 중요했을 것입니다.(물론 지금도 그렇지만) 그래서 delta 인코딩이라는 기술로 변경내용만 빠르게  추려내어  전송량을 최소화 하도록 하였습니다. 이렇게 해서 잘만들어진 rsync는  지금도 유용하고 편리한 백업/미러링 도구입니다.


 rsync는 필수 유틸리티 이기 때문에 대부분의 유닉스 시스템(맥북에도)을 설치하게 되면 기본적으로 설치되어있어 바로 사용이 가능합니다. 그리고 무료이구요.


그럼 rsync   기본 사용법입니다.


rsync [OPTION]...  원본경로   사본생성경로

rsync [OPTION]... 원본경로    USER@호스트:사본생성경로

rsync [OPTION]...  USER@호스트:원본경로    사본생성경로     


rsync사용법은 파일 복사 명령어와 비슷합니다.  다만 같은 서버내에서는 물론 네트워크를 이용한 서버간에도 복사 동기화가 가능합니다.  이때는 접속 USER ID와 호스트 명(IP or DOMAIN NAME)이 들어가게 됩니다.



그럼 실제 예를 보겠습니다.


1) 먼저 동일 서버에서 디렉토리간 동기화 방법입니다.  


$rsync -avz /home/user1/one   /home/user1/two



옵션(-avz) 설명


 - a : archive mode동작지시,  -rlptgoD 라는 여러개의 옵션을 -a로 표현한것입니다.  이것은 (-r)지정된 원본디렉토리 이하의 모든 디렉토리와 파일, 심볼릭 링크(-l), 장치파일(-D)까지 모두 사본생성경로로 원래 권한(-p), 시간(-t),그룹(-g), 소유자(-o) 권한을 유지한채 복사하란 뜻입니다.  

즉, 아래와 같다고 보면 됩니다.

rsync -r -l -p -t -g -o -D

-v : verbose 실행과정 내용을 가능한 상세히 보여 달라는 뜻입니다.

-z : 전송데이터 량을 줄이기 위해 전송중 압축을 하라는 내용입니다. 최종 복사된 파일이 압축되는 것은 아닙니다.


이렇게 해서 실행하는 예를 보면 

 

$ ls -l one

합계 4

-rw-rw-r-- 1 user1 user1 10  2  2 19:17 test01.txt


$rsync -avz /home/user1/one   /home/user1/two

sending incremental file list

one/

one/test01.txt


sent 128 bytes  received 35 bytes  326.00 bytes/sec

total size is 10  speedup is 0.06


$ ls -l two

합계 4

drwxrwxr-x 2 user1 user1 4096  2월  2 19:17 one


   one 디렉토리 통째로 two안으로 들어간 것을 볼 수 있습니다. 테스트 상황에서는 파일이 한개(test01.txt)만 있어서 금방 끝납니다. 


2) 다음은  다른 서버로 부터 동기화 하는 예 입니다.


 사실 rsync에서  리모트로 부터 파일을 전송하는 방법에는 크게 2가지가 있습니다. 


- rsync 데몬을 이용하는 방법  (HOSTIP::/path 형식사용 또는  rsync:://  형식사용 )

(또는  rsync 데몬을 이용하되 ssh 컨넥션 이용하는 방법)


- 리모트 쉘 ( ssh,  rsh )  를 이용하는 방법   (  HOSTIP:/path  형식사용)


  rsync 데몬을 명령줄에서의 두가지 방법차이는 콜론(:) 개수 차이 입니다. 콜론 개수에 따라 rsync는 리모트 쉘을 이용할지 리모트 rsync 데몬을 이용할지를 결정합니다. 


  첫번째 원격 접근 방법인 rsync데몬을 이용하게 되면 대상 호스트에 inetd (873포트) 에 설정을 하여 항상 데몬이 뜰 수 있도록  해주어야 하며 기본적으로 전송간 암호화는 되지 않습니다. (여기에 ssh 컨넥션을 이용하는 방법을 추가해서 암호화가 되도록 해줄 수 도 있긴 합니다.)  


 두번째 원격접근 방법인 리모트쉘을 이용하는 방법을 사용하게 되면 통상 ssh (22번포트)를 사용하게 되고 더불어 자동으로 암호회된 세션안에서 통신을 하게 됩니다. 별도로 데몬 설정도 불필요합니다.


여기에서는 두번째 방법인 리모트쉘을 이용하는 방법을 사용하게 될 것 입니다.


  리모트쉘(ssh) 를 이용하는 전제는 ssh 패키지가 설치 되어있어야합니다. 만일 설치전이라면 ssh부터 설치하시기 바랍니다. (리모트,로컬 양쪽에 설치 되어있어야 합니다.)


$sudo apt-get install ssh



그럼 준비가 되었으면 rsync 를 이용한 리모트 원본을 동기화예를 보겠습니다.


$rsync -avz user2@192.168.1.51:/home/user2/three two


  51번 호스트의 /home/user2/three 원본 경로전체를 two 로 동기화 한다는 뜻입니다.  이때 51번 호스트로 접속할때  사용자는 user2입니다.  콜론이 한개(:)이기때문에 ssh접속을 하게 됩니다.


그럼 실행해 봅니다.

$rsync -avz user2@192.168.1.51:/home/user2/three two

user2@192.168.1.51's password: 

receiving incremental file list

three/

three/test02.txt


sent 34 bytes  received 141 bytes  50.00 bytes/sec

total size is 19  speedup is 0.11


$ls -l two

합계 8

drwxrwxr-x 2 user1 user1 4096  2월  2 19:17 one

drwxr-xr-x 2 user1 user1 4096  2월  2 19:56 three


51번 호스트의 three디렉토리 통째로 two로 동기화(복사) 됩니다.


 파일서버를 개인적인 용도로 쓰고 별도의 리모트 서버 구성을 하지 않는다면 1)번의 디렉토리간 동기화방법을 사용하면 됩니다.



정기적 백업의 자동화


  rsync를 이용하면 앞서 설명한것처럼 간편하게 명령 한줄로 (동기화)백업을 해낼 수 있습니다만.  이왕이면 정기적을 자동 백업을 해줄 수 있다면 더욱 좋을 것 입니다.


 리눅스와 같은 (Unix-like) OS에서는 cron 이라는 주기적 작업을 쉽게 설정할 수 있는 도구가 있습니다. 이를 이용하면 rsync를 자동화 백업이 가능해 집니다.


cron 의 실행하는 스케쥴표는 crontab  명령으로 작성할 수 있습니다.


실행 명령 입니다.


$crontab -e


아마도 처음 crontab을 실행한다면 어떤 에디터를 사용할지 물어 볼겁니다. 익숙한 에디터를 선택하시면 됩니다.  그러면  crontab은 하나의 설정파일을 열어 줍니다.


해당 파일에 작업 command 를 추가 해주면 되는 데 형식은 다음과 같습니다.


#분 시 일 달 요일  command

#30 1 2 3 *   rsync ...  # 3월 2일 1시 30분에  rsync ...를 실행한다. (특정일 실행)

#10 2 * * 1  rsync ...     #  매주 첫날 2시 10분에 rsync...를 실행한다. (주 단위 실행)

#0 3 *  * *   rsync ...    # 매일 3시 정각에 rsync... 를 실행한다.  (매일 실행)


즉 위처럼 원하는 스케쥴에 rsync 실행줄을 넣어 주면 되는 겁니다.   (맨앞 # 코멘트 표시는 제거해야죠 ^^)


여기에 좀더 세련된 관리 방법을 넣어 보겠습니다.


7일 단위 증분 백업하면서 동기화하기


위 말이좀 헷갈리죠?


  이 말뜻은  매일 동기화를 해서 원본과 맞추되.  만약에 특정 변경된 파일이 문제가 있어 복원 필요한 경우 해당 파일을 적어도 일주일 전까지는 되돌릴 수 있도록 따로 변경분만 별도 백업 한다는 뜻입니다.


어떻게?


--backup   이란 옵션을 사용하면 됩니다.

 

 이 옵션을 사용하게 되면 원본에 동기화를 할때 변경이 발생해서 덮어쓰이게 되는 경우 이전파일을 다른 이름으로 바꾸거나(--suffix 옵션)  다른 디렉토리로(--backup-dir)로 옮겨 놓을 수 있도록 하는 명령 입니다.


즉, 바뀌게 되는 파일만 또 다른 공간으로 살려두게 되는 것이죠. 


그런데 이 옵션만으로는 좀 세련되게 하기가 안되므로 간단히 스크립트를 만들고 이 스크립트를 실행하는 명령을  crontab 으로 등록하겠습니다.


아래 스크립트입니다.   http://rsync.samba.org/examples.html  있는 예제를 좀더 간단하게 바꾸었습니다.


#!/bin/sh


SRCPATH=/src


BACKUPHOME=/backup


#동기화 제외 대상 목록을 넣을 파일

EXCLUDES=$BACKUPHOME/exclude_files.txt


# 일요일, 월요일, 화요일 ... 토요일 또는 영문으로 (sunday ... )

BACKUPSUB=`date +%A`     


OPTS="--force --ignore-errors --delete-excluded --exclude-from=$EXCLUDES  

          --delete --backup --backup-dir=$BACKUPHOME/$BACKUPSUB -a"


export PATH=$PATH:/bin:/usr/bin:/usr/local/bin


rm -rf  $BACKUPHOME/$BACKUPSUB/*


# 동기화 실행 진행

rsync $OPTS $SRCPATH  $BACKUPHOME/current


이 파일을  /backup/runrsync.sh  실행가능한 파일로 저장합니다.


그리고  요일별로 변경분만 백업될 디렉토리를 미리 만들어 주어야 합니다.


$mkdir /backup/일요일  /backup/월요일 /backup/화요일 /backup/수요일  /backup/목요일 /backup/금요일  /backup/토요일



$crontab -e 


실행 후 아래 처럼 추가해줍니다.

#0 2 *  * *   /backup/runrsync.sh


그럼 매일 새벽 2시에 동기화를 하게 되고 이때  바뀌는 파일은 /backup 밑에 요일별로 옮겨지면서 전체 동기화된 파일은   /backup/current 에 있게 됩니다.



  여기까지 rsync를 이용한 자동 동기화 방법에 대한 설명을 마치겠습니다.  각자 필요한 환경에 맞게 적절히 변경하여 활용하시기 바랍니다.  감사합니다.




참고로 위의 모식도는 하둡의 쉘 실행모습입니다. 하마도 하둡과 매우 비슷합니다.

$ bin/start-bspd.sh

위와 같이 start-bspd.sh 로 부터 시작합니다. 마스터 노드에서 실행합니다.

bin=`dirname "$0"`

bin=`cd "$bin"; pwd`       //  bin 디렉토리의 경로를 얻는다.


. "$bin"/hama-config.sh  // hama-config.sh 를 내부적으로 실행한다.


"$bin"/hama-daemons.sh --config "${HAMA_CONF_DIR}" start zookeeper   // 주키퍼 부터 시작하고

"$bin"/hama-daemon.sh --config $HAMA_CONF_DIR start bspmaster   // bspmaster 실행

"$bin"/hama-daemons.sh --config $HAMA_CONF_DIR start groom      // groom 실행 


bin/hama-config.sh

hama-config.sh 안에서는 conf/hama-env.sh 를 실행하며, groomserver 를 export

conf/hama-env.sh

hama-env.sh 에서는 아래와 같이 JAVA_HOME 등을 설정합니다.

# The java implementation to use.  Required.
export JAVA_HOME=/usr/lib/jvm/java-7-oracle

# Where log files are stored.  $HAMA_HOME/logs by default.
# export HAMA_LOG_DIR=${HAMA_HOME}/logs

# The maximum amount of heap to use, in MB. Default is 1000.
# export HAMA_HEAPSIZE=1000

# Tell Hama whether it should manage it's own instance of Zookeeper or not.
export HAMA_MANAGES_ZK=true 


hama-daemon.sh 을 통해 bspmaster 를  실행합니다. 

#!/usr/bin/env bash

usage="Usage: hama-daemon.sh [--config <conf-dir>] [--hosts hostlistfile] (start|stop) <hama-command> <args...>"


# if no args specified, show usage

if [ $# -le 1 ]; then

  echo $usage

  exit 1

fi


bin=`dirname "$0"`

bin=`cd "$bin"; pwd`


. "$bin"/hama-config.sh


# get arguments

startStop=$1

shift

command=$1

shift


hama_rotate_log ()

{

    log=$1;

    num=5;

    if [ -n "$2" ]; then

num=$2

    fi

    if [ -f "$log" ]; then # rotate logs

while [ $num -gt 1 ]; do

   prev=`expr $num - 1`       

   [ -f "$log.$prev" ] && mv "$log.$prev" "$log.$num"

   num=$prev

done

mv "$log" "$log.$num";

    fi

}


if [ -f "${HAMA_CONF_DIR}/hama-env.sh" ]; then

  . "${HAMA_CONF_DIR}/hama-env.sh"

fi


# get log directory

if [ "$HAMA_LOG_DIR" = "" ]; then

  export HAMA_LOG_DIR="$HAMA_HOME/logs"

fi

mkdir -p "$HAMA_LOG_DIR"


if [ "$HAMA_PID_DIR" = "" ]; then

  HAMA_PID_DIR=/tmp

fi


if [ "$HAMA_IDENT_STRING" = "" ]; then

  export HAMA_IDENT_STRING="$USER"

fi


# some variables

export HAMA_LOGFILE=hama-$HAMA_IDENT_STRING-$command-$HOSTNAME.log

export HAMA_ROOT_LOGGER="INFO,DRFA"

log=$HAMA_LOG_DIR/hama-$HAMA_IDENT_STRING-$command-$HOSTNAME.out

pid=$HAMA_PID_DIR/hama-$HAMA_IDENT_STRING-$command.pid


# Set default scheduling priority

if [ "$HAMA_NICENESS" = "" ]; then

    export HAMA_NICENESS=0

fi


case $startStop in

  (start)

    mkdir -p "$HAMA_PID_DIR"


    if [ -f $pid ]; then

      if kill -0 `cat $pid` > /dev/null 2>&1; then

        echo $command running as process `cat $pid`.  Stop it first.

        exit 1

      fi

    fi


    if [ "$HAMA_MASTER" != "" ]; then

      echo rsync from $HAMA_MASTER

      rsync -a -e ssh --delete --exclude=.svn --exclude='logs/*' --exclude='contrib/hod/logs/*' $HAMA_MASTER/ "$HAMA_HOME"

    fi


    hama_rotate_log $log

    echo starting $command, logging to $log

    cd "$HAMA_HOME"

    nohup nice -n $HAMA_NICENESS "$HAMA_HOME"/bin/hama --config $HAMA_CONF_DIR $command "$@" > "$log" 2>&1 < /dev/null &

    echo $! > $pid

    sleep 1; head "$log"

    ;;

          

  (stop)


    if [ -f $pid ]; then

      if kill -0 `cat $pid` > /dev/null 2>&1; then

        echo stopping $command

        kill `cat $pid`

      else

        echo no $command to stop

      fi

    else

      echo no $command to stop

    fi

    ;;


  (*)

    echo $usage

    exit 1

    ;;


esac


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

- 역 따옴표는 따옴표나 작은 따옴표와는 완전히 다른 용도로 쓰인다. 공백 문자를 포함하는 데에는 쓰이지 않는다.  글의 앞쪽에서 다음 라인을 사용했던 것을 기억해 보라:

x=$(expr $x + 1)

이미 당신이 알듯이, 명령 expr $x + 1 결과가 변수 x 들어가게 된다.  따옴표를 사용한 다음의 명령도  같은 결과를 낸다:

x=`expr $x + 1`

어느 것을 사용해야 하는가 하는 문제는 순전히 당신에게 달려 있다. 당신이 좋은 쪽을 선택하라.  따옴표가 $(...) 보다 자주 사용되는 것을   있을 것이다. 하지만, $(...) 보다 읽기 쉽다. 다음과 같은 경우엔 특히  그렇다:

$!/bin/bash
echo "I am `whoami`"

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

-nohup : 로그아웃 하여 터미널을 빠져나가도 실행중인 프로그램이 종료되지 않고 계속 수행될수 있게 하는 명령

프로그램을 데몬처럼 실행하고 싶을 때는 아래와 같이 하면 됩니다. 

" 명령어 & "
여기서 '&'는 백그라운드로 실행하라는 뜻입니다.
그런데, 이 방법은 실행한 사용자가 로그아웃하면 프로그램도 함께 종료됩니다.
이럴때는 nohup 이란 명령어를 사용하면 됩니다.

 

nohup(노헙) 정의
리눅스, 유닉스에서 쉘스크립트파일(*.sh)을 데몬형태로 실행시키는 프로그램

 

nohup 주의사항
nohup으로 실행할 쉘스크립트파일(*.sh)은 현재 퍼미션이 755이상 상태여야 한다.

chmod 755 shell.sh

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

rsync 동기화 툴 

# rsync options source destination


로컬 컴퓨터에 있는 moniwiki 디렉토리를 원격 컴퓨터로 복사하는 예제다.

# rsync -avz moniwiki/ yundream@192.168.56.101:/home/yundream/backups


원격 컴퓨터의 내용을  로컬로 복사 

# rsync -avzh yundream@192.168.56.101:/home/yundream/backups ./


Rsync는 -e 옵션을 이용해서 ssh, rsh와 같은 remote shell 프로그램을 선택할 수 있다. 보통 안전한 통신을 보장해주는 ssh

를 이용한다. -e 옵션이 없다면 ssh를 사용한다.


data 디렉토리를 복사에서 제외한다.
# rsync -avz  --exclude 'data' yundream@192.168.56.101:/home/yundream/backups ./


별표(*)도 사용할 수 있다.
# rsync -avz  --exclude '*.bak' yundream@192.168.56.101:/home/yundream/backups ./

rsync는 파일이나 디렉토리가 없으면 새로 만든다. 그러나 파일이나 디렉토리가 존재할 경우 삭제하고 싶을 때도 있을 거다.

이럴때 
--delete 옵션을 사용한다.

로컬 서버에 "text.txt"파일이 있으면 삭제한 후 복사하는 예제다.
# touch test.txt
# rsync -avz --delete yundream@192.168.56.101:/home/yundream/backups ./





최종적으로 hama 를 실행합니다. 


bin=`dirname "$0"`

bin=`cd "$bin"; pwd`


. "$bin"/hama-config.sh


cygwin=false

case "`uname`" in

CYGWIN*) cygwin=true;;

esac


# if no args specified, show usage

if [ $# = 0 ]; then

  echo "Usage: hama [--config confdir] COMMAND"

  echo "where COMMAND is one of:"

  echo "  bspmaster            run the BSP Master node"

  echo "  groom                run the Groom node"

  echo "  zookeeper            run a Zookeeper server"

  echo "  job                  manipulate BSP jobs"

  echo "  jar <jar>            run a jar file"

  echo "  pipes               run a pipe job"

  echo "  seqdumper            run SequenceFileDumper"

  echo " or"

  echo "  CLASSNAME            run the class named CLASSNAME"

  echo "Most commands print help when invoked w/o parameters."

  exit 1

fi


# get arguments

COMMAND=$1

shift


if [ -f "${HAMA_CONF_DIR}/hama-env.sh" ]; then

  . "${HAMA_CONF_DIR}/hama-env.sh"

fi


# some Java parameters

if [ "$JAVA_HOME" != "" ]; then

  #echo "run java in $JAVA_HOME"

  JAVA_HOME=$JAVA_HOME

fi

  

if [ "$JAVA_HOME" = "" ]; then

  echo "Error: JAVA_HOME is not set."

  exit 1

fi


JAVA=$JAVA_HOME/bin/java

JAVA_HEAP_MAX=-Xmx1000m


# check envvars which might override default args

if [ "$HAMA_HEAPSIZE" != "" ]; then

  #echo "run with heapsize $HAMA_HEAPSIZE"

  JAVA_HEAP_MAX="-Xmx""$HAMA_HEAPSIZE""m"

  #echo $JAVA_HEAP_MAX

fi


# CLASSPATH initially contains $HAMA_CONF_DIR

CLASSPATH="${HAMA_CONF_DIR}"

CLASSPATH=${CLASSPATH}:$JAVA_HOME/lib/tools.jar


# for developers, add Hama classes to CLASSPATH

if [ -d "$HAMA_HOME/core/target/classes" ]; then

  CLASSPATH=${CLASSPATH}:$HAMA_HOME/core/target/classes

fi

if [ -d "$HAMA_HOME/core/target/test-classes/classes" ]; then

  CLASSPATH=${CLASSPATH}:$HAMA_HOME/core/target/test-classes

fi


# for developers, add Commons classes to CLASSPATH

if [ -d "$HAMA_HOME/commons/target/classes" ]; then

  CLASSPATH=${CLASSPATH}:$HAMA_HOME/commons/target/classes

fi

if [ -d "$HAMA_HOME/commons/target/test-classes/classes" ]; then

  CLASSPATH=${CLASSPATH}:$HAMA_HOME/commons/target/test-classes

fi


# for developers, add Graph classes to CLASSPATH

if [ -d "$HAMA_HOME/graph/target/classes" ]; then

  CLASSPATH=${CLASSPATH}:$HAMA_HOME/graph/target/classes

fi

if [ -d "$HAMA_HOME/graph/target/test-classes/classes" ]; then

  CLASSPATH=${CLASSPATH}:$HAMA_HOME/graph/target/test-classes

fi


# for developers, add ML classes to CLASSPATH

if [ -d "$HAMA_HOME/ml/target/classes" ]; then

  CLASSPATH=${CLASSPATH}:$HAMA_HOME/ml/target/classes

fi

if [ -d "$HAMA_HOME/ml/target/test-classes/classes" ]; then

  CLASSPATH=${CLASSPATH}:$HAMA_HOME/ml/target/test-classes

fi


# so that filenames w/ spaces are handled correctly in loops below

IFS=


# for releases, add core hama jar to CLASSPATH

for f in $HAMA_HOME/hama-**.jar; do

  CLASSPATH=${CLASSPATH}:$f;

done


# add libs to CLASSPATH

for f in $HAMA_HOME/lib/*.jar; do

  CLASSPATH=${CLASSPATH}:$f;

done


# add user-specified CLASSPATH last

if [ "$HAMA_CLASSPATH" != "" ]; then

  CLASSPATH=${CLASSPATH}:${HAMA_CLASSPATH}

fi


# default log directory & file

if [ "$HAMA_LOG_DIR" = "" ]; then

  HAMA_LOG_DIR="$HAMA_HOME/logs"

fi

if [ "$HAMA_LOGFILE" = "" ]; then

  HAMA_LOGFILE='hama.log'

fi


# default policy file for service-level authorization

if [ "$HAMA_POLICYFILE" = "" ]; then

  HAMA_POLICYFILE="hama-policy.xml"

fi


# restore ordinary behaviour

unset IFS


# figure out which class to run

if [ "$COMMAND" = "bspmaster" ] ; then

  CLASS='org.apache.hama.BSPMasterRunner'

  BSP_OPTS="$BSP_OPTS $BSP_BSPMASTER_OPTS"

elif [ "$COMMAND" = "groom" ] ; then

  CLASS='org.apache.hama.GroomServerRunner'

  BSP_OPTS="$BSP_OPTS $BSP_GROOMSERVER_OPTS"

elif [ "$COMMAND" = "zookeeper" ] ; then

  CLASS='org.apache.hama.ZooKeeperRunner'

elif [ "$COMMAND" = "job" ] ; then

  CLASS='org.apache.hama.bsp.BSPJobClient'

elif [ "$COMMAND" = "pipes" ] ; then

  CLASS='org.apache.hama.pipes.Submitter'

elif [ "$COMMAND" = "seqdumper" ] ; then

  CLASS='org.apache.hama.pipes.util.SequenceFileDumper'

elif [ "$COMMAND" = "jar" ] ; then

  CLASS=org.apache.hama.util.RunJar

  BSP_OPTS="$BSP_OPTS"

else

  CLASS=$COMMAND

fi


# cygwin path translation

if $cygwin; then

  CLASSPATH=`cygpath -p -w "$CLASSPATH"`

  HAMA_HOME=`cygpath -w "$HAMA_HOME"`

  HAMA_LOG_DIR=`cygpath -w "$HAMA_LOG_DIR"`

  TOOL_PATH=`cygpath -p -w "$TOOL_PATH"`

fi


# cygwin path translation

if $cygwin; then

  JAVA_LIBRARY_PATH=`cygpath -p "$JAVA_LIBRARY_PATH"`

fi


HAMA_OPTS="$HAMA_OPTS -Dhama.log.dir=$HAMA_LOG_DIR"

HAMA_OPTS="$HAMA_OPTS -Dhama.log.file=$HAMA_LOGFILE"

HAMA_OPTS="$HAMA_OPTS -Dhama.home.dir=$HAMA_HOME"

HAMA_OPTS="$HAMA_OPTS -Dhama.id.str=$HAMA_IDENT_STRING"

HAMA_OPTS="$HAMA_OPTS -Dhama.root.logger=${HAMA_ROOT_LOGGER:-INFO,console}"

if [ "x$JAVA_LIBRARY_PATH" != "x" ]; then

  HAMA_OPTS="$HAMA_OPTS -Djava.library.path=$JAVA_LIBRARY_PATH"

fi  

HAMA_OPTS="$HAMA_OPTS -Dhama.policy.file=$HAMA_POLICYFILE"

# run it

exec "$JAVA" $JAVA_HEAP_MAX $HAMA_OPTS -classpath "$CLASSPATH" $CLASS "$@"




- 변수를 참조할 때는 보통 큰 따옴표(" ")로 묶어 주는게 좋습니다. 이렇게 하면 $, `(backquote), \(이스케이프)를 제외한 모든 특수 문자들을 보존해 줍니다. 

작은 따옴표(' ')도 큰 따옴표와 비슷하게 동작하지만 $의 특별한 의미를 꺼 버려서 변수 참조가 일어나지 않게 합니다. 작은 따옴표안의 '을 제외한 모든 특수 문자들은 단순히 문자 그대로 해석됩니다. 작은 따옴표("완전한 쿼우팅")를 큰 따옴표("부분 인용")보다 좀 더 엄격한 방법이라고 생각하면 됩니다.

"$@" 는  이쉘을 호출할때 사용한 모든 arg 를 그대로 써줍니다. ("$1" 은 첫번째 인자만)

JAVA 에 -server 옵션이 없는 이유는 코어가 2개이상 메모리가 1기가 이상이면 자동적으로
  VM -s erver 이 적용될것이기때문입니다.

if [ -e $filename ] ; then    // 파일이 존재하는지 , -f  일반파일인지 , -d 디렉토리인

IFS(Internal File Seperator)

IFS는 명령어의 옵션을 설정하거나 프로그램의 아귀먼트를 지정할때 명령어와 옵션, 프로그램과 아귀먼트를 구분해주는 일종의 시스템 구분 인자를 말한다. 

#!/bin/bash var="'(]\\{}\$\"" echo $var # '(]\{}$" echo "$var" # '(]\{}$" 차이가 없죠? echo IFS='\' echo $var # '(] {}$" \ 가 빈 칸으로 바뀌었네요. echo "$var" # '(]\{}$" # S.C. 제공 exit 0



hama-daemons.sh 를 통해 groom 들을 실행합니다. 

usage="Usage: hama-daemons.sh [--config confdir] [--hosts hostlistfile] [start|stop] command args..."


# if no args specified, show usage

if [ $# -le 1 ]; then

  echo $usage

  exit 1

fi


bin=`dirname "$0"`

bin=`cd "$bin"; pwd`


. $bin/hama-config.sh


remote_cmd="cd ${HAMA_HOME}; $bin/hama-daemon.sh --config ${HAMA_CONF_DIR} $@"

args="--config ${HAMA_CONF_DIR} $remote_cmd"

command=$2


case $command in

  (zookeeper)

    exec "$bin/zookeepers.sh" $args

    ;;

  (*)

    exec "$bin/grooms.sh" $args

    ;;

esac


grooms.sh 실행 

#!/usr/bin/env bash


usage="Usage: grooms.sh [--config confdir] command..."

# if no args specified, show usage
if [ $# -le 0 ]; then
  echo $usage
  exit 1
fi

bin=`dirname "$0"`
bin=`cd "$bin"; pwd`

. "$bin"/hama-config.sh

# If the groomservers file is specified in the command line,
# then it takes precedence over the definition in 
# hama-env.sh. Save it here.
HOSTLIST=$HAMA_GROOMS

if [ -f "${HAMA_CONF_DIR}/hama-env.sh" ]; then
  . "${HAMA_CONF_DIR}/hama-env.sh"
fi

if [ "$HOSTLIST" = "" ]; then
  if [ "$HAMA_GROOMS" = "" ]; then
    export HOSTLIST="${HAMA_CONF_DIR}/groomservers"
  else
    export HOSTLIST="${HAMA_GROOMS}"
  fi
fi

for groom in `cat "$HOSTLIST"|sed  "s/#.*$//;/^$/d"`; do
 ssh $HAMA_SSH_OPTS $groom $"${@// /\\ }" $groom \
   2>&1 | sed "s/^/$groom: /" &
 if [ "$HAMA_GROOM_SLEEP" != "" ]; then
   sleep $HAMA_GROOM_SLEEP
 fi
done

wait


SED는 스트림 에디터입니다. 스트림 에디터는 입력 스트림(파일이나 파이프를 통한 입력)에 대해서 단순한 텍스트 교체가 필요할 때 쓰입니다.

1. 주소 지정

주소 지정이란 편집하고자 하는 행을 선택하는 것을 말한다. 이 주소는 숫자나 정규표현식 또는 둘의 조합으로 표현한다. 주소를 지정하지 않은 경우 입력 파일 전체 행에 대하여 작업을 진행한다.

sed ‘1,3p’ datafile

: datafile 1행에서 3행까지 출력한다. p는 행을 출력하라는 명령어이다.


sed -n ‘/[Ll]ove/p’ datafile

: datafile에서 Love love를 포함하는 행만 출력한다.


레퍼런스:http://hyunkie.tistory.com/51



'HAMA' 카테고리의 다른 글

HAMA 시작하기  (0) 2015.09.30
[하마 인사이드] 1. HAMA with K-Means  (0) 2015.05.05

http://blog.udanax.org/2013/04/blog-post_29.html  펌 


미리 준비해야할 것들

  • Hadoop 1.0의 HDFS 
    • Hama 0.6 버전까지는 Hadoop 1.0과 CDH3만을 지원하고 있습니다.
  • Sun/Oracle 배포 Java
  • SSH
  • Hama 최신버전을 다운로드 합니다.
이 글에서는 준비가 다 완료되었다고 가정하고 바로 하마 설치 들어가봅시다.

분산 모드로 설치하기

Hama 최신버전 타르볼을 압축해제한 후, 편집해야할 파일은 conf 디렉토리 밑에 groomservers, hama-env.sh, 그리고 hama-site.xml 세 개 입니다.

1) 먼저 hama-env.sh 파일을 까서, 아래와 같이 JDK가 설치된 경로와 zookeeper 실행여부를 선택합니다 (주키퍼를 설치해놓지 않았으면 true로 하고, 기존 설치된 주키퍼를 쓰려면 false로 합니다).
# The java implementation to use.  Required.
export JAVA_HOME=/usr/lib/jvm/java-7-oracle

...

# Tell Hama whether it should manage it's own instance of Zookeeper or not.
export HAMA_MANAGES_ZK=true 
2) 이제 hama-site.xml 을 까서 다음과 같이 기본적으로 설정되어야할 properties를 작성해줍니다. 항목별로 설명하면 bsp 프레임워크의 마스터 서버의 호스트명과 포트번호, HDFS 파일시스템의 네임노드 호스트명과 포트번호, 주키퍼 호스트명, 그리고 인풋 데이터 파티셔닝을 실시간 처리하겠다는 설정 값들입니다.
  <property>
    <name>bsp.master.address</name>
    <value>server01.udanax.org:40000</value>
  </property>

  <property>
    <name>fs.default.name</name>
    <value>hdfs://server01.udanax.org:9000/</value>
  </property>

  <property>
    <name>hama.zookeeper.quorum</name>
    <value>server01.udanax.org</value>
  </property>
3) 여기까지 되었으면 이제 groomservers 파일을 열어서, 슬레이브로 동작할 서버들의 호스트명을 다음과 같이 나열해줍니다:
server02.udanax.org
server03.udanax.org
server04.udanax.org
...
설정이 완료되면, sever01.udanax.org 서버가 마스터로 나머지 02~04번까지의 서버가 슬레이브로 동작하게 됩니다.

데몬 실행 및 페이지랭크 실행해보기

설정이 끝났으면, 다음과 같이 start-bspd.sh 구동 스크립트로 데몬을 실행합니다.
$ bin/start-bspd.sh
$ tail -f logs/hama-edward-bspmaster-udanax.org.log
2013-04-29 15:46:10,198 INFO org.apache.hadoop.ipc.Server: IPC Server Responder: starting
2013-04-29 15:46:10,198 INFO org.apache.hama.bsp.BSPMaster: Starting RUNNING
2013-04-29 15:46:21,165 INFO org.apache.hama.bsp.BSPMaster: groomd_server02.udanax.org_50000 is added.
로그를 보면 슬레이브들이 마스터서버에 추가되는 것을 볼 수 있습니다. 데몬이 잘 올라왔다면 이제 예제를 실행해볼 수 있습니다. 다음 명령어는 Pi 계산하는 예제입니다.
$ bin/hama jar hama-examples-0.6.1.jar pi
13/04/29 15:50:15 INFO mortbay.log: Logging to org.slf4j.impl.Log4jLoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog
13/04/29 15:50:16 INFO bsp.BSPJobClient: Running job: job_201304291546_0001
13/04/29 15:50:19 INFO bsp.BSPJobClient: Current supersteps number: 0
13/04/29 15:50:22 INFO bsp.BSPJobClient: Current supersteps number: 1
13/04/29 15:50:22 INFO bsp.BSPJobClient: The total number of supersteps: 1
13/04/29 15:50:22 INFO bsp.BSPJobClient: Counters: 6
13/04/29 15:50:22 INFO bsp.BSPJobClient:   org.apache.hama.bsp.JobInProgress$JobCounter
13/04/29 15:50:22 INFO bsp.BSPJobClient:     SUPERSTEPS=1
13/04/29 15:50:22 INFO bsp.BSPJobClient:     LAUNCHED_TASKS=3
13/04/29 15:50:22 INFO bsp.BSPJobClient:   org.apache.hama.bsp.BSPPeerImpl$PeerCounter
13/04/29 15:50:22 INFO bsp.BSPJobClient:     SUPERSTEP_SUM=3
13/04/29 15:50:22 INFO bsp.BSPJobClient:     TIME_IN_SYNC_MS=220
13/04/29 15:50:22 INFO bsp.BSPJobClient:     TOTAL_MESSAGES_SENT=3
13/04/29 15:50:22 INFO bsp.BSPJobClient:     TOTAL_MESSAGES_RECEIVED=3
Estimated value of PI is 3.1424
Job Finished in 6.432 seconds
정상적으로 설치가 잘 되었다면 위와 같이 Pi 계산 결과값이 나오는것을 볼 수 있습니다. 성공하셨나요? :D 그럼 다음으로 이제 좀 더 현실적인 예제 PageRank를 계산하는 예제를 실행하려면, 먼저 generator 커맨드로 100개의 vertices와 1,000개의 edge를 갖는 랜덤 그래프 데이터를 HDFS 상에 생성합니다.
$ bin/hama jar hama-examples-0.6.1.jar gen symmetric 100 10 randomgraph 2
13/04/29 15:54:45 INFO mortbay.log: Logging to org.slf4j.impl.Log4jLoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog
13/04/29 15:54:46 INFO bsp.BSPJobClient: Running job: job_201304291546_0002
13/04/29 15:54:49 INFO bsp.BSPJobClient: Current supersteps number: 0
13/04/29 15:54:52 INFO bsp.BSPJobClient: Current supersteps number: 1
13/04/29 15:54:52 INFO bsp.BSPJobClient: The total number of supersteps: 1
13/04/29 15:54:52 INFO bsp.BSPJobClient: Counters: 6
13/04/29 15:54:52 INFO bsp.BSPJobClient:   org.apache.hama.bsp.JobInProgress$JobCounter
13/04/29 15:54:52 INFO bsp.BSPJobClient:     SUPERSTEPS=1
13/04/29 15:54:52 INFO bsp.BSPJobClient:     LAUNCHED_TASKS=2
13/04/29 15:54:52 INFO bsp.BSPJobClient:   org.apache.hama.bsp.BSPPeerImpl$PeerCounter
13/04/29 15:54:52 INFO bsp.BSPJobClient:     SUPERSTEP_SUM=2
13/04/29 15:54:52 INFO bsp.BSPJobClient:     TIME_IN_SYNC_MS=121
13/04/29 15:54:52 INFO bsp.BSPJobClient:     TOTAL_MESSAGES_SENT=516
13/04/29 15:54:52 INFO bsp.BSPJobClient:     TOTAL_MESSAGES_RECEIVED=516
Job Finished in 6.279 seconds
그 다음 페이지랭크를 실행하면 끗~
$ bin/hama jar hama-examples-0.6.1.jar pagerank randomgraph pagerankresult 4


추가) 

테스트를 위한 구성으로 3대중 1대를 NameNode, DataNode 를
나머지 2대에 DataNode를 실행해서 HDFS를 올려놓습니다.
그 다음에 3대중 1대에 BSPMaster, GroomServer, ZooKeeper 를 나머지 2대에 GroomServer를 실행합니다. 즉,

서버1 - NameNode, DataNode, BSPMaster, GroomServer, Zookeeper
서버2 - DataNode, GroomServer
서버3 - DataNode, GroomServer

요렇게 띄워서 클러스터를 구성하면 됩니다. 설치 경로와 설정 파일은 서버 모두 동일하게 설정하셔야합니다.


'HAMA' 카테고리의 다른 글

HAMA 쉘 분석  (0) 2015.09.30
[하마 인사이드] 1. HAMA with K-Means  (0) 2015.05.05


자신만의 MOOCs (대규모 온라인 공개수업) 
을 찾는다면 아래

에 
흥미로운 다섯가지 플랫폼을 소개합니다.




2013년말, 많은 좋은 대학교들은 MOOC(massive open online course) 를 시작하고 제공해오고 있습니다. 지금부터 MOOC 프로덕트를 여러가지 관점에서 살펴볼겁니다.구글이나 테나리스같은 회사들은 MOOCs 를 그들의 직원을 트레이닝 시키기위해 사용하고 있으며, 몽고DB 는 개발자들을 MOOC 를 이용해서 교육하고있습니다. Udemy 같은곳에서는 수많은 개인강사들이 클래스를 가지고있습니다.
만약 당신이 MOOC 를 고려중이라면, 어떤 플랫폼을 선택할것인가가 첫번째로 해야할것입니다.
아래에 다섯가지 유명한 무료 MOOC 플랫폼을 살펴보도록 하겠습니다.



edX

Edx 는 edX.org 에서 제공하는 오픈소스 플랫폼이다. 100,000 명이 넘는 학생들에게 강좌를 제공하기 위해  MIT 나 하버드같은 대학교들이 사용하고있다. 2013년 3월에 오픈소스로 릴리즈되었으며 목적은 MOOC 플랫폼을 위한 워드프레스같은 것이다. 핵심 기능을 확장하기위한 플러그인들을 제공하며, edX 는  빠르고 모던한  UI 를 가지고있고 많은 수의 학생들을 참여시킬수있는 능력이 있다. 

edX 는 모던하며,유연하고, 강력한 코스매니지먼트플랫폼을 구성하는데 적합하다. 

Moodle

무들은 오픈소스학습매니지먼트 시스템이다.(LMS) 이것은 사용자에게 온라인 코스들을 제공하고 빌드할수있게 해준다. MOOCs 보다는 다소 전통적인 클래스룸의 형태를 취한다.
edX 보다는 인스톨하기 훨씬 쉬우며,  원클릭 인스톨옵션도 활용가능하다.

무들은 많은 기능들을 사용자가 입맛에 맞춰서 꾸밀때 좋으며,  edX 보다 더 많은 교육용도구를 제공한다. (퀴즈,완전학습,평가,분석 뭐 이런) 

다소 단점이라고 볼수있는건 10년이 넘은 오래된 플랫폼이란건데, 많은 활용가능한 옵션들과 플러그인들이 상쇄시켜줄것이다. 


CourseSites by Blackboard

블랙보드에 의해서 만들어진 코스사이트는 굉장히 강력한 플랫폼이다. 무들이 가지고 있는 확장성있는 티칭 툴들 및 리포팅 과 SCORM (공유가능 컨텐츠 객체참조모형)과 같은 대부분의 모습들을 가지고있다. 또한 클라우드 베이스이며 당신은 몇분안에 하나의 코스를 세팅할수도있고, 유지보수 및 업그레이드에 많은 걱정을 할 필요가 없다.

서비스는 5 라이브코스까지 무료이다. 단점은 블랙보드 로고가 박힌다는 점이며 당신의 학생들은 코스에 가입하기위하여 블랙보드에 등록되야한다. 

코스사이트는 개인들을 위해서 좋은 옵션이 있다. - 예를들어 온라인포맷으로 커리큘럼의 일부를 이주시키길 원하는 선생님 - 또는 온라인 코스를 실험적으로 시작해보려는 조직등..

최저의 유지비용을 가지고 많은 형태의 서비스를 제공하는것에서 코스사이트는 좋은 옵션이다.


Udemy (free version)

Think of it as the YouTube of MOOCs. Instructors can build and host their own courses on the platform and then offer them to users for free or for a fee.

Udemy is for individuals who want to easily build basic courses and monetize them. The platform is full of coders, photographers, designers and other specialists who offer their knowledge in the form of an online course. Udemy’s most distinct strength is its base of 2,000,000 registered students. When you build a course on Udemy, you are able to reach this pool of potential students.

Versal (free version)

Versal is an intriguing new platform. Its major strengths are a sleek, intuitive user interface and a robust drag-and-drop functionality. A user can sign up for free and then build a course that includes mathematical expressions, image drill-downs and many more widgets, all without any coding knowledge. Users can also embed their published courses on other websites, such as personal blogs.

Versal can’t fairly be called a MOOC platform, because it lacks certain MOOC elements. In particular, there is currently no forum or discussion functionality. Instead, it can be thought of as a strong tutorial platform.

Versal is most suited to individuals who want to quickly build sleek tutorials — for example, a teacher who builds an assignment for his students, or a musician who builds a short course on music theory and posts it on his or her blog. Versal is a young product, and the company is planning to develop some of the features that its platform currently lacks. This is one to keep an eye on.

Which platform you choose depends on what assumptions you make about your course. Most of these platforms offer demos on their site. It helps to be able to play around in a course and try to imagine your content with a similar look and feel. Finally, don’t worry about changing your mind early on. These platforms all rely on much of the same content (YouTube videos, PDFs, quizzes, etc), so it is easy to migrate a course halfway through the building process.




번역 : http://www.edtechmagazine.com/higher/article/2014/02/comparison-five-free-mooc-platforms-educators


메모리맵 파일이란?

거의 대부분의 어플리케이션들이 파일에 대한 i/o 작업을 수행함에도 불구하고,  파일에 대한 작업은 항상 개발자들을 괴롭혀온 요소 중 하나임이 틀림없다. 어떻게 파일을 열고, 읽고, 닫는 것이 좋은가 혹은 파일을 열고나서 그 내용을 읽고 쓸 때 얼마만큼의 내용을 버퍼링 하는것이 좋은가와 같은 의문들이 우리를 괴롭히는 좋은 예라 하겠다. 윈도우즈 OS 는 이 두가지 서로다른 형태의 질문에 대한 최상의 해결책을 메모리 맵 파일로 제시한다. 메모리 맵 파일 기능은 가상 메모리처럼 주소 공간을 예약하고, 예약된 영역에 물리적 저장소를 커밋하는 기능을 제공하고있다. 유일한 차이점이라면 시스템의 페이징 파일을 사용하는 대신 디스크 상에 존재하는 파일을 물리적 저장소로 사용한다는것이다. 이러한 파일이 일단 영역에 매핑되면 마치 메모리에 파일의 내용이 모두 로드된것처럼 사용할수 있다.


메모리맵 파일이 사용되는 3가지 이유 

- 시스템은 .exe 나 DLL 파일을 읽고 수행하기 위해 메모리 맵 파일을 사용한다. 메모리 맵 파일을 사용함으로써 시스템은 페이징 파일의 크기를 일정하게 유지할수 있으며, 어플리케이션의 시작 시간도 일정하게 유지할수있다.
- 디스크에 있는 데이터에 접근하기 위해 메모리 맵 파일을 사용할수 있다. 메모리 맵 파일을 사용하면 파일에 대한 i/o 작업이나 파일의 내용에 대한 버퍼링을 자동적으로 수행해준다.
- 동일한 머신에서 수행 중인 다수의 프로세스 간에 데이터를 공유하기 위해 메모리 맵 파일을 사용할수있다. 윈도우는 프로세스들 사이에 데이터를 전달하는 다양한 방법들을 제공하지만 내부적으로는 모두메모리 맵 파일을 사용하여 구현되었으며, 실제로 메모리 맵 파일을 사용하는것이 단일의 머신에서 프로세스 간 데이터를 전달하는 가장 효과적인 방법이다.


장점과 단점



장점

직접적인 파일 입출력을 수행할 필요가 없다. 메모리 맵 파일을 사용하면 파일 내용이 메모리 주소에 사상되므로 파일을 모두 불러온 것처럼 메모리 주소를 이용하여 연산 작업을 할 수 있어 코드가 깔끔해지고 유지보수가 편해진다.

버퍼나 파일 처리를 위한 추가적인 자료 구조가 필요 없다. 운영 체제에서 페이징 기법을 사용하여 파일의 내용을 관리하며, 페이지 크기(보통 4KiB)에 따라 적절히 파일의 내용을 읽고 쓸 수 있으며 파일 반영(flush) 작업도 수행해준다.

대용량의 자료를 처리할 때도 매우 효율적이다. 파일에 접근할 때 지연 적재를 이용하므로, 파일의 크기가 매우 크더라도 필요한 부분만 파일에서 불러와 작업할 수 있으며, 작업이 끝난 데이터는 자동으로 파일에 반영된다.

전통적인 파일 입출력 API보다 속도가 빠르다. API는 시스템 호출을 사용하기 때문에 작업을 수행하는 동안 유저 모드와 커널 모드를 전환하는 데 필요한 인터럽트가 오버헤드로 작용하게 된다. 메모리 맵 파일은 4KiB 단위로 자료를 미리 불러올 때 발생하는 페이지 부재외의 모든 작업이 실제 메모리상에서 이루어지므로 대부분 파일 API를 통한 파일 처리보다 빠르다.[1]

단점

POSIX와 윈도에서 파일의 크기(즉, EOF의 위치)를 변경할 수 없다. 파일 입출력 API에서는 간편한 방법으로 파일의 크기를 변경하는 방법을 제공한다.[2] 메모리 맵 파일은 파일의 크기를 바꿀 수는 없으며 메모리 맵 파일을 사용하기 이전, 또는 이후에만 파일의 크기를 바꿀 수 있다.[3]

메모리 맵 파일을 이용한 접근은 최적의 파일 접근 방식은 아니다. 파일 입출력 API를 사용한 방법이 API의 오버헤드인 것에 비해 메모리 맵 파일에서는 페이지 부재중의 데이터 전송 시간이 오버헤드로 작용한다.[4] 따라서 데이터베이스와 같이 파일을 읽고 쓰는데 오버헤드를 최소로 줄인 자료구조와 알고리즘과 메모리 맵 파일을 비교할 때 오히려 메모리 맵 파일이 느릴 수도 있다.

크기가 지나치게 큰 파일을 처리하는 데 어려움이 있다. IA-32 기반 시스템에서 하나의 프로세스에서 PAE 기술을 사용하지 않고 사용 가능한 최대 크기는 4GB로 제한된다.[5] 따라서 프로세스의 메모리 주소를 사용하는 메모리 맵 파일이 한번에 다룰 수 있는 크기는 이보다 작아지며, 이 크기를 넘어가는 파일을 메모리 맵 파일로 다루려 할 때 계산이 복잡해질 수 있다.


언어별 지원


- 자바에서는 FileChannel 클래스를 통해 메모리 맵 파일 기능을 제공한다.

- 닷넷 프레임워크에서는 MemoryMappedFile 클래스를 통해 메모리 맵 파일을 제공하고 있다.

- 파이썬에서는 mmap 클래스를 통해 메모리 맵 파일을 제공하고 있다. 다만, 윈도와 POSIX 기반     운영 체제에서 클래스 구조가 다르므로 주의가 필요하다.

- Boost에서도 메모리 맵 파일기능을 제공한다.



예제 1



메모리 맵 데이터 파일을 사용하는것이 얼마나 편리한지를 이해하기 위해 파일의 내용을 바이트 단위로 뒤집는 네가지 방법에 대해 살펴보도록하자.


방법1 : 한개의 파일, 한개의 버퍼

  => 파일을 열고, 버퍼에 담고, 뒤짚은후에 , 다시 파일에 쓴다.

방법2: 두개의 파일, 한개의 버퍼

  => 파일을 열고, 일정량을 읽고, 다른 파일 ( 아무것도 없는) 을 열어서, 그 파일에다 쓴다. 

방법3: 한개의 파일, 두개의 버퍼

  => 파일을 열고,  파일의 앞부분, 뒷부분을 각각 버퍼에 담은후에, 뒤짚은후에 파일에 쓴다.

방법4: 한개의 파일, 버퍼는 사용하지 않음 

  => 파일을  가상주소공간상에 매핑한후에 그대로 뒤짚는다. (_tcsrev C 함수 이용)


예제 2



메모리 맵 파일을 이용하여 큰 파일 처리하기.

굉장히 큰 파일을 메모리맵 파일로 처리하려면, 한방에 파일 전체를 매모리에 매핑하는것은 불가능하다.
대신 파일 데이터의 일부분만을 나타낼수 있는 뷰를 주소 공간에 매핑해야한다. 
이렇듯 일부분만 뷰로 접근한후에, 매핑을 해제하고 다시 파일의 다른 부분에 대한 뷰를 구성하는식으로 반복해야한다. 


// 1. 데이터 파일을 열고

// 2. 파일 매핑 오브젝트를 생성하고 

// 3. 반복하면서 뷰를 통해 파일 내의 어느 부분을 얼마만큼 매핑할지를 결정한다. 

// 3.1뷰 내의 블록으로부터 비지니스 로직을 실행한다.

// 3.2뷰를 해제한다. 

// 3.3파일 내의 다른 영역 계산 


3번을 

 파일 끝까지 반복한다.


  1. void HandleBigFile()
  2. {
  3.     // 뷰는 항상 할당 단위의 배수로 시작해야 한다.
  4.     SYSTEM_INFO si;
  5.     GetSystemInfo(&si);
  6.  
  7.     // 읽기 전용으로 파일을 연다.
  8.     HANDLE hFile = CreateFile(TEXT("C:\\BigFile.dat"),
  9.                               GENERIC_READ, 0NULL, OPEN_EXISTING,
  10.                               FILE_FLAG_SEQUENTIAL_SCAN, NULL);
  11.  
  12.     // 파일의 크기 만큼 파일 매핑 오브젝트를 연다.
  13.     HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READ_ONLY, 000);
  14.  
  15.     // 파일의 크기를 구한다.
  16.     DWORD dwFileSizeHigh;
  17.     __int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
  18.     qwFileSize += ( ((__int64)dwFileSize) << 32 );
  19.  
  20.     __int64 qwFileOffset = 0;
  21.  
  22.     while (qwFileSize > 0)
  23.     {
  24.         // 만약 남은 파일 크기가 1MB보다 적다면, 남은 크기만큼만 뷰로 맵핑한다.
  25.         DWORD dwBytesInBlock = sinf.dwAllocationGranularity * 16;
  26.         if (qwFileSize < sinf.dwAllocationGranularity * 16)
  27.         {
  28.             dwBytesInBlock = qwFileSize;
  29.         }
  30.  
  31.         PBYTE pbFile = (PBYTE)MapViewOfFile(hFileMapping, FILE_MAP_READ,
  32.                                             (DWORD)(qwFileOffset >> 32),  // 상위 오프셋
  33.                                             (DWORD)(qwFileOffset & 0xFFFFFFFF), // 하위 오프셋
  34.                                             dwBytesInBlock);
  35.  
  36.         // 뷰 내의 메모리에 대해 처리를 한다
  37.  
  38.         // 뷰를 다 썼으므로, 뷰를 해제한다.
  39.         UnmapViewOfFile(hFileMapping);
  40.  
  41.         // 오프셋 및 남은 파일 크기 갱신
  42.         qwFileOffset += dwBytesInBlock;
  43.         qwFileSize -= dwBytesInBlock;
  44.     }
  45.  
  46.     // 처리가 완전히 끝났으므로 파일 매핑 오브젝트와 파일 오브젝트를 닫아준다.
  47.     CloseHandle(hFileMapping);
  48.     CloseHandle(hFile);
  49. }



자바의 FileChannel


nio

http://examples.javacodegeeks.com/core-java/nio/filechannel/java-nio-channels-filechannel-example/

http://javarevisited.blogspot.kr/2012/01/memorymapped-file-and-io-in-java.html

The theme of wrapping ByteBuffer objects around arbitrary memory spaces continues withMappedByteBuffer, a specialized form of ByteBuffer. On most operating systems, it's possible to memory map a file using the mmap() system call (or something similar) on an open file descriptor. Calling mmap()returns a pointer to a memory segment, which actually represents the content of the file. Fetches from memory locations within that memory area will return data from the file at the corresponding offset. Modifications made to the memory space are written to the file on disk.

memory mapping
Figure 7: User memory mapped to the filesystem.

There are two big advantages to memory mapped files. First, the "memory" does not usually consume normal virtual memory space. Or, more correctly, the virtual memory space of a file mapping is backed by the file data on disk. That means it's not necessary to allocate regular paging space for mapped files; their paging area is the file itself. If you were to open the file conventionally and read it into memory, that would consume a corresponding amount of paging space, because you're copying the data into regular memory. Second, multiple mappings of the same file share the same virtual address space. Theoretically, 100 mappings can be established by 100 different processes to the same 500MB file; each will appear to have the entire 500MB of data in memory, but the overall memory consumption of the system won't change a bit. Pieces of the file will be brought into memory as references are made, which will compete for RAM, but no paging space will be consumed.

In Figure 7, additional processes running in user space would map to that same physical memory space, through the same filesystem cache and thence to the same file data on disk. Each of those processes would see changes made by any other. This can be exploited as a form of persistent, shared memory. Operating systems vary in the way their virtual memory subsystems behave, so your mileage may also vary.

MappedByteBuffer instances are created by invoking the map() method on an open FileChannel object. The MappedByteBuffer class has a couple of additional methods for managing caching and flushing of updates to the underlying file.

Prior to NIO, it wasn't possible to memory map files without resorting to platform-specific, non-portable native code. It's now possible for any pure Java program to take advantage of memory mapping, easily and portably.



레퍼런스:

제프리리처의 Windows via C/C++

위키백과 

자바I/O & NIO  네트워크 프로그래밍 (김성박/송지훈) 



+ Recent posts