긴 이야기 짧게
mount 명령을 통해 퓨즈 파일 시스템을 마운트할 때 환경 변수가 퓨즈 스크립트로 전달되지 않습니다. 왜?
문맥
퓨즈를 통해 hdfs(hadoop 파일 시스템)를 마운트하려고 합니다.
명령줄에서는 쉽습니다.
# Short example version:
LD_LIBRARY_PATH=blah hadoop-fuse-dfs -onotrash dfs://ambari:8020 /mnt/hdfsfuse
# Actual version with full path for completeness
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/hadoop/yarn/local/filecache/11/mapreduce.tar.gz/hadoop/lib/native /usr/hdp/2.5.0.0-1245/hadoop/bin/hadoop-fuse-dfs -onotrash dfs://ambari:8020 /mnt/hdfsfuse
이것은 모두 훌륭하지만 FS 정의를 /etc/fstab에 넣은 다음 mount 명령을 사용하면 다음과 같이 끝납니다.
fusion_dfs: 공유 라이브러리를 로드하는 중 오류가 발생했습니다. libjvm.so: 공유 개체 파일을 열 수 없습니다. 해당 파일이나 디렉터리가 없습니다.
hadoop-fuse-dfs 스크립트를 보고 디버그 출력을 추가하면 이 스크립트에서 LD_LIBRARY_PATH가 비어 있는 것으로 처리되는 것을 볼 수 있습니다. (LD_LIBRARY_PATH를 먼저 내보내거나 명령 시작 부분에 추가하는 경우에 해당됩니다.)
체계
hdp 2.5, 센토스 7
질문
마운트 스크립트를 하드코드 LD_LIBRARY_PATH로 다시 작성하지 않고 마운트를 통해 일반 환경 변수를 전달하려면 어떻게 해야 합니까?
답변1
실제 퓨즈 스크립트를 호출하는 설치 퓨즈 도우미를 직접 작성할 수 있습니다. 예를 들어 fstab 항목의 간단한 경우:
dfs://ambari:8020 /mnt/hdfsfuse fuse.mydfshelper flag,flag,...
그런 다음 /usr/bin/mydfshelper
args를 사용하여 스크립트를 호출하십시오.
dfs://ambari:8020 /mnt/hdfsfuse -o flag,flag,...
mydfshelper
따라서 다음과 같이 한 줄의 내용만 작성하면 됩니다 .
#!/bin/bash
LD_LIBRARY_PATH=blah hadoop-fuse-dfs -onotrash "$@"
답변2
내 특정 문제(LD_LIBRARY_PATH)를 해결하기 위한 가장 쉬운 방법은 /etc/ld.so.conf.d 아래의 파일에 변수 내용을 추가하는 것임을 알았습니다. 예를 들어 다음 내용으로 /etc/ld.so.conf.d/hdp.conf를 만들었습니다.
/usr/java/jdk1.8.0_66/jre/lib/amd64/server
/usr/hdp/2.5.0.0-1245/usr/lib
루트로 한 번 실행한 후에는 ldconfig
이 새로운 "ld_library_path"를 시스템 전체에서 사용할 수 있습니다.
일반적인 환경 변수에 대한 질문에 대답하려면,@meuh의 답변그게 제일이야.