원본 코드
package org.apache.zeppelin.python;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import py4j.GatewayServer;
import java.io.IOException;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.security.SecureRandom;
import java.util.Properties;
public class PythonUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(PythonUtils.class);
public static GatewayServer createGatewayServer(Object entryPoint,
String serverAddress,
int port,
String secretKey) throws IOException {
LOGGER.info("Launching GatewayServer at {}:{}", serverAddress, port);
try {
return new GatewayServer.GatewayServerBuilder(entryPoint)
.authToken(secretKey)
.javaPort(port)
.javaAddress(InetAddress.getByName(serverAddress))
.callbackClient(port, InetAddress.getByName(serverAddress), secretKey)
.build();
} catch (Exception e) {
throw new IOException(e);
}
}
public static String getLocalIP(Properties properties) {
// zeppelin.python.gatewayserver_address is only for unit test.
// Because the FQDN would fail unit test.
String gatewayserver_address =
properties.getProperty("zeppelin.python.gatewayserver_address");
if (gatewayserver_address != null) {
return gatewayserver_address;
}
try {
return Inet4Address.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
LOGGER.warn("can't get local IP", e);
}
// fall back to loopback addreess
return "127.0.0.1";
}
public static String createSecret(int secretBitLength) {
SecureRandom rnd = new SecureRandom();
byte[] secretBytes = new byte[secretBitLength / java.lang.Byte.SIZE];
rnd.nextBytes(secretBytes);
return Base64.encodeBase64String(secretBytes);
}
}
코드 분석
이 코드는 Apache Zeppelin에서 Python과 Java 간의 통신을 지원하는 유틸리티 클래스 PythonUtils를 정의함.
이 클래스는 Py4J GatewayServer 설정, 로컬 IP 주소 획득, 그리고 보안 키 생성과 관련된 기능들을 제공함.
주요 클래스 및 메서드 분석
1. 클래스 및 로깅 설정
public class PythonUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(PythonUtils.class);
PythonUtils 클래스는 로깅을 위해 SLF4J 로그를 사용함.
LOGGER는 이 클래스에서 발생하는 중요한 이벤트나 예외를 기록하는 데 사용됨.
2. createGatewayServer 메서드
public static GatewayServer createGatewayServer(Object entryPoint,
String serverAddress,
int port,
String secretKey) throws IOException {
LOGGER.info("Launching GatewayServer at {}:{}", serverAddress, port);
try {
return new GatewayServer.GatewayServerBuilder(entryPoint)
.authToken(secretKey)
.javaPort(port)
.javaAddress(InetAddress.getByName(serverAddress))
.callbackClient(port, InetAddress.getByName(serverAddress), secretKey)
.build();
} catch (Exception e) {
throw new IOException(e);
}
}
이 메서드는 Py4J의 GatewayServer를 생성함.
GatewayServer는 Python과 Java 간의 통신을 가능하게 하는 서버임.
메서드는 다음과 같은 매개변수를 받음.
- entryPoint: GatewayServer가 노출될 자바 객체
- serverAddress: 서버가 바인딩될 주소
- port: 서버가 사용할 포트 번호
- secretKey: 인증에 사용되는 비밀 키
이 메서드는 GatewayServer.GatewayServerBuilder를 사용해 서버를 설정하고, 예외 발생 시 IOException을 던짐.
3. getLocalIP 메서드
public static String getLocalIP(Properties properties) {
String gatewayserver_address =
properties.getProperty("zeppelin.python.gatewayserver_address");
if (gatewayserver_address != null) {
return gatewayserver_address;
}
try {
return Inet4Address.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
LOGGER.warn("can't get local IP", e);
}
return "127.0.0.1";
}
이 메서드는 로컬 IP 주소를 반환함.
properties 객체에서 zeppelin.python.gatewayserver_address 속성이 있는지 확인하고, 존재하면 해당 값을 반환함
속성이 없다면, Inet4Address.getLocalHost().getHostAddress()를 통해 로컬 IP를 가져오려 시도함
이 과정에서 UnknownHostException이 발생하면 경고 로그를 남기고, 127.0.0.1을 반환함
4. createSecret 메서드
public static String createSecret(int secretBitLength) {
SecureRandom rnd = new SecureRandom();
byte[] secretBytes = new byte[secretBitLength / java.lang.Byte.SIZE];
rnd.nextBytes(secretBytes);
return Base64.encodeBase64String(secretBytes);
}
이 메서드는 지정된 비트 길이의 비밀 키를 생성함.
SecureRandom을 사용해 암호화 강도의 무작위 바이트 배열을 생성하고, 이 배열을 Base64로 인코딩한 문자열을 반환함.
secretBitLength는 생성할 비밀 키의 비트 길이를 지정함.
정리
이 PythonUtils 클래스는 Apache Zeppelin에서 Python과의 상호작용을 지원하기 위한 다양한 유틸리티 기능을 제공함.
Py4J의 GatewayServer를 설정하여 Java-Python 간의 통신을 설정하고, 로컬 IP 주소를 조회하며, 보안 키를 생성하는 기능일 포함함.
이러한 기능들은 Zeppelin이 Python 코드와 안정적으로 상호작용할 수 있도록 도움.
'Data Engineering > Zeppelin' 카테고리의 다른 글
[Zeppelin] 아파치 제플린의 ZeppelinConfiguration (0) | 2024.08.25 |
---|---|
[Zeppelin] 아파치 제플린 내부통신 (0) | 2024.08.22 |
[Zeppelin] zeppelin/python/src/main/java/org/apache/zeppelin/python/PythonZeppelinContext.java 분석 (0) | 2024.08.21 |
[Zeppelin] zsh: command not found: docker-compose (0) | 2024.08.17 |
[Zeppelin] Apache Thrift (0) | 2024.08.16 |