如果您希望將OSS-HDFS服務映射為一個本地文件系統,然后通過標準的文件系統接口(例如讀、寫、刪除文件等)訪問OSS-HDFS服務中的文件,您可以使用JindoFuse掛載訪問的方式。JindoFuse是一個開源的分布式文件系統訪問工具,同時兼容POSIX,使得AI應用程序可以直接使用OSS-HDFS服務作為數據存儲和處理的解決方案。
前提條件
已開通并授權訪問OSS-HDFS服務。具體操作,請參見開通并授權訪問OSS-HDFS服務。
環境準備
您可以選擇以下任意一種方式訪問OSS-HDFS服務。
通過阿里云EMR訪問OSS-HDFS服務,確保已創建EMR-3.44.0及以上版本或EMR-5.10.0及以上版本的集群。滿足版本要求的EMR集群默認集成了JindoFuse。具體操作,請參見創建集群。
通過非阿里云EMR訪問OSS-HDFS服務,確保已安裝和部署4.6.2及以上版本JindoSDK。具體操作,請參見在非EMR集群中部署JindoSDK。
操作步驟
配置環境變量。
如果通過阿里云EMR訪問OSS-HDFS服務,則直接跳過此步驟,執行下一步。
如果通過非阿里云EMR訪問OSS-HDFS服務,則按照以下說明配置JindoFuse。
連接ECS實例。具體操作,請參見連接ECS實例。
添加環境變量。
以jindosdk-x.x.x(x.x.x表示JindoSDK的版本號)安裝在root/路徑為例。請根據JindoSDK安裝的實際路徑修改環境變量。
export JINDOSDK_HOME=/root/jindosdk-x.x.x export HADOOP_CLASSPATH=`hadoop classpath`:${JINDOSDK_HOME}/lib/* export JINDOSDK_CONF_DIR=/root/jindosdk-x.x.x/conf export PATH=$PATH:$JINDOSDK_HOME/bin export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${JINDOSDK_HOME}/lib/native
添加配置文件。
在JindoSDK的conf/目錄下新建配置文件jindosdk.cfg。
在jindosdk.cfg配置文件中添加以下配置項。
[common] logger.dir = /tmp/fuse-log [jindosdk] <!-- 以下以杭州地域為例,其他地域請根據實際情況替換。 --> fs.oss.endpoint = cn-hangzhou.oss-dls.aliyuncs.com <!-- 配置訪問OSS-HDFS服務的AccessKeyId、AccessKeySecret。 --> fs.oss.accessKeyId = LTAI******** fs.oss.accessKeySecret = KZo1********
掛載OSS-HDFS服務。
創建掛載點。
mkdir -p <mount-point>
掛載OSS-HDFS服務。
jindo-fuse <mount_point> -ouri=[<oss_path>]
-ouri需配置為待映射的dls路徑,路徑可以為Bucket根目錄或者子目錄。執行該命令會啟動后臺的守護進程,將指定的<oss_path>掛載到本地文件系統的<mount_point>。
關于掛載Fuse過程中可以配置的掛載選項的更多信息,請參見掛載選項 。
執行以下命令,確認是否掛載成功。
ps -ef | grep jindo-fuse
返回結果如下,說明已成功掛載OSS-HDFS服務。
root 2162 1 0 13:21 ? 00:00:00 jindo-fuse <mount_point> -ouri=[<oss_path>] root 2714 2640 0 13:39 pts/0 00:00:00 grep --color=auto jindo-fuse
通過JindoFuse執行文件讀寫相關操作。
創建目錄
mkdir /mnt/oss/dir1
列舉/mnt/oss/下的所有目錄:
ls /mnt/oss/
寫入文件:
echo "hello world" > /mnt/oss/dir1/hello.txt
讀取文件:
cat /mnt/oss/dir1/hello.txt
刪除目錄:
rm -rf /mnt/oss/dir1/
(可選)取消掛載OSS-HDFS服務。
您可以使用以下兩種方式取消掛載。
手動取消掛載
umount <mount_point>
自動取消掛載
-oauto_unmount
使用以上命令支持通過
killall -9 jindo-fuse
發送SIGINT到jindo-fuse進程,進程退出前會自動取消掛載OSS-HDFS服務。
常見問題
如何排查JindoFuse錯誤?
與JindoSDK調用API過程中可獲取到詳細的錯誤信息ErrorMsg不同,JindoFuse只顯示操作系統預設的錯誤信息:
ls: /mnt/oss/: Input/output error
如果您需要定位具體的錯誤原因,請前往JindoSDK配置項logger.dir指定路徑下的jindosdk.log文件。如下為使用JindoFuse過程中常見的鑒權錯誤信息:
EMMDD HH:mm:ss jindofs_connectivity.cpp:13] Please check your Endpoint/Bucket/RoleArn.
Failed test connectivity, operation: mkdir, errMsg: [RequestId]: 618B8183343EA53531C62B74 [HostId]: oss-cn-shanghai-internal.aliyuncs.com [ErrorMessage]: [E1010]HTTP/1.1 403 Forbidden ...
收到以上報錯信息后,請自行排查Endpoint、Bucket以及RoleArn配置信息是否正確。關于Endpoint、Bucket、RoleArn的配置詳情,請參見非EMR集群接入OSS-HDFS服務快速入門。
如果遇到程序類報錯,請提交工單申請處理。
附錄一:支持特性
目前JindoFuse支持以下POSIX API:
特性 | 說明 |
getattr() | 查詢文件屬性,類似ls。 |
mkdir() | 創建目錄,類似mkdir。 |
rmdir() | 刪除目錄,類似rm -rf。 |
unlink() | 刪除文件,類似unlink。 |
rename() | 重命名文件或目錄,類似mv。 |
read() | 順序讀取。 |
pread() | 隨機讀。 |
write() | 順序寫。 |
pwrite() | 隨機寫。 |
flush() | 刷新內存到內核緩沖區。 |
fsync() | 刷新內存到磁盤。 |
release() | 關閉文件。 |
readdir() | 讀取目錄。 |
create() | 創建文件。 |
open() O_APPEND | 通過追加寫的方式打開文件。 |
open() O_TRUNC | 通過覆蓋寫的方式打開文件。 |
ftruncate() | 截斷已打開的文件。 |
truncate() | 截斷未打開的文件,類似truncate -s。 |
lseek() | 指定打開文件中的讀寫位置。 |
chmod() | 修改文件權限,類似chmod。 |
access() | 查詢文件權限。 |
utimes() | 修改文件的存儲時間和更改時間。 |
setxattr() | 修改文件的xattr屬性。 |
getxattr() | 獲取文件的xattr屬性。 |
listxattr() | 列舉文件的xattr屬性。 |
removexattr() | 刪除文件的xattr屬性。 |
lock() | 支持posix鎖,類似fcntl。 |
fallocate() | 為文件預分配物理空間。 |
symlink() | 創建軟連接,目前僅支持在OSS-HDFS服務中使用,且不支持緩存加速。 |
readlink() | 讀取軟連接。 |
附錄二:掛載選項
掛載JindoFuse過程中可以配置的掛載選項如下表所示:
名稱 | 是否必選 | 參數說明 | 使用示例 |
uri | 是 | 配置需要映射的dls路徑。路徑可以是Bucket根目錄-ouri=oss://bucket.endpoint/,也可以是子目錄-ouri=oss://bucket.endpoint/subdir。 | -ouri=oss://examplebucket.cn-beijing.oss-dls.aliyuncs.com/ |
f | 否 | 啟動進程。默認使用守護進程方式后臺啟動。使用該參數時,推薦開啟終端日志。 | -f |
d | 否 | 使用Debug模式,在前臺啟動進程。使用該參數時,推薦開啟終端日志。 | -d |
auto_unmount | 否 | fuse進程退出后自動卸載掛載點。 | -oauto_unmount |
ro | 否 | 只讀掛載,啟用參數后不允許寫操作。 | -oro |
direct_io | 否 | 開啟該選項后,讀寫文件可以繞過頁高速緩沖存儲器(Page Cache)。 | -odirect_io |
kernel_cache | 否 | 開啟后該選項后,通過內核緩存優化讀性能。 | -okernel_cache |
auto_cache | 否 | 默認開啟自動緩存。與 | -oauto_cache |
entry_timeout | 否 | 文件名讀取成功緩存保留時間,單位為秒。該選項用于性能優化。0表示不緩存。默認值為0.1。 | -oentry_timeout=60 |
attr_timeout | 否 | 文件屬性緩存保留時間,單位為秒。該選項用于性能優化。0表示不緩存。默認值為0.1。 | -oattr_timeout=60 |
negative_timeout | 否 | 文件名讀取失敗緩存保留時間,單位為秒。該選項用于性能優化。0表示不緩存。默認值為0.1。 | -onegative_timeout=0 |
jindo_entry_size | 否 | 目錄條目緩存數量,用于優化readdir性能。0表示不緩存。默認值為5000。 | -ojindo_entry_size=5000 |
jindo_attr_size | 否 | 文件屬性緩存數量,用于優化getattr性能。0表示不緩存。默認值為50000。 | -ojindo_attr_sizet=50000 |
max_idle_threads | 否 | 最大空閑線程數。默認值為10。 | -omax_idle_threads=10 |
metrics_port | 否 | 開啟HTTP端口,用于輸出metrics,例如http://localhost:9090/brpc_metrics。默認值為9090。 | -ometrics_port=9090 |
enable_pread | 否 | 使用pread接口讀取文件。 | -oenable_pread |
附錄三:配置選項
配置項 | 配置節點 | 說明 |
logger.dir | common | 日志目錄。默認值為/tmp/jindodata-log。 |
logger.sync | common | 輸出日志的方式。取值如下:
|
logger.consolelogger | common | 是否打印日志。取值如下:
|
logger.level | common | 輸出大于等于該等級的日志。
|
logger.verbose | common | 輸出大于等于該等級的VERBOSE日志,等級范圍為0~99,默認值為0,0表示不輸出。 |
logger.cleaner.enable | common | 是否開啟日志清理。取值如下:
|
fs.oss.endpoint | jindosdk | 用于訪問OSS-HDFS服務的地址,例如 |
fs.oss.accessKeyId | jindosdk | 用于訪問OSS-HDFS服務的AccessKey ID。 |
fs.oss.accessKeySecret | jindosdk | 用于訪問OSS-HDFS服務的AccessKey Secret。 |