티스토리 뷰
HDFS 라이브러리가 없다?
Flink 를 테스트로 운영할때는 HA 나 savepoint, checkpoint 정보가 필요없을수 있지만, 운영환경에서 관리하기위해서는 해당 정보가 남을수 있도록 해야하고, 이럴때 HDFS 를 연계해서 사용한다. 그러다보니 내가 사용하는 하둡클러스터의 환경에 영향을 받는다.
즉, 관련된 세팅을 했을때 아래와 같은 오류가 발생한다면 hdfs 연결을 못하는 상황일 확률이 크다.
java.io.IOException: Could not create FileSystem for highly available storage path
org.apache.flink.core.fs.UnsupportedFileSystemSchemeException: Could not find a file system implementation for scheme 'hdfs'
2023-02-17 10:36:35,764 INFO akka.remote.Remoting [] - Starting remoting
2023-02-17 10:36:35,891 INFO akka.remote.Remoting [] - Remoting started; listening on addresses :[akka.tcp://flink@myserver001.home.com:45762]
2023-02-17 10:36:35,997 INFO org.apache.flink.runtime.rpc.akka.AkkaRpcServiceUtils [] - Actor system started at akka.tcp://flink@myserver001.home.com:45762
2023-02-17 10:36:36,020 INFO org.apache.flink.runtime.entrypoint.ClusterEntrypoint [] - Shutting StandaloneSessionClusterEntrypoint down with application status FAILED. Diagnostics java.io.IOException: Could not create FileSystem for highly available storage path (hdfs://my-nameservice/user/gildong/flink-1.14/ha/flink-prod)
at org.apache.flink.runtime.blob.BlobUtils.createFileSystemBlobStore(BlobUtils.java:92)
at org.apache.flink.runtime.blob.BlobUtils.createBlobStoreFromConfig(BlobUtils.java:76)
at org.apache.flink.runtime.highavailability.HighAvailabilityServicesUtils.createHighAvailabilityServices(HighAvailabilityServicesUtils.java:123)
at org.apache.flink.runtime.entrypoint.ClusterEntrypoint.createHaServices(ClusterEntrypoint.java:361)
at org.apache.flink.runtime.entrypoint.ClusterEntrypoint.initializeServices(ClusterEntrypoint.java:318)
at org.apache.flink.runtime.entrypoint.ClusterEntrypoint.runCluster(ClusterEntrypoint.java:243)
at org.apache.flink.runtime.entrypoint.ClusterEntrypoint.lambda$startCluster$1(ClusterEntrypoint.java:193)
at org.apache.flink.runtime.security.contexts.NoOpSecurityContext.runSecured(NoOpSecurityContext.java:28)
at org.apache.flink.runtime.entrypoint.ClusterEntrypoint.startCluster(ClusterEntrypoint.java:190)
at org.apache.flink.runtime.entrypoint.ClusterEntrypoint.runClusterEntrypoint(ClusterEntrypoint.java:617)
at org.apache.flink.runtime.entrypoint.StandaloneSessionClusterEntrypoint.main(StandaloneSessionClusterEntrypoint.java:59)
Caused by: org.apache.flink.core.fs.UnsupportedFileSystemSchemeException: Could not find a file system implementation for scheme 'hdfs'. The scheme is not directly supported by Flink and no Hadoop file system to support this scheme could be loaded. For a full list of supported file systems, please see https://nightlies.apache.org/flink/flink-docs-stable/ops/filesystems/.
at org.apache.flink.core.fs.FileSystem.getUnguardedFileSystem(FileSystem.java:532)
at org.apache.flink.core.fs.FileSystem.get(FileSystem.java:409)
at org.apache.flink.core.fs.Path.getFileSystem(Path.java:274)
at org.apache.flink.runtime.blob.BlobUtils.createFileSystemBlobStore(BlobUtils.java:89)
... 10 more
Caused by: org.apache.flink.core.fs.UnsupportedFileSystemSchemeException: Hadoop is not in the classpath/dependencies.
at org.apache.flink.core.fs.UnsupportedSchemeFactory.create(UnsupportedSchemeFactory.java:55)
at org.apache.flink.core.fs.FileSystem.getUnguardedFileSystem(FileSystem.java:528)
... 13 more
해결방안
가장쉬운방법은?
Flink lib 폴더에 "Flink Shaded Hadoop 2 Uber" 같은 파일을 찾아서 다운로드 받아서 복사하는게 가장 쉽다.
복잡한게 싫다면 해당 파일을 $FLINK_HOME/lib 폴더에 복사후 기동을 시도해보자.
참고로 나는 hdp hadoop 2.7 버전의 클러스터환경에서 저 라이브러리를 복사후 잘 사용했다.
(하지만, hadoop 3 버전대의 연동할 때 flink shaded hadoop 3 uber 버전은 사용에 실패했다 이 내용은 아래 방법을 참고하자)
더 좋은방법은? HADOOP_CLASSPATH 지정
남이 빌드해놓은 "Flink Shaded Hadoop Uber" 를 사용하면 간편한데, 하둡버전이 차이가 나면 아래와 같은 오류가 발생하면서 사용을 못하는 경우가 존재했다. 개인적으로는 Hadoop 3.x 버전대로 올리면서 "flink-shaded-hadoop-3-uber-3.1.1.7.0.3.0-79-7.0.jar" 파일을 찾아 테스트했는데 API 스펙이 바뀐건지 아래와 같은 오류가 발생하면서 해결을 못해서 한참 고생했는데...
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.commons.cli.Option.builder(Ljava/lang/String;)Lorg/apache/commons/cli/Option$Builder;
at org.apache.flink.runtime.entrypoint.parser.CommandLineOptions.<clinit>(CommandLineOptions.java:27)
at org.apache.flink.runtime.entrypoint.EntrypointClusterConfigurationParserFactory.getOptions(EntrypointClusterConfigurationParserFactory.java:43)
at org.apache.flink.runtime.entrypoint.parser.CommandLineParser.parse(CommandLineParser.java:42)
at org.apache.flink.runtime.entrypoint.ClusterEntrypointUtils.parseParametersOrExit(ClusterEntrypointUtils.java:64)
at org.apache.flink.runtime.entrypoint.StandaloneSessionClusterEntrypoint.main(StandaloneSessionClusterEntrypoint.java:50)
결국 해결책을 찾은게 설치된 하둡환경의 HADOOP_CLASSPATH 를 지정하여 해결했다. 그래서 조금 복잡해 보일수 있지만 HADOOP_CLASSPATH 를 지정후 기동하는걸 추천한다. 참고로 아래 path 는 나의 서버 환경을 예시로 적은것이고, 실제 각자의 서버환경에 맞춰서 경로는 수정해줘야한다.
export HADOOP_HOME=/usr/hdp/3.3.0.0-1/hadoop
export HADOOP_CONF_DIR=${HADOOP_HOME}/conf
export HADOOP_CLASSPATH=$(find $HADOOP_HOME/client -name '*.jar' | xargs echo | tr ' ' ':')
그리고, 당연한 이야기지만, 설정이 매번 자동으로 먹게 하려면 ~/.bash_profile 같은곳에 설정을 구성해야 한다.
한국에는 Flink 관련 문서가 안나와서 이런 오류 해결을 찾기가 더 어려운것 같다. 쳇..