1"use strict";(self.webpackChunkcurvine_doc=self.webpackChunkcurvine_doc||[]).push([[154],{15412:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>a,frontMatter:()=>i,metadata:()=>r,toc:()=>o});const r=JSON.parse('{"id":"User-Manuals/Operations/cli","title":"Command Line Tools","description":"This section is based on the current repository source in curvine-cli, build/cv, and build/bin/dfs. Curvine currently exposes three CLI entry styles:","source":"@site/docs/3-User-Manuals/2-Operations/02-cli.md","sourceDirName":"3-User-Manuals/2-Operations","slug":"/User-Manuals/Operations/cli","permalink":"/docs/User-Manuals/Operations/cli","draft":false,"unlisted":false,"editUrl":"https://github.com/curvineio/curvine-doc/edit/main/docs/3-User-Manuals/2-Operations/02-cli.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"Web Management Interface","permalink":"/docs/User-Manuals/Operations/webui"},"next":{"title":"Monitoring Metrics","permalink":"/docs/User-Manuals/Operations/monitoring"}}');var d=n(74848),c=n(28453);const i={},t="Command Line Tools",l={},o=[{value:"Native CLI: <code>cv</code>
1",id:"native-cli-cv",level:2},{value:"1. <code>report</code>: cluster status",id:"1-report-cluster-status",level:3},{value:"2. <code>node</code>: worker management",id:"2-node-worker-management",level:3},{value:"3. <code>fs</code>: file system operations",id:"3-fs-file-system-operations",level:3},{value:"4. <code>mount</code>: mount UFS into Curvine",id:"4-mount-mount-ufs-into-curvine",level:3},{value:"5. <code>umount</code>: remove a mount",id:"5-umount-remove-a-mount",level:3},{value:"6. <code>load</code>: submit a Load job",id:"6-load-submit-a-load-job",level:3},{value:"Transfer routing",id:"transfer-routing",level:4},{value:"7. <code>export</code>: export a Curvine path to UFS",id:"7-export-export-a-curvine-path-to-ufs",level:3},{value:"8. <code>load-status</code>: query job status",id:"8-load-status-query-job-status",level:3},{value:"9. <code>cancel-load</code>: cancel a load job",id:"9-cancel-load-cancel-a-load-job",level:3},{value:"10. <code>transfer</code>: operate Transfer jobs",id:"10-transfer-operate-transfer-jobs",level:3},{value:"11. <code>version</code>: show version",id:"11-version-show-version",level:3},{value:"Compatibility CLI: <code>dfs</code>",id:"compatibility-cli-dfs",level:2},{value:"POSIX / FUSE",id:"posix--fuse",level:2},{value:"Appendix: UFS Mount Parameters",id:"appendix-ufs-mount-parameters",level:2},{value:"S3 (<code>s3://</code>, <code>s3a://</code>)",id:"s3-s3-s3a",level:3},{value:"OSS (<code>oss://</code>)",id:"oss-oss",level:3},{value:"HDFS (<code>hdfs://</code>)",id:"hdfs-hdfs",level:3},{value:"WebHDFS (<code>webhdfs://</code>)",id:"webhdfs-webhdfs",level:3}];function h(e){const s={a:"a",admonition:"admonition",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,c.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(s.header,{children:(0,d.jsx)(s.h1,{id:"command-line-tools",children:"Command Line Tools"})}),"\n",(0,d.jsxs)(s.p,{children:["This section is based on the current repository source in ",(0,d.jsx)(s.code,{children:"curvine-cli"}),", ",(0,d.jsx)(s.code,{children:"build/cv"}),", and ",(0,d.jsx)(s.code,{children:"build/bin/dfs"}),". Curvine currently exposes three CLI entry styles:"]}),"\n",(0,d.jsxs)(s.ul,{children:["\n",(0,d.jsxs)(s.li,{children:[(0,d.jsxs)(s.strong,{children:["Native Rust CLI ",(0,d.jsx)(s.code,{children:"cv"})]}),": the recommended entry point, with the full command tree from ",(0,d.jsx)(s.code,{children:"curvine-cli"}),"."]}),"\n",(0,d.jsxs)(s.li,{children:[(0,d.jsxs)(s.strong,{children:["Compatibility wrapper ",(0,d.jsx)(s.code,{children:"dfs"})]}),": bundled in the distribution; ",(0,d.jsx)(s.code,{children:"fs"})," / ",(0,d.jsx)(s.code,{children:"report"})," go through Java ",(0,d.jsx)(s.code,{children:"CurvineShell"})," and keep Hadoop ",(0,d.jsx)(s.code,{children:"FsShell"})," style."]}),"\n",(0,d.jsxs)(s.li,{children:[(0,d.jsx)(s.strong,{children:"POSIX / FUSE"}),": after mounting with FUSE, use standard Linux commands directly on the mount point."]}),"\n"]}),"\n",(0,d.jsx)(s.hr,{}),"\n",(0,d.jsxs)(s.h2,{id:"native-cli-cv",children:["Native CLI: ",(0,d.jsx)(s.code,{children:"cv"})]}),"\n",(0,d.jsx)(s.p,{children:"Get a quick overview:"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"cv --help\n"})}),"\n",(0,d.jsx)(s.p,{children:"The current top-level commands in source are:"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-text",children:"Usage: cv [OPTIONS] <COMMAND>\n\nCommands:\n fs\n report\n load\n export\n load-status\n cancel-load\n transfer\n mount\n umount\n node\n version\n"})}),"\n",(0,d.jsxs)(s.p,{children:["All ",(0,d.jsx)(s.code,{children:"cv"})," commands accept these global options:"]}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Global option"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--conf <PATH>"})}),(0,d.jsxs)(s.td,{children:["Override the cluster config file for this invocation. If omitted, the CLI uses its normal configured path or ",(0,d.jsx)(s.code,{children:"CURVINE_CONF_FILE"}),"."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--master-addrs <ADDRS>"})}),(0,d.jsxs)(s.td,{children:["Override the client-side master address list directly, for example ",(0,d.jsx)(s.code,{children:"m1:8995,m2:8995"}),"."]})]})]})]}),"\n",(0,d.jsx)(s.admonition,{type:"tip",children:(0,d.jsxs)(s.p,{children:["Normal production commands use ",(0,d.jsx)(s.code,{children:"cv"})," directly because the cluster configuration\nis already installed or selected through ",(0,d.jsx)(s.code,{children:"CURVINE_CONF_FILE"}),". Use ",(0,d.jsx)(s.code,{children:"--conf"})," only\nto select a non-default configuration, for example during migration or\ndiagnosis. ",(0,d.jsx)(s.code,{children:"cv mount --config key=value"})," remains the UFS-property option."]})}),"\n",(0,d.jsx)(s.p,{children:(0,d.jsx)(s.strong,{children:"Conventions:"})}),"\n",(0,d.jsxs)(s.ul,{children:["\n",(0,d.jsxs)(s.li,{children:["In production, add the distribution ",(0,d.jsx)(s.code,{children:"bin/"})," directory to ",(0,d.jsx)(s.code,{children:"PATH"})," and invoke ",(0,d.jsx)(s.code,{children:"cv"})," directly."]}),"\n",(0,d.jsxs)(s.li,{children:["When run via ",(0,d.jsx)(s.code,{children:"cargo run -p curvine-cli -- ..."}),", the help output shows the binary name as ",(0,d.jsx)(s.code,{children:"curvine-cli"}),"."]}),"\n",(0,d.jsxs)(s.li,{children:["Items such as ",(0,d.jsx)(s.code,{children:"<PATH>"})," and ",(0,d.jsx)(s.code,{children:"<JOB_ID>"})," are positional arguments; ",(0,d.jsx)(s.code,{children:"[OPTION]"})," means optional."]}),"\n"]}),"\n",(0,d.jsx)(s.hr,{}),"\n",(0,d.jsxs)(s.h3,{id:"1-report-cluster-status",children:["1. ",(0,d.jsx)(s.code,{children:"report"}),": cluster status"]}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.strong,{children:"Usage:"})," ",(0,d.jsx)(s.code,{children:"cv report [json|all|capacity|used|available]"})]}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Command"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv report"})}),(0,d.jsx)(s.td,{children:"Default summary, including active master, capacity, inode/block counts, and worker lists."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv report json"})}),(0,d.jsxs)(s.td,{children:["Emit the full ",(0,d.jsx)(s.code,{children:"MasterInfo"})," as JSON."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv report all --show-workers false"})}),(0,d.jsx)(s.td,{children:"Text summary, with optional worker detail suppression."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv report capacity [WORKER_ADDRESS]"})}),(0,d.jsx)(s.td,{children:"Show cluster-wide capacity, or detailed capacity for one worker."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv report used"})}),(0,d.jsx)(s.td,{children:"Show used capacity for each live worker."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv report available"})}),(0,d.jsx)(s.td,{children:"Show available capacity for each live worker."})]})]})]}),"\n",(0,d.jsx)(s.p,{children:"Examples:"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"cv report\ncv report json\ncv report all --show-workers false\ncv report capacity\ncv report capacity 192.168.1.10\ncv report used\ncv report available\n"})}),"\n",(0,d.jsx)(s.admonition,{type:"note",children:(0,d.jsxs)(s.p,{children:["In the current implementation, ",(0,d.jsx)(s.code,{children:"cv report capacity <WORKER_ADDRESS>"})," matches by worker IP address, not by ",(0,d.jsx)(s.code,{children:"hostname:port"}),"."]})}),"\n",(0,d.jsx)(s.hr,{}),"\n",(0,d.jsxs)(s.h3,{id:"2-node-worker-management",children:["2. ",(0,d.jsx)(s.code,{children:"node"}),": worker management"]}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.strong,{children:"Usage:"})," ",(0,d.jsx)(s.code,{children:"cv node [OPTIONS] [-- <NODES>...]"})]}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Option"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"-l, --list"})}),(0,d.jsx)(s.td,{children:"List live and lost workers."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--versions"})}),(0,d.jsx)(s.td,{children:"Show release-version distribution across all live workers."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--add-decommission <NODES>..."})}),(0,d.jsx)(s.td,{children:"Add one or more workers to the decommission list."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--remove-decommission <NODES>..."})}),(0,d.jsx)(s.td,{children:"Remove one or more workers from the decommission list."})]})]})]}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.code,{children:"<NODES>"})," supports two forms:"]}),"\n",(0,d.jsxs)(s.ul,{children:["\n",(0,d.jsxs)(s.li,{children:["Space-separated arguments: ",(0,d.jsx)(s.code,{children:"host1:8997 host2:8997"})]}),"\n",(0,d.jsxs)(s.li,{children:["A single comma-separated argument: ",(0,d.jsx)(s.code,{children:"host1:8997,host2:8997"})]}),"\n"]}),"\n",(0,d.jsx)(s.p,{children:"Examples:"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"cv node -l\ncv node --versions\ncv node --add-decommission host1:8997 host2:8997\ncv node --add-decommission host1:8997,host2:8997\ncv node --remove-decommission host1:8997\n"})}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.code,{children:"cv node --versions"})," prints the release-version distribution across live\nworkers, preferring the structured ",(0,d.jsx)(s.code,{children:"component_info.release_version"})," reported on\nheartbeat and falling back to the legacy ",(0,d.jsx)(s.code,{children:"software_version"})," string:"]}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-text",children:"Version Distribution:\n----------------------------------------\n 0.4.0-alpha : 3 worker(s)\n
10.4.0-beta : 5 worker(s)\n legacy (0.3.0-test) : 1 worker(s)\n----------------------------------------\n total : 9 worker(s)\n"})}),"\n",(0,d.jsxs)(s.p,{children:["See ",(0,d.jsx)(s.a,{href:"/docs/User-Manuals/Operations/version-management",children:"Version Management and Compatibility"})," for the\nmeaning of these versions and how the master evaluates mixed-version peers."]}),"\n",(0,d.jsx)(s.admonition,{type:"note",children:(0,d.jsxs)(s.p,{children:["The current implementation strips ",(0,d.jsx)(s.code,{children:"hostname:port"})," down to ",(0,d.jsx)(s.code,{children:"hostname"})," before calling the decommission API. The port is mainly for readability and consistent input format."]})}),"\n",(0,d.jsx)(s.hr,{}),"\n",(0,d.jsxs)(s.h3,{id:"3-fs-file-system-operations",children:["3. ",(0,d.jsx)(s.code,{children:"fs"}),": file system operations"]}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.strong,{children:"Usage:"})," ",(0,d.jsx)(s.code,{children:"cv fs [OPTIONS] <COMMAND> [ARGS]"})]}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.code,{children:"fs"})," adds one command-level global switch:"]}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Option"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsx)(s.tbody,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--cache-only"})}),(0,d.jsx)(s.td,{children:"Query / operate only on data already cached in Curvine, disabling the unified UFS view."})]})})]}),"\n",(0,d.jsxs)(s.p,{children:["The current source exposes these ",(0,d.jsx)(s.code,{children:"fs"})," subcommands:"]}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Command"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv fs ls [PATH]"})}),(0,d.jsxs)(s.td,{children:["List a directory, default path ",(0,d.jsx)(s.code,{children:"/"}),"."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv fs mkdir <PATH> [-p|--parents]"})}),(0,d.jsx)(s.td,{children:"Create a directory."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv fs put <LOCAL_PATH> <REMOTE_PATH>"})}),(0,d.jsx)(s.td,{children:"Upload a local file into Curvine."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv fs get <PATH> <LOCAL_PATH>"})}),(0,d.jsx)(s.td,{children:"Download a Curvine file to local disk."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv fs cat <PATH>"})}),(0,d.jsx)(s.td,{children:"Print file contents."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv fs touch <PATH>"})}),(0,d.jsx)(s.td,{children:"Create an empty file or update timestamps."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv fs rm <PATH> [-r|--recursive]"})}),(0,d.jsx)(s.td,{children:"Remove a file or directory."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv fs stat <PATH>"})}),(0,d.jsx)(s.td,{children:"Show file or directory status."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv fs count <PATH>"})}),(0,d.jsx)(s.td,{children:"Count files / directories under a path."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv fs mv <SRC_PATH> <DST_PATH>"})}),(0,d.jsx)(s.td,{children:"Move or rename."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv fs du <PATH> [-h] [-v]"})}),(0,d.jsx)(s.td,{children:"Show directory space usage."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv fs df [-h]"})}),(0,d.jsx)(s.td,{children:"Show capacity / used / available space."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv fs chmod <MODE> <PATH> [RECURSIVE]"})}),(0,d.jsx)(s.td,{children:"Change permissions."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv fs chown <OWNER:GROUP> <PATH> [RECURSIVE]"})}),(0,d.jsx)(s.td,{children:"Change owner / group."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv fs blocks <PATH> [--format table|json]"})}),(0,d.jsx)(s.td,{children:"Show file block location details."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv fs free <PATH> [-r|--recursive]"})}),(0,d.jsx)(s.td,{children:"Release Curvine cache space for UFS-synced data."})]})]})]}),"\n",(0,d.jsx)(s.p,{children:"Common examples:"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"cv fs ls /\ncv fs ls / --cache-only\ncv fs mkdir -p /data/a/b\ncv fs put ./local.txt /data/remote.txt\ncv fs get /data/remote.txt ./local.txt\ncv fs cat /data/remote.txt\ncv fs stat /data\ncv fs count /data\ncv fs mv /data/a /data/b\ncv fs du -h /data\ncv fs df -h\ncv fs chmod 755 /data/script.sh\ncv fs chown user:group /data\ncv fs blocks /data/file.txt --format json\ncv fs free /data --recursive\n"})}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.code,{children:"cv fs ls"})," also supports HDFS-style listing flags:"]}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Option"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"-C, --path-only"})}),(0,d.jsx)(s.td,{children:"Print paths only."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"-d, --directory"})}),(0,d.jsx)(s.td,{children:"List directories as plain files."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"-H, --human-readable"})}),(0,d.jsx)(s.td,{children:"Print human-readable sizes."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"-q, --hide-non-printable"})}),(0,d.jsxs)(s.td,{children:["Replace non-printable characters with ",(0,d.jsx)(s.code,{children:"?"}),"."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"-R, --recursive"})}),(0,d.jsx)(s.td,{children:"List recursively."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"-r, --reverse"})}
1),(0,d.jsx)(s.td,{children:"Reverse sort order."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"-t, --mtime"})}),(0,d.jsx)(s.td,{children:"Sort by modification time."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"-S, --size"})}),(0,d.jsx)(s.td,{children:"Sort by size."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"-u, --atime"})}),(0,d.jsx)(s.td,{children:"Use access time for display and sorting."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"-l, --long-format"})}),(0,d.jsx)(s.td,{children:"Long listing format."})]})]})]}),"\n",(0,d.jsx)(s.admonition,{type:"note",children:(0,d.jsxs)(s.p,{children:["In the current source, recursive mode for ",(0,d.jsx)(s.code,{children:"chmod"})," / ",(0,d.jsx)(s.code,{children:"chown"})," is exposed as the third positional argument ",(0,d.jsx)(s.code,{children:"[RECURSIVE]"}),", not as a ",(0,d.jsx)(s.code,{children:"--recursive"})," flag. Permission strings support octal values such as ",(0,d.jsx)(s.code,{children:"755"})," / ",(0,d.jsx)(s.code,{children:"0o755"})," and symbolic forms such as ",(0,d.jsx)(s.code,{children:"u=rwx,g=rx,o=rx"}),". ",(0,d.jsx)(s.code,{children:"chown"})," supports ",(0,d.jsx)(s.code,{children:"user:group"}),", ",(0,d.jsx)(s.code,{children:"user:"}),", and ",(0,d.jsx)(s.code,{children:":group"}),"."]})}),"\n",(0,d.jsx)(s.hr,{}),"\n",(0,d.jsxs)(s.h3,{id:"4-mount-mount-ufs-into-curvine",children:["4. ",(0,d.jsx)(s.code,{children:"mount"}),": mount UFS into Curvine"]}),"\n",(0,d.jsxs)(s.p,{children:["The current implementation uses ",(0,d.jsx)(s.code,{children:"mount"})," for three related workflows:"]}),"\n",(0,d.jsxs)(s.ul,{children:["\n",(0,d.jsxs)(s.li,{children:[(0,d.jsx)(s.code,{children:"cv mount"}),": list all mount points"]}),"\n",(0,d.jsxs)(s.li,{children:[(0,d.jsx)(s.code,{children:"cv mount --check"}),": list mount points and validate UFS reachability"]}),"\n",(0,d.jsxs)(s.li,{children:[(0,d.jsx)(s.code,{children:"cv mount <UFS_PATH> <CV_PATH> [OPTIONS]"}),": create or update a mount"]}),"\n",(0,d.jsxs)(s.li,{children:[(0,d.jsx)(s.code,{children:"cv mount resync <CV_PATH> [OPTIONS]"}),": run metadata resync for an ",(0,d.jsx)(s.code,{children:"fs_mode"})," mount"]}),"\n"]}),"\n",(0,d.jsx)(s.p,{children:"Common options:"}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Option"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--config <key=value>"})}),(0,d.jsx)(s.td,{children:"UFS configuration entry. Can be repeated."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--update"})}),(0,d.jsx)(s.td,{children:"Update an existing mount configuration."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--check-path-consist <true|false>"})}),(0,d.jsxs)(s.td,{children:["Whether to enforce path consistency between ",(0,d.jsx)(s.code,{children:"UFS_PATH"})," and ",(0,d.jsx)(s.code,{children:"CV_PATH"}),". Default ",(0,d.jsx)(s.code,{children:"true"}),"."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--read-verify-ufs"})}),(0,d.jsxs)(s.td,{children:["Validate cached reads against UFS using ",(0,d.jsx)(s.code,{children:"mtime"})," / ",(0,d.jsx)(s.code,{children:"len"}),"."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--ttl-ms <DURATION>"})}),(0,d.jsxs)(s.td,{children:["TTL, default ",(0,d.jsx)(s.code,{children:"7d"}),". Supports durations such as ",(0,d.jsx)(s.code,{children:"1h"})," and ",(0,d.jsx)(s.code,{children:"7d"}),"."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--replicas <N>"})}),(0,d.jsx)(s.td,{children:"Override replica count."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--block-size <SIZE>"})}),(0,d.jsxs)(s.td,{children:["Override block size, for example ",(0,d.jsx)(s.code,{children:"128MB"}),"."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"-s, --storage-type <TYPE>"})}),(0,d.jsx)(s.td,{children:"Override storage type."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--write-type <cache_mode|fs_mode>"})}),(0,d.jsxs)(s.td,{children:["The current source only distinguishes these two modes. Default ",(0,d.jsx)(s.code,{children:"fs_mode"}),"."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--provider <auto|oss-hdfs|opendal>"})}),(0,d.jsx)(s.td,{children:"Select the UFS provider implementation."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--check"})}),(0,d.jsx)(s.td,{children:"Only meaningful when listing mounts; also validates each entry."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--dry-run"})}),(0,d.jsxs)(s.td,{children:["During ",(0,d.jsx)(s.code,{children:"resync"}),", scan and print differences without delete / create changes."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--verbose"})}),(0,d.jsxs)(s.td,{children:["During ",(0,d.jsx)(s.code,{children:"resync"}),", print detailed per-file logs."]})]})]})]}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsxs)(s.strong,{children:["About ",(0,d.jsx)(s.code,{children:"--provider"})]}),": some URI schemes can map to multiple implementations. For example, ",(0,d.jsx)(s.code,{children:"oss://..."})," may be handled either by OSS-HDFS / JindoSDK or by OpenDAL, so ",(0,d.jsx)(s.code,{children:"--provider"})," lets you force the implementation."]}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Value"}),(0,d.jsx)(s.th,{children:"Description"}),(0,d.jsx)(s.th,{children:"Typical protocols"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"auto"})}),(0,d.jsx)(s.td,{children:"Auto-select implementation based on the URI scheme."}),(0,d.jsx)(s.td,{children:"All supported schemes"})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"oss-hdfs"})}),(0,d.jsx)(s.td,{children:"Use JindoSDK / OSS-HDFS path handling."}),(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"oss://"})})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"opendal"})}),(0,d.jsx)(s.td,{children:"Use OpenDAL-based backends."}),(0,d.jsxs)(s.td,{children:[(0,d.jsx)(s.code,{children:"s3://"}),", ",(0,d.jsx)(s.code,{children:"oss://"}),", ",(0,d.jsx)(s.code,{children:"hdfs://"}),", ",(0,d.jsx)(s.code,{children:"webhdfs://"}),", ",(0,d.jsx)(s.code,{children:"cos://"}),", ",(0,d.jsx)(s.code,{children:"gcs://"}),", ",(0,d.jsx)(s.code,{children:"azblob://"}),", etc."]})]})]})]}),"\n",(0,d.jsx)(s.p,{children:"There are also a few implementation details worth calling out:"}),"\n",(0,d.jsxs)(s.ul,{children:["\n",(0,d.jsxs)(s.li,{children:["For ",(0,d.jsx)(s.code,{children:"s3://..."})," paths, if ",(0,d.jsx)(s.code,{children:"s3.bucket_name"})," is not provided explicitly, the CLI auto-fills it from the URI."]}),"\n",(0,d.jsxs)(s.li,{children:["For ",(0,d.jsx)(s.code,{children:"hdfs://..."})," paths, if ",(0,d.jsx)(s.code,{children:"hdfs.namenode"})," / ",(0,d.jsx)(s.code,{children:"hdfs.root"})," are not provided explicitly, the CLI derives them from the URI."]}),"\n",(0,d.jsxs)(s.li,{children:["If the config contains ",(0,d.jsx)(s.code,{children:"hdfs.kerberos.*"})," keys but neither ",(0,d.jsx)(s.code,{children:"hdfs.kerberos.ccache"})," nor the ",(0,d.jsx)(s.code,{children:"KRB5CCNAME"})," environment variable is present, the CLI prints a Kerberos ticket-cache warning."]}),"\n",(0,d.jsxs)(s.li,{children:[(0,d.jsx)(s.code,{children:"val
1idate_path_and_configs"})," currently applies extra path validation only to S3 paths; other schemes mostly rely on later provider initialization and connectivity checks."]}),"\n"]}),"\n",(0,d.jsx)(s.p,{children:"Examples:"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"# List mount points\ncv mount\n\n# List mount points and validate UFS availability\ncv mount --check\n\n# Create an S3 mount\ncv mount s3://bucket/datasets /bucket/datasets \\\n --config s3.endpoint_url=http://hostname.com \\\n --config s3.region_name=cn \\\n --config s3.credentials.access=access_key \\\n --config s3.credentials.secret=secret_key \\\n --config s3.path_style=true \\\n --provider opendal\n\n# Create an OSS mount through JindoSDK / OSS-HDFS\ncv mount oss://my-bucket/prefix /oss-data --provider oss-hdfs \\\n --config oss.endpoint=oss-cn-hangzhou.aliyuncs.com \\\n --config oss.accessKeyId=xxx \\\n --config oss.accessKeySecret=yyy\n\n# Run a metadata resync manually\ncv mount resync /bucket/datasets --dry-run --verbose\n"})}),"\n",(0,d.jsxs)(s.p,{children:["For detailed parameter lists of each UFS type (S3, OSS, HDFS, WebHDFS), see ",(0,d.jsx)(s.a,{href:"#appendix-ufs-mount-parameters",children:"Appendix: UFS Mount Parameters"})," at the end."]}),"\n",(0,d.jsx)(s.admonition,{type:"warning",children:(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.code,{children:"--check-path-consist=true"})," is enabled by default. That means a path such as ",(0,d.jsx)(s.code,{children:"s3://bucket/datasets"})," is normally expected to mount to ",(0,d.jsx)(s.code,{children:"/bucket/datasets"}),". If you really need a different mapping, pass ",(0,d.jsx)(s.code,{children:"--check-path-consist=false"})," explicitly."]})}),"\n",(0,d.jsx)(s.admonition,{type:"tip",children:(0,d.jsxs)(s.p,{children:["In the current source, the first creation of an ",(0,d.jsx)(s.code,{children:"fs_mode"})," mount automatically triggers a ",(0,d.jsx)(s.code,{children:"resync"}),". Manual ",(0,d.jsx)(s.code,{children:"cv mount resync ..."})," only works for ",(0,d.jsx)(s.code,{children:"fs_mode"})," mount points."]})}),"\n",(0,d.jsx)(s.hr,{}),"\n",(0,d.jsxs)(s.h3,{id:"5-umount-remove-a-mount",children:["5. ",(0,d.jsx)(s.code,{children:"umount"}),": remove a mount"]}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.strong,{children:"Usage:"})," ",(0,d.jsx)(s.code,{children:"cv umount <CURVINE_PATH>"})]}),"\n",(0,d.jsx)(s.p,{children:"Example:"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"cv umount /bucket/datasets\n"})}),"\n",(0,d.jsx)(s.hr,{}),"\n",(0,d.jsxs)(s.h3,{id:"6-load-submit-a-load-job",children:["6. ",(0,d.jsx)(s.code,{children:"load"}),": submit a Load job"]}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.strong,{children:"Usage:"})," ",(0,d.jsx)(s.code,{children:"cv load [OPTIONS] <SOURCE_PATH> [TARGET_PATH]"})]}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Option / Argument"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"<SOURCE_PATH>"})}),(0,d.jsx)(s.td,{children:"UFS source URI or a Curvine path below an existing mount."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"[TARGET_PATH]"})}),(0,d.jsx)(s.td,{children:"Optional Curvine destination. A mounted source path derives its target automatically."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"-w, --watch"})}),(0,d.jsx)(s.td,{children:"Watch job status immediately after submission."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--no-overwrite"})}),(0,d.jsx)(s.td,{children:"Fail instead of replacing an existing target."})]})]})]}),"\n",(0,d.jsx)(s.p,{children:"Examples:"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"cv load /datasets/train/part-0001.parquet --watch\ncv load s3://bucket/datasets/train/part-0001.parquet /datasets/train/part
1-0001.parquet --no-overwrite --watch\n"})}),"\n",(0,d.jsxs)(s.p,{children:["With Transfer enabled, ",(0,d.jsx)(s.code,{children:"load"})," submits a Transfer job. Otherwise it uses the\nlegacy Master job path. The command prints a job ID and target path in either\nmode."]}),"\n",(0,d.jsx)(s.h4,{id:"transfer-routing",children:"Transfer routing"}),"\n",(0,d.jsx)(s.p,{children:"The command line does not change when standalone Transfer is enabled:"}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Client configuration"}),(0,d.jsxs)(s.th,{children:[(0,d.jsx)(s.code,{children:"cv load"})," / ",(0,d.jsx)(s.code,{children:"cv export"})," route"]})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"[transfer] enabled = false"})}),(0,d.jsx)(s.td,{children:"Legacy Master Load API, for backward compatibility."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"[transfer] enabled = true"})}),(0,d.jsx)(s.td,{children:"Transfer service RPC, selected directly by the CLI."})]})]})]}),"\n",(0,d.jsxs)(s.p,{children:["The Transfer service and the client must both be configured for Transfer. Master\nand Worker configuration does not change for a client-side rollout. A client\nwith ",(0,d.jsx)(s.code,{children:"transfer.enabled = false"})," continues to submit through the legacy Master\nAPI."]}),"\n",(0,d.jsx)(s.hr,{}),"\n",(0,d.jsxs)(s.h3,{id:"7-export-export-a-curvine-path-to-ufs",children:["7. ",(0,d.jsx)(s.code,{children:"export"}),": export a Curvine path to UFS"]}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.strong,{children:"Usage:"})," ",(0,d.jsx)(s.code,{children:"cv export [OPTIONS] <PATH>"})]}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.code,{children:"<PATH>"})," must be a Curvine path below a mount. Curvine infers the UFS target\nfrom that mount."]}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Option / Argument"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"<PATH>"})}),(0,d.jsx)(s.td,{children:"Curvine source path to export."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"-w, --watch"})}),(0,d.jsx)(s.td,{children:"Watch job status immediately after submission."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--no-overwrite"})}),(0,d.jsx)(s.td,{children:"Fail when the UFS target already exists."})]})]})]}),"\n",(0,d.jsx)(s.p,{children:"Example:"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"cv export /bucket/datasets/train/part-0001.parquet --watch\n"})}),"\n",(0,d.jsx)(s.hr,{}),"\n",(0,d.jsxs)(s.h3,{id:"8-load-status-query-job-status",children:["8. ",(0,d.jsx)(s.code,{children:"load-status"}),": query job status"]}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.strong,{children:"Usage:"})," ",(0,d.jsx)(s.code,{children:"cv load-status [OPTIONS] <JOB_ID>"})]}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Option / Argument"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"<JOB_ID>"})}),(0,d.jsx)(s.td,{children:"Load job identifier."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"-v, --verbose"})}),(0,d.jsx)(s.td,{children:"Verbose output."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"-w, --watch <INTERVAL>"})}),(0,d.jsxs)(s.td,{children:["Poll interval, default ",(0,d.jsx)(s.code,{children:"5s"}),". Supports formats such as ",(0,d.jsx)(s.code,{children:"1s"}),", ",(0,d.jsx)(s.code,{children:"1m"}),", and ",(0,d.jsx)(s.code,{children:"1h"}),"."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--conf <PATH>"})}),(0,d.jsx)(s.td,{children:"Optional one-command config override; normal use does not need it."})]})]})]}),"\n",(0,d.jsx)(s.p,{children:"Examples:"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"cv load-status <job_id>\ncv load-status <job_id> -w 1s\n"})}),"\n",(0,d.jsx)(s.admonition,{type:"note",children:(0,d.jsxs)(s.p,{children:["In the current implementation, ",(0,d.jsx)(s.code,{children:"load-status"})," enters watch mode by default with a ",(0,d.jsx)(s.code,{children:"5s"})," refresh interval. The source does not currently expose a dedicated one-shot status-only switch."]})}),"\n",(0,d.jsx)(s.hr,{}),"\n",(0,d.jsxs)(s.h3,{id:"9-cancel-load-cancel-a-load-job",children:["9. ",(0,d.jsx)(s.code,{children:"cancel-load"}),": cancel a load job"]}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.strong,{children:"Usage:"})," ",(0,d.jsx)(s.code,{children:"cv cancel-load [OPTIONS] <JOB_ID>"})]}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Option / Argument"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"<JOB_ID>"})}),(0,d.jsx)(s.td,{children:"Job identifier to cancel."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"--conf <PATH>"})}),(0,d.jsx)(s.td,{children:"Optional one-command config override; normal use does not need it."})]})]})]}),"\n",(0,d.jsx)(s.p,{children:"Example:"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"cv cancel-load <job_id>\n"})}),"\n",(0,d.jsx)(s.hr,{}),"\n",(0,d.jsxs)(s.h3,{id:"10-transfer-operate-transfer-jobs",children:["10. ",(0,d.jsx)(s.code,{children:"transfer"}),": operate Transfer jobs"]}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.code,{children:"cv transfer"})," is available only when ",(0,d.jsx)(s.code,{children:"[transfer] enabled = true"}),". It is the\noperations command for listing, inspecting, retrying, and paging Transfer jobs;\nnormal submission remains ",(0,d.jsx)(s.code,{children:"cv load"})," or ",(0,d.jsx)(s.code,{children:"cv export"}),"."]}),"\n",(0,d.jsxs)(s.p,{children:["It requires a reachable Transfer endpoint in the client configuration. See\n",(0,d.jsx)(s.a,{href:"/docs/Deploy/Transfer-Service/Overview",children:"Transfer Service"})," for deployment."]}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Command"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv transfer list"})}),(0,d.jsxs)(s.td,{children:["List jobs. Filter with ",(0,d.jsx)(s.code,{children:"--kind load|export"}),", ",(0,d.jsx)(s.code,{children:"--state"}),", ",(0,d.jsx)(s.code,{children:"--tenant"}),", or ",(0,d.jsx)(s.code,{children:"--submitter"}),"."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv transfer status <JOB_ID>"})}),(0,d.jsxs)(s.td,{children:["Show one job. Add ",(0,d.jsx)(s.code,{children:"--verbose"})," for task detail or ",(0,d.jsx)(s.code,{children:"--watch --interval 1s"})," to poll."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv transfer tasks <JOB_ID>"})}),(0,d.jsx)(s.td,{children:"Show a task page for one job."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv transfer cancel <JOB_ID>"})}),(0,d.jsx)(s.td,{children:"Cancel a Transfer job."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv transfer retry <JOB_ID>"})}),(0,d.jsx)(s.td,{children:"Retry a failed, canceled, or partially successful job as a new job."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"cv transfer tenants"})}),(0,d.jsx)(s.td,{children:"Summarize jobs by tenant."})]})]})]}),"\n",(0,d.jsx)(s.p,{children:"Examples:"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"cv transfer list --kind load --state running\ncv transfer status <job_id> --watch --interval 2s\ncv transfer retry <job_id>\n"})}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.code,{children:"load-status"})," and ",(0,d.jsx)(s.code,{children:"cancel-load"})," remain compatible shortcuts. With Transfer\nenabled, they call Transfer; with Transfer disabled, they call the legacy\nMaster implementation."]}),"\n",(0,d.jsx)(s.hr,{}),"\n",(0,d.jsxs)(s.h3,{id:"11-version-show-version",children:["11. ",(0,d.jsx)(s.code,{children:"version"}),": show version"]}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.strong,{children:"Usage:"})," ",(0,d.jsx)(s.code,{children:"cv version"})]}),"\n",(0,d.jsx)(s.p,{children:"Example:"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"cv version\n"})}),"\n",(0,d.jsxs)(s.p,{children:["The current implementation prints ",(0,d.jsx)(s.code,{children:"curvine-cli <version>"})," together with commit / branch information."]}),"\n",(0,d.jsxs)(s.p,{children:["Every binary also accepts the global ",(0,d.jsx)(s.code,{children:"--version-json"})," flag to print its full\nstructured version (component, release version, git provenance, protocol\nversion, capabilities) as JSON \u2014 see\n",(0,d.jsx)(s.a,{href:"/docs/User-Manuals/Operations/version-management",children:"Version Management and Compatibility"}),":"]}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"cv --version-json\ncurvine-master --version-json\ncurvine-worker --version-json\n"})}),"\n",(0,d.jsx)(s.hr,{}),"\n",(0,d.jsxs)(s.h2,{id:"compatibility-cli-dfs",children:["Compatibility CLI: ",(0,d.jsx)(s.code,{children:"dfs"})]}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.code,{children:"bin/dfs"})," in the distribution is a compatibility wrapper:"]}),"\n",(0,d.jsxs)(s.ul,{children:["\n",(0,d.jsxs)(s.li,{children:["When the first subcommand is ",(0,d.jsx)(s.code,{children:"fs"})," or ",(0,d.jsx)(s.code,{children:"report"}),", it calls Java ",(0,d.jsx)(s.code,{children:"io.curvine.CurvineShell"}),"."]}),"\n",(0,d.jsxs)(s.li,{children:[(0,d.jsx)(s.code,{children:"dfs fs"})," keeps Hadoop ",(0,d.jsx)(s.code,{children:"FsShell"})," syntax, so subcommands look like ",(0,d.jsx)(s.code,{children:"-ls"}),", ",(0,d.jsx)(s.code,{children:"-mkdir"}),", ",(0,d.jsx)(s.code,{children:"-rm -r"})," with single-dash command names."]}),"\n",(0,d.jsxs)(s.li,{children:["Other subcommands are eventually forwarded to the Rust ",(0,d.jsx)(s.code,{children:"curvine-cli"}),", but for normal operations ",(0,d.jsx)(s.code,{children:"cv"})," is still the recommended entry point."]}),"\n"]}),"\n",(0,d.jsx)(s.p,{children:"Examples:"}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"bin/dfs fs -ls /\nbin/dfs fs -mkdir -p /data\nbin/dfs fs -rm -r /data/tmp\nbin/dfs report\nbin/dfs report info\nbin/dfs report json\nbin/dfs report capacity\nbin/dfs report used\nbin/dfs report available\n"})}),"\n",(0,d.jsxs)(s.p,{children:[(0,d.jsx)(s.code,{children:"dfs report info"})," is the Java-compat text-summary variant; conceptually it is close to ",(0,d.jsx)(s.code,{children:"cv report all"}),", but the command name is different."]}),"\n",(0,d.jsxs)(s.p,{children:["Use ",(0,d.jsx)(s.code,{children:"dfs"})," when you need Hadoop shell compatibility or rely on Hadoop configuration files such as ",(0,d.jsx)(s.code,{children:"core-site.xml"})," / ",(0,d.jsx)(s.code,{children:"hdfs-site.xml"}),". Use ",(0,d.jsx)(s.code,{children:"cv"})," when you want the full Curvine-native command set from current source."]}),"\n",(0,d.jsx)(s.hr,{}),"\n",(0,d.jsx)(s.h2,{id:"posix--fuse",children:"POSIX / FUSE"}),"\n",(0,d.jsxs)(s.p,{children:["Curvine also exposes a FUSE file system interface. After mounting it, for example via ",(0,d.jsx)(s.code,{children:"bin/curvine-fuse.sh start"}),", you can operate on the mount point with normal Linux tools:"]}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-bash",children:"ls /curvine-fuse\ncp data.txt /curvine-fuse/data.txt\ndu -sh /curvine-fuse\nstat /curvine-fuse/data.txt\n"})}),"\n",(0,d.jsx)(s.p,{children:"Typical categories:"}),"\n",(0,d.jsxs)(s.ul,{children:["\n",(0,d.jsxs)(s.li,{children:["Basic file operations: ",(0,d.jsx)(s.code,{children:"ls"}),", ",(0,d.jsx)(s.code,{children:"cp"}),", ",(0,d.jsx)(s.code,{children:"mv"}),", ",(0,d.jsx)(s.code,{children:"rm"}),", ",(0,d.jsx)(s.code,{children:"mkdir"})]}),"\n",(0,d.jsxs)(s.li,{children:["Content inspection: ",(0,d.jsx)(s.code,{children:"cat"}),", ",(0,d.jsx)(s.code,{children:"grep"}),", ",(0,d.jsx)(s.code,{children:"sed"})]}),"\n",(0,d.jsxs)(s.li,{children:["File system information: ",(0,d.jsx)(s.code,{children:"df -h"}),", ",(0,d.jsx)(s.code,{children:"du -sh"}),", ",(0,d.jsx)(s.code,{children:"stat"})]}),"\n",(0,d.jsxs)(s.li,{children:["Permissions: ",(0,d.jsx)(s.code,{children:"chmod"}),", ",(0,d.jsx)(s.code,{children:"chown"})]}),"\n"]}),"\n",(0,d.jsxs)(s.p,{children:["If your goal is POSIX compatibility with existing tools, prefer FUSE. If you need Curvine-native mount, load, or node-management features, use ",(0,d.jsx)(s.code,{children:"cv"}),"."]}),"\n",(0,d.jsx)(s.hr,{}),"\n",(0,d.jsx)(s.h2,{id:"appendix-ufs-mount-parameters",children:"Appendix: UFS Mount Parameters"}),"\n",(0,d.jsxs)(s.p,{children:["The following are common parameters passed through ",(0,d.jsx)(s.code,{children:"--config key=value"})," when using ",(0,d.jsx)(s.code,{children:"cv mount"}),". ",(0,d.jsx)(s.code,{children:"Required"})," means it normally must be provided; ",(0,d.jsx)(s.code,{children:"Optional"})," means it can be omitted if a default exists or if the CLI can infer it from the mount URI."]}),"\n",(0,d.jsxs)(s.h3,{id:"s3-s3-s3a",children:["S3 (",(0,d.jsx)(s.code,{children:"s3://"}),", ",(0,d.jsx)(s.code,{children:"s3a://"}),")"]}),"\n",(0,d.jsxs)(s.p,{children:["Used with ",(0,d.jsx)(s.code,{children:"--provider opendal"})," or auto-selection."]}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Parameter"}),(0,d.jsx)(s.th,{children:"Required/Optional"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"s3.endpoint_url"})}),(0,d.jsx)(s.td,{children:"Required"}),(0,d.jsxs)(s.td,{children:["S3 service endpoint URL; must start with ",(0,d.jsx)(s.code,{children:"http://"})," or ",(0,d.jsx)(s.code,{children:"https://"}),"."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"s3.credentials.access"})}),(0,d.jsx)(s.td,{children:"Required"}),(0,d.jsx)(s.td,{children:"Access Key ID."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"s3.credentials.secret"})}),(0,d.jsx)(s.td,{children:"Required"}
1),(0,d.jsx)(s.td,{children:"Secret Access Key."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"s3.region_name"})}),(0,d.jsx)(s.td,{children:"Optional"}),(0,d.jsx)(s.td,{children:"Region name."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"s3.path_style"})}),(0,d.jsx)(s.td,{children:"Optional"}),(0,d.jsx)(s.td,{children:"Whether to use path-style access, commonly needed for MinIO-compatible endpoints."})]})]})]}),"\n",(0,d.jsxs)(s.h3,{id:"oss-oss",children:["OSS (",(0,d.jsx)(s.code,{children:"oss://"}),")"]}),"\n",(0,d.jsx)(s.p,{children:"For Alibaba Cloud OSS / OSS-HDFS style access."}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Parameter"}),(0,d.jsx)(s.th,{children:"Required/Optional"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"oss.endpoint"})}),(0,d.jsx)(s.td,{children:"Required"}),(0,d.jsx)(s.td,{children:"OSS endpoint address."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"oss.accessKeyId"})}),(0,d.jsx)(s.td,{children:"Required"}),(0,d.jsx)(s.td,{children:"Alibaba Cloud AccessKey ID."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"oss.accessKeySecret"})}),(0,d.jsx)(s.td,{children:"Required"}),(0,d.jsx)(s.td,{children:"Alibaba Cloud AccessKey Secret."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"oss.region"})}),(0,d.jsx)(s.td,{children:"Optional"}),(0,d.jsx)(s.td,{children:"Region."})]})]})]}),"\n",(0,d.jsxs)(s.h3,{id:"hdfs-hdfs",children:["HDFS (",(0,d.jsx)(s.code,{children:"hdfs://"}),")"]}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Parameter"}),(0,d.jsx)(s.th,{children:"Required/Optional"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"hdfs.namenode"})}),(0,d.jsx)(s.td,{children:"Optional"}),(0,d.jsx)(s.td,{children:"NameNode address; if omitted, inferred from the mount URI authority."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"hdfs.root"})}),(0,d.jsx)(s.td,{children:"Optional"}),(0,d.jsx)(s.td,{children:"Root path; if omitted, inferred from the mount URI path."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"hdfs.user"})}),(0,d.jsx)(s.td,{children:"Optional"}),(0,d.jsx)(s.td,{children:"HDFS username."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"hdfs.atomic_write_dir"})}),(0,d.jsx)(s.td,{children:"Optional"}),(0,d.jsx)(s.td,{children:"Enable atomic write directory behavior."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"hdfs.kerberos.ccache"})}),(0,d.jsx)(s.td,{children:"Optional"}),(0,d.jsxs)(s.td,{children:["Kerberos credential cache path; can also come from ",(0,d.jsx)(s.code,{children:"KRB5CCNAME"}),"."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"hdfs.kerberos.krb5_conf"})}),(0,d.jsx)(s.td,{children:"Optional"}),(0,d.jsxs)(s.td,{children:[(0,d.jsx)(s.code,{children:"krb5.conf"})," path."]})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"hdfs.kerberos.keytab"})}),(0,d.jsx)(s.td,{children:"Optional"}),(0,d.jsx)(s.td,{children:"Keytab path."})]})]})]}),"\n",(0,d.jsxs)(s.h3,{id:"webhdfs-webhdfs",children:["WebHDFS (",(0,d.jsx)(s.code,{children:"webhdfs://"}),")"]}),"\n",(0,d.jsxs)(s.table,{children:[(0,d.jsx)(s.thead,{children:(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.th,{children:"Parameter"}),(0,d.jsx)(s.th,{children:"Required/Optional"}),(0,d.jsx)(s.th,{children:"Description"})]})}),(0,d.jsxs)(s.tbody,{children:[(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"webhdfs.endpoint"})}),(0,d.jsx)(s.td,{children:"Optional"}),(0,d.jsx)(s.td,{children:"WebHDFS HTTP endpoint; if omitted, inferred from the URI authority."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"webhdfs.root"})}),(0,d.jsx)(s.td,{children:"Optional"}),(0,d.jsx)(s.td,{children:"Root path."})]}),(0,d.jsxs)(s.tr,{children:[(0,d.jsx)(s.td,{children:(0,d.jsx)(s.code,{children:"webhdfs.delegation"})}),(0,d.jsx)(s.td,{children:"Optional"}),(0,d.jsx)(s.td,{children:"Delegation token."})]})]})]})]})}function a(e={}){const{wrapper:s}={...(0,c.R)(),...e.components};return s?(0,d.jsx)(s,{...e,children:(0,d.jsx)(h,{...e})}):h(e)}},28453:(e,s,n)=>{n.d(s,{R:()=>i,x:()=>t});var r=n(96540);const d={},c=r.createContext(d);function i(e){const s=r.useContext(c);return r.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:i(e.components),r.createElement(c.Provider,{value:s},e.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.