hadoop-cos-{hadoop.version}-{version}.jar
와 cos_api-bundle-{version}.jar
를$HADOOP_HOME/share/hadoop/tools/lib
에 복사합니다.$HADOOP_HOME/etc/hadoop
디렉터리에 들어가 hadoop-env.sh 파일을 편집하고, 다음 내용을 추가하여 cosn 관련 jar 패키지를 Hadoop 환경 변수에 추가합니다.for f in $HADOOP_HOME/share/hadoop/tools/lib/*.jar; doif [ "$HADOOP_CLASSPATH" ]; thenexport HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$felseexport HADOOP_CLASSPATH=$ffidone
속성 키 | 설명 | 기본값 | 필수 여부 |
fs.cosn.userinfo.
secretId/secretKey | 없음 | 예 | |
fs.cosn.
credentials.provider | SecretId와 SecretKey 획득 방법을 설정합니다. 현재는 다음과 같이 5가지 방법을 지원합니다: 1. org.apache.hadoop.fs.auth.SessionCredentialProvider: 요청 URI에서 secret id 및 secret key를 획득합니다. 형식: cosn://{secretId}:{secretKey}@examplebucket-1250000000/. 2. org.apache.hadoop.fs.auth.SimpleCredentialProvider: core-site.xml 구성 파일에서 fs.cosn.userinfo.secretId와 fs.cosn.userinfo.secretKey를 읽어와 SecretId 및 SecretKey를 획득합니다. 3. org.apache.hadoop.fs.auth.EnvironmentVariableCredentialProvider: 시스템 환경 변수 COS_SECRET_ID 및 COS_SECRET_KEY에서 획득합니다. 4. org.apache.hadoop.fs.auth.SessionTokenCredentialProvider: 임시 키를 사용하여 액세스합니다. 5. org.apache.hadoop.fs.auth.CVMInstanceCredentialsProvider: Tencent Cloud CVM 바인딩 역할을 사용하는 COS에 액세스할 수 있는 임시 키를 얻습니다. 6. org.apache.hadoop.fs.auth.CPMInstanceCredentialsProvider: Tencent Cloud CPM 바인딩 역할을 사용하는 COS에 액세스할 수 있는 임시 키를 얻습니다. 7. org.apache.hadoop.fs.auth.EMRInstanceCredentialsProvider: Tencent Cloud EMR 인스턴스 바인딩한 역할을 사용하는 COS에 액세스할 수 있는 임시 키를 얻습니다. 8. org.apache.hadoop.fs.auth.RangerCredentialsProvider는 ranger를 사용하여 키를 가져옵니다. | 이 매개변수를 지정하지 않으면 기본적으로 다음 순서에 따라 읽어옵니다: 1. org.apache.hadoop.fs.auth.SessionCredentialProvider 2. org.apache.hadoop.fs.auth.SimpleCredentialProvider 3. org.apache.hadoop.fs.auth.EnvironmentVariableCredentialProvider 4. org.apache.hadoop.fs.auth.SessionTokenCredentialProvider 5. org.apache.hadoop.fs.auth.CVMInstanceCredentialsProvider 6. org.apache.hadoop.fs.auth.CPMInstanceCredentialsProvider 7. org.apache.hadoop.fs.auth.EMRInstanceCredentialsProvider | 아니오 |
fs.cosn.useHttps | HTTPS를 COS의 백그라운드 전송 프로토콜로 사용할지 여부를 설정합니다. | true | 아니오 |
fs.cosn.impl | cosn은 FileSystem에 대한 구현 클래스로, org.apache.hadoop.fs.CosFileSystem으로 고정되어 있습니다. | 없음 | 예 |
fs.AbstractFileSystem.
cosn.impl | cosn은 AbstractFileSystem의 구현 클래스로, org.apache.hadoop.fs.CosN으로 고정되어 있습니다. | 없음 | 예 |
fs.cosn.bucket.region | 액세스할 버킷의 리전 정보를 입력합니다. 열거 값은 리전 및 액세스 도메인의 도메인 약칭을 참고하십시오.
예: ap-beijing, ap-guangzhou 등, 기존 설정 호환: fs.cosn.userinfo.region | 없음 | 예 |
fs.cosn.bucket.
endpoint_suffix | 연결할 COS endpoint를 지정하며, 해당 항목은 필수 입력 항목이 아닙니다. 퍼블릭 클라우드 COS 사용자의 경우
상기 region 설정만 정확하게 입력하면 됩니다. 기존 설정 호환: fs.cosn.userinfo.endpoint_suffix. 이 항목을 구성할 때 fs.cosn.bucket.region 구성 항목 endpoint를 삭제해야 적용됩니다. | 없음 | 아니오 |
fs.cosn.tmp.dir | 실제 존재하는 로컬 디렉터리를 입력합니다. 실행 과정에서 생성되는 임시 파일이 잠시 해당 디렉터리에 저장됩니다. | /tmp/hadoop_cos | 아니오 |
fs.cosn.upload.
part.size | CosN 파일 시스템의 각 block의 크기, 즉 멀티파트 업로드의 각 part size의 크기입니다. COS의 멀티파트 업로드는 최대 10000개까지 가능하므로 사용할 단일 파일의 최대 크기를 예측해야 합니다.
예를 들어 part size가 8MB인 경우 최대 78GB의 단일 파일 업로드를 지원합니다. part size는 최대 2GB까지 설정할 수 있으며, 이에 따라 단일 파일 크기는 최대 19TB까지 지원합니다. | 8388608(8MB) | 아니오 |
fs.cosn.
upload.buffer | CosN 파일 시스템에서 업로드 시 종속되는 버퍼 유형입니다. 현재 간접 메모리 버퍼(non_direct_memory),
직접 메모리 버퍼(direct_memory), 디스크 매핑 버퍼(mapped_disk) 세 가지 버퍼 유형을 지원합니다.
간접 메모리 버퍼는 JVM on-heap 메모리를 사용하며, 직접 메모리 버퍼는 off-heap 메모리를 사용하고, 디스크 매핑 버퍼는 메모리 파일 매핑을 기반으로 버퍼를 획득합니다. | mapped_disk | 아니오 |
fs.cosn.
upload.buffer.size | CosN 파일 시스템에서 업로드 시 종속되는 버퍼 크기입니다. -1로 설정할 경우 버퍼를 제한하지 않는다는 의미이며,
버퍼 크기를 제한하지 않을 경우 버퍼 유형은 반드시 mapped_disk로 지정해야 합니다. 0 이상으로 설정할 경우 해당 값은 최소 block 크기 이상이어야 합니다. 기존 설정 호환: fs.cosn.buffer.size。 | -1 | 아니오 |
fs.cosn.block.size | CosN 파일 시스템의 block size입니다. | 134217728(128MB) | 아니오 |
fs.cosn.
upload_thread_pool | 파일을 스트리밍 방식으로 COS에 업로드할 때 동시 업로드 스레드 수입니다. | 10 | 아니오 |
fs.cosn.
copy_thread_pool | 디렉터리 복사 작업 시, 파일 동시 복사 및 삭제에 사용할 수 있는 스레드 수입니다. | 3 | 아니오 |
fs.cosn.
read.ahead.block.size | 미리 읽어 오는 블록 크기입니다. | 1048576(1MB) | 아니오 |
fs.cosn.
read.ahead.queue.size | 미리 읽어 오는 큐 길이입니다. | 8 | 아니오 |
fs.cosn.maxRetries | COS 액세스 시 오류가 발생하는 경우, 최대 재시도 횟수입니다. | 200 | 아니오 |
fs.cosn.retry.
interval.seconds | 재시도 시간 간격입니다. | 3 | 아니오 |
fs.cosn.
server-side-encryption.algorithm | COS 서버의 암호화 알고리즘을 설정합니다. SSE-C와 SSE-COS를 지원하며, 기본값은 비어 있으며 암호화하지 않습니다. | 없음 | 아니오 |
fs.cosn.
server-side-encryption.key | COS의 SSE-C 서버 암호화 알고리즘을 활성화하면 반드시 SSE-C 키를 설정해야 합니다.
키 형식은 base64으로 인코딩된 AES-256 키로, 기본값은 비어 있으며 암호화하지 않습니다. | 없음 | 아니오 |
fs.cosn.
crc64.checksum.enabled | CRC64 검증 활성화 여부입니다. 기본적으로 비활성화되어 있으며, 이 경우 hadoop fs -checksum 명령어를 사용해 파일의 CRC64 검증값을 획득할 수 없습니다. | false | 아니오 |
fs.cosn.
crc32c.checksum.enabled | CRC32C 검증 활성화 여부입니다.기본적으로 비활성화되어 있으며, 이 경우 hadoop fs -checksum 명령어를 사용해 파일의 CRC32C 검증값을 획득할 수 없습니다. crc32c 또는 crc64 중 하나만 활성화할 수 있습니다. | false | 아니오 |
fs.cosn.traffic.limit | 업로드 대역폭 제한 옵션으로 819200 - 838860800 bits/s입니다. 기본값은 -1로, 제한하지 않는다는 의미입니다. | 없음 | 아니오 |
$HADOOP_HOME/etc/hadoop/core-site.xml
을 수정하여 COS 관련 사용자 및 구현 클래스 정보를 추가합니다. 예시:<configuration><property><name>fs.cosn.credentials.provider</name><value>org.apache.hadoop.fs.auth.SimpleCredentialProvider</value><description>This option allows the user to specify how to get the credentials.Comma-separated class names of credential provider classes which implementcom.qcloud.cos.auth.COSCredentialsProvider:1.org.apache.hadoop.fs.auth.SessionCredentialProvider: Obtain the secret id and secret key from the URI: cosn://secretId:secretKey@examplebucket-1250000000/;2.org.apache.hadoop.fs.auth.SimpleCredentialProvider: Obtain the secret id and secret keyfrom fs.cosn.userinfo.secretId and fs.cosn.userinfo.secretKey in core-site.xml;3.org.apache.hadoop.fs.auth.EnvironmentVariableCredentialProvider: Obtain the secret id and secret keyfrom system environment variables named COS_SECRET_ID and COS_SECRET_KEY.If unspecified, the default order of credential providers is:1. org.apache.hadoop.fs.auth.SessionCredentialProvider2. org.apache.hadoop.fs.auth.SimpleCredentialProvider3. org.apache.hadoop.fs.auth.EnvironmentVariableCredentialProvider4. org.apache.hadoop.fs.auth.SessionTokenCredentialProvider5. org.apache.hadoop.fs.auth.CVMInstanceCredentialsProvider6. org.apache.hadoop.fs.auth.CPMInstanceCredentialsProvider7. org.apache.hadoop.fs.auth.EMRInstanceCredentialsProvider</description></property><property><name>fs.cosn.userinfo.secretId</name><value>xxxxxxxxxxxxxxxxxxxxxxxxx</value><description>Tencent Cloud Secret Id</description></property><property><name>fs.cosn.userinfo.secretKey</name><value>xxxxxxxxxxxxxxxxxxxxxxxx</value><description>Tencent Cloud Secret Key</description></property><property><name>fs.cosn.bucket.region</name><value>ap-xxx</value><description>The region where the bucket is located.</description></property><property><name>fs.cosn.bucket.endpoint_suffix</name><value>cos.ap-xxx.myqcloud.com</value><description>COS endpoint to connect to.For public cloud users, it is recommended not to set this option, and only the correct area field is required.</description></property><property><name>fs.cosn.impl</name><value>org.apache.hadoop.fs.CosFileSystem</value><description>The implementation class of the CosN Filesystem.</description></property><property><name>fs.AbstractFileSystem.cosn.impl</name><value>org.apache.hadoop.fs.CosN</value><description>The implementation class of the CosN AbstractFileSystem.</description></property><property><name>fs.cosn.tmp.dir</name><value>/tmp/hadoop_cos</value><description>Temporary files will be placed here.</description></property><property><name>fs.cosn.upload.buffer</name><value>mapped_disk</value><description>The type of upload buffer. Available values: non_direct_memory, direct_memory, mapped_disk</description></property><property><name>fs.cosn.upload.buffer.size</name><value>134217728</value><description>The total size of the upload buffer pool. -1 means unlimited.</description></property><property><name>fs.cosn.upload.part.size</name><value>8388608</value><description>Block size to use cosn filesysten, which is the part size for MultipartUpload.Considering the COS supports up to 10000 blocks, user should estimate the maximum size of a single file.For example, 8MB part size can allow writing a 78GB single file.</description></property><property><name>fs.cosn.maxRetries</name><value>3</value><description>The maximum number of retries for reading or writing files toCOS, before we signal failure to the application.</description></property><property><name>fs.cosn.retry.interval.seconds</name><value>3</value><description>The number of seconds to sleep between each COS retry.</description></property><property><name>fs.cosn.server-side-encryption.algorithm</name><value></value><description>The server side encryption algorithm.</description></property><property><name>fs.cosn.server-side-encryption.key</name><value></value><description>The SSE-C server side encryption key.</description></property></configuration>
<property><name>fs.defaultFS</name><value>cosn://examplebucket-1250000000</value><description>This option is not advice to config, this only used for some special test cases.</description></property>
$HADOOP_HOME/etc/hadoop/core-site.xml
파일에서 다음 설정을 추가하여 SSE-COS 암호화를 구현할 수 있습니다.<property><name>fs.cosn.server-side-encryption.algorithm</name><value>SSE-COS</value><description>The server side encryption algorithm.</description></property>
$HADOOP_HOME/etc/hadoop/core-site.xml
파일에 다음 설정을 추가하여 SSE-C 암호화를 구현할 수 있습니다.<property><name>fs.cosn.server-side-encryption.algorithm</name><value>SSE-C</value><description>The server side encryption algorithm.</description></property><property><name>fs.cosn.server-side-encryption.key</name><value>MDEyMzQ1Njc4OUFCQ0RFRjAxMjM0NTY3ODlBQkNERUY=</value> #사용자가 직접 SSE-C 키를 설정해야 하며, 키 형식은 base64으로 인코딩된 AES-256 키입니다.<description>The SSE-C server side encryption key.</description></property>
hadoop fs -ls -R cosn://<BucketName-APPID>/<경로>
또는 hadoop fs -ls -R /<경로>
(fs.defaultFS
옵션을 cosn://BucketName-APPID
로 설정해야 함)입니다. 다음은 이름이 examplebucket-1250000000인 bucket을 예시이며, 뒤에 구체적인 경로를 추가합니다.hadoop fs -ls -R cosn://examplebucket-1250000000/-rw-rw-rw- 1 root root 1087 2018-06-11 07:49 cosn://examplebucket-1250000000/LICENSEdrwxrwxrwx - root root 0 1970-01-01 00:00 cosn://examplebucket-1250000000/hdfsdrwxrwxrwx - root root 0 1970-01-01 00:00 cosn://examplebucket-1250000000/hdfs/2018-rw-rw-rw- 1 root root 1087 2018-06-12 03:26 cosn://examplebucket-1250000000/hdfs/2018/LICENSE-rw-rw-rw- 1 root root 2386 2018-06-12 03:26 cosn://examplebucket-1250000000/hdfs/2018/ReadMedrwxrwxrwx - root root 0 1970-01-01 00:00 cosn://examplebucket-1250000000/hdfs/test-rw-rw-rw- 1 root root 1087 2018-06-11 07:32 cosn://examplebucket-1250000000/hdfs/test/LICENSE-rw-rw-rw- 1 root root 2386 2018-06-11 07:29 cosn://examplebucket-1250000000/hdfs/test/ReadMe
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount cosn://example/mr/input cosn://example/mr/output3
File System CountersCOSN: Number of bytes read=72COSN: Number of bytes written=40COSN: Number of read operations=0COSN: Number of large read operations=0COSN: Number of write operations=0FILE: Number of bytes read=547350FILE: Number of bytes written=1155616FILE: Number of read operations=0FILE: Number of large read operations=0FILE: Number of write operations=0HDFS: Number of bytes read=0HDFS: Number of bytes written=0HDFS: Number of read operations=0HDFS: Number of large read operations=0HDFS: Number of write operations=0Map-Reduce FrameworkMap input records=5Map output records=7Map output bytes=59Map output materialized bytes=70Input split bytes=99Combine input records=7Combine output records=6Reduce input groups=6Reduce shuffle bytes=70Reduce input records=6Reduce output records=6Spilled Records=12Shuffled Maps =1Failed Shuffles=0Merged Map outputs=1GC time elapsed (ms)=0Total committed heap usage (bytes)=653262848Shuffle ErrorsBAD_ID=0CONNECTION=0IO_ERROR=0WRONG_LENGTH=0WRONG_MAP=0WRONG_REDUCE=0File Input Format CountersBytes Read=36File Output Format CountersBytes Written=40
package com.qcloud.chdfs.demo;import org.apache.commons.io.IOUtils;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FSDataInputStream;import org.apache.hadoop.fs.FSDataOutputStream;import org.apache.hadoop.fs.FileChecksum;import org.apache.hadoop.fs.FileStatus;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;import java.io.IOException;import java.net.URI;import java.nio.ByteBuffer;public class Demo {private static FileSystem initFS() throws IOException {Configuration conf = new Configuration();// COSN의 구성 항목은 https://www.tencentcloud.com/document/product/436/6884?from_cn_redirect=1#hadoop-.E9.85.8D.E7.BD.AE 에서 확인할 수 있습니다.// 다음 설정은 필수 항목입니다.conf.set("fs.cosn.impl", "org.apache.hadoop.fs.CosFileSystem");conf.set("fs.AbstractFileSystem.cosn.impl", "org.apache.hadoop.fs.CosN");conf.set("fs.cosn.tmp.dir", "/tmp/hadoop_cos");conf.set("fs.cosn.bucket.region", "ap-guangzhou");conf.set("fs.cosn.userinfo.secretId", "AKXXXXXXXXXXXXXXXXX");conf.set("fs.cosn.userinfo.secretKey", "XXXXXXXXXXXXXXXXXX");conf.set("fs.ofs.user.appid", "XXXXXXXXXXX");// 기타 구성은 공식 웹사이트 문서를 참고하십시오. https://www.tencentcloud.com/document/product/436/6884?from_cn_redirect=1#hadoop-.E9.85.8D.E7.BD.AE// CRC64 체크 활성화 여부. 기본적으로 활성화되어 있지 않으며, 이 때 hadoop fs -checksum 명령을 사용하여 파일의 CRC64 체크섬 값을 가져올 수 없습니다.conf.set("fs.cosn.crc64.checksum.enabled", "true");String cosnUrl = "cosn://f4mxxxxxxxx-125xxxxxxx";return FileSystem.get(URI.create(cosnUrl), conf);}private static void mkdir(FileSystem fs, Path filePath) throws IOException {fs.mkdirs(filePath);}private static void createFile(FileSystem fs, Path filePath) throws IOException {// 파일 생성 (이미 있는 경우 덮어쓰기)// if the parent dir does not exist, fs will create it!FSDataOutputStream out = fs.create(filePath, true);try {// 파일 입력String content = "test write file";out.write(content.getBytes());} finally {IOUtils.closeQuietly(out);}}private static void readFile(FileSystem fs, Path filePath) throws IOException {FSDataInputStream in = fs.open(filePath);try {byte[] buf = new byte[4096];int readLen = -1;do {readLen = in.read(buf);} while (readLen >= 0);} finally {IOUtils.closeQuietly(in);}}private static void queryFileOrDirStatus(FileSystem fs, Path path) throws IOException {FileStatus fileStatus = fs.getFileStatus(path);if (fileStatus.isDirectory()) {System.out.printf("path %s is dir\\n", path);return;}long fileLen = fileStatus.getLen();long accessTime = fileStatus.getAccessTime();long modifyTime = fileStatus.getModificationTime();String owner = fileStatus.getOwner();String group = fileStatus.getGroup();System.out.printf("path %s is file, fileLen: %d, accessTime: %d, modifyTime: %d, owner: %s, group: %s\\n",path, fileLen, accessTime, modifyTime, owner, group);}private static void getFileCheckSum(FileSystem fs, Path path) throws IOException {FileChecksum checksum = fs.getFileChecksum(path);System.out.printf("path %s, checkSumType: %s, checkSumCrcVal: %d\\n",path, checksum.getAlgorithmName(), ByteBuffer.wrap(checksum.getBytes()).getInt());}private static void copyFileFromLocal(FileSystem fs, Path cosnPath, Path localPath) throws IOException {fs.copyFromLocalFile(localPath, cosnPath);}private static void copyFileToLocal(FileSystem fs, Path cosnPath, Path localPath) throws IOException {fs.copyToLocalFile(cosnPath, localPath);}private static void renamePath(FileSystem fs, Path oldPath, Path newPath) throws IOException {fs.rename(oldPath, newPath);}private static void listDirPath(FileSystem fs, Path dirPath) throws IOException {FileStatus[] dirMemberArray = fs.listStatus(dirPath);for (FileStatus dirMember : dirMemberArray) {System.out.printf("dirMember path %s, fileLen: %d\\n", dirMember.getPath(), dirMember.getLen());}}// 재귀 삭제 마크는 디렉터리 삭제에 사용됩니다.// 재귀가 false 이고 dir가 비어있지 않으면 작업이 수행되지 않습니다.private static void deleteFileOrDir(FileSystem fs, Path path, boolean recursive) throws IOException {fs.delete(path, recursive);}private static void closeFileSystem(FileSystem fs) throws IOException {fs.close();}public static void main(String[] args) throws IOException {// 파일 초기화FileSystem fs = initFS();// 파일 생성Path cosnFilePath = new Path("/folder/exampleobject.txt");createFile(fs, cosnFilePath);// 파일 불러오기readFile(fs, cosnFilePath);// 파일 또는 디렉터리 조회queryFileOrDirStatus(fs, cosnFilePath);// 파일 검사합 가져오기getFileCheckSum(fs, cosnFilePath);// 로컬에서 파일 복사Path localFilePath = new Path("file:///home/hadoop/ofs_demo/data/exampleobject.txt");copyFileFromLocal(fs, cosnFilePath, localFilePath);// 파일을 로컬로 가져오기Path localDownFilePath = new Path("file:///home/hadoop/ofs_demo/data/exampleobject.txt");copyFileToLocal(fs, cosnFilePath, localDownFilePath);listDirPath(fs, cosnFilePath);// 이름 변경mkdir(fs, new Path("/doc"));Path newPath = new Path("/doc/example.txt");renamePath(fs, cosnFilePath, newPath);// 파일 삭제deleteFileOrDir(fs, newPath, false);// 디렉터리 생성Path dirPath = new Path("/folder");mkdir(fs, dirPath);// 디렉터리에 파일 생성Path subFilePath = new Path("/folder/exampleobject.txt");createFile(fs, subFilePath);// 디렉터리 나열listDirPath(fs, dirPath);// 디렉터리 삭제deleteFileOrDir(fs, dirPath, true);deleteFileOrDir(fs, new Path("/doc"), true);// 파일 시스템 비활성화closeFileSystem(fs);}}
문제 해결에 도움이 되었나요?