Linux

대규모 이미지 처리를 위한 리눅스 클러스터와 Java의 궁합은??

hongiiv 2008. 4. 21. 15:39
반응형
일전에 저는 MySQL 데이터베이스로 부터 대규모의 이미지를 생성하려고, 윈도우상에서 Java 코드를 작성했습니다. 이 Java 코드는 Frame안에 Panel을 만들고, DB에서 좌표값을 받아와서 이 Panel안에 그림을 그리게 됩니다. 이렇게 만들어진 Java Frame을 통째로 이미지 파일로 만드는 아주 간단한 코드입니다.

//Java 프레임을 만듭니다.
Frame f = new Frame("Frame");
f.setBounds(0, 0, 400, 400);
f.setTitle("Component Testing");

//노란색 패널을 만듭니다.
JPanel BasePanel = new JPanel();
BasePanel.setLayout(null);
BasePanel.setBounds(0, 0, 400, 400);
BasePanel.setBackground(Color.yellow);

//프레임에 패널을 착 붙이고, 보여줍니다.
f.add(BasePanel);
f.setVisible(true);

//2D 그래픽 객체에 패널을 내용을 구겨 넣고, 이를 hello.png에 출력합니다.
BufferedImage image = new BufferedImage(350, 350,BufferedImage.TYPE_INT_RGB);
Graphics2D g = image.createGraphics();
BasePanel.paint(g);

try{
ImageIO.write(image,"png",new File("hello.png"));
}catch(Exception e){}

이젠 이 코드를 90여대의 리눅스 클러스터에서 실행하기 위해 각각의 노드(90여대의 클러스터를 이루는 1대의 컴퓨터)에 적당히 일을 나누어 주고 실행하면 엄청난 양의 이미지를 빠르게 만들어 낼 수 있게 된다는 즐거운 마음으로 코드를 실행했는데, 그만 각 클러스터의 노드들이 에러를 내뱉으면서 실행을 거부를 해버리는 상황이 발생했습니다. 물론 콘솔상에서입니다.

K-20080421-581088
나 에러 나온 콘솔이야~

그 이유는 Java의 그래픽 관련 코드를 실행하기 위해서는 리눅스의 GUI 환경인 X 상에서 실행이 되어야 하기 때문이었습니다. 따라서 X가 설치되어 있지 않은 리눅스 클러스터의 노드들에서는 당연히 에러가 발생하게 되고 PBS나 LoadLeveler와 같은 배치 작업을 수행할 수도 없는 상황이 벌어지게 된것입니다.

"자바코드 + PBS(배치스크립트) = 대량의 이미지 파일 생성"의 꿈이 휙하니 날아가버리는 소리가 ㅜㅜ 분산된 각각의 컴퓨터 노드에서 Java의 그래픽을 사용할 수 있는 방법은 우선 뭐가 되었던지 X 가 가능해야 합니다. 그런 후 리눅스의 DISPLAY를 적절히 사용해서 Java를 실행해야 한다는 소린데,,, 이것 때문에 머리가 좀...

참고 : Using Headless Mode in the Java SE Platform
         HeadlessException in JComponent.paint() when java.awt.headless=true

물론 awt를 쓰지 않고 그래픽을 객체를 생성하고 이미지 파일을 만드는 작업은 -Djava.awt.headless=true 옵션을 통해서 가능한데, Frame이나 Panel등이 나오기만 하면 안되니,,, 누가 Java를 Write once Run anywhere(맞나??)라고 했던가...


반응형