[ 
https://issues.apache.org/jira/browse/HDFS-11161?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18087565#comment-18087565
 ] 

ASF GitHub Bot commented on HDFS-11161:
---------------------------------------

pan3793 commented on code in PR #8347:
URL: https://github.com/apache/hadoop/pull/8347#discussion_r3378939574


##########
hadoop-cloud-storage-project/hadoop-bos/src/site/markdown/cloud-storage/index.md:
##########
@@ -0,0 +1,399 @@
+<!--
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License. See accompanying LICENSE file.
+-->
+
+# Integration of Baidu BOS in Hadoop
+
+## Overview
+
+BOS (Baidu Object Storage) is the object storage service provided by Baidu 
Cloud. Hadoop-BOS is a connector between computing systems and underlying 
storage. For systems like Hadoop MR, Hive, Spark and Alluxio, hadoop-bos helps 
them use BOS as the underlying storage system instead of HDFS.
+
+## Quick Start
+
+In quick start, we will use hadoop shell command to access a BOS bucket.
+
+### Requirements
+
+1. A Baidu Cloud account. Use the account to create a BOS bucket.
+2. A dev environment that can access BOS. E.g. a local server or a Baidu Cloud 
cloud server.
+3. Install hadoop to the dev environment. Hadoop is installed at 
`$HADOOP_HOME`.
+
+### Usage
+
+* The `hadoop-bos` connector jar is included in the Hadoop cloud storage 
distribution
+(`hadoop-cloud-storage-dist`) and can be found in the release package at
+`$HADOOP_HOME/share/hadoop/common/lib/hadoop-bos-{VERSION}.jar`.
+
+Note: By default, only the `hadoop-bos` jar itself is included in the release 
tarball.
+The BOS SDK dependencies are excluded to reduce distribution size. To build a 
distribution
+with full BOS dependencies included, add `-Dhadoop-bos-package` to the build 
command.
+
+If you are building from source or need to build the module separately, use:
+```bash
+mvn package -DskipTests -pl org.apache.hadoop:hadoop-bos
+```
+
+The bundle jar file will be placed at
+`hadoop-cloud-storage-project/hadoop-bos/target/hadoop-bos-{VERSION}.jar`.
+
+* If the jar is not already present in `$HADOOP_HOME/share/hadoop/common/lib/`,
+copy it there and add it to the classpath. Remember to copy to all hadoop 
nodes.
+```bash
+cp hadoop-bos-{VERSION}.jar $HADOOP_HOME/share/hadoop/common/lib/
+```
+
+* Configure properties below.
+
+```xml
+<configuration>
+  <property>
+    <name>fs.defaultFS</name>
+    <value>bos://{your_bucket_name}/</value>
+    <description>
+      The name of the default file system. Make it your BOS bucket.
+    </description>
+  </property>
+
+  <property>
+    <name>fs.bos.endpoint</name>
+    <value></value>
+    <description>
+      Object storage endpoint to connect to, e.g. 
'fs.bos.endpoint'='bj.bcebos.com'.
+    </description>
+  </property>
+
+  <property>
+    <name>fs.bos.impl</name>
+    <value>org.apache.hadoop.fs.bos.BaiduBosFileSystem</value>
+    <description>
+      The implementation class of the BOS FileSystem.
+    </description>
+  </property>
+
+  <property>
+    <name>fs.AbstractFileSystem.bos.impl</name>
+    <value>org.apache.hadoop.fs.bos.BOS</value>
+    <description>
+      The implementation class of the BOS AbstractFileSystem.
+    </description>
+  </property>
+
+  <property>
+    <name>fs.bos.access.key</name>
+    <value></value>
+    <description>
+      The access key of Baidu Cloud's user or role.
+    </description>
+  </property>
+
+  <property>
+    <name>fs.bos.secret.access.key</name>
+    <value></value>
+    <description>
+      The secret key of the access key specified by 'fs.bos.access.key'.
+    </description>
+  </property>
+</configuration>
+```
+
+* Use hadoop shell command to access BOS.
+
+```bash
+# 1. List root dir.
+hadoop fs -ls /
+
+# 2. Make directory.
+hadoop fs -mkdir /hadoop-bos
+
+# 3. Write and read.
+echo "hello BOS." > hello.txt
+hadoop fs -put hello.txt /hadoop-bos/
+hadoop fs -cat /hadoop-bos/hello.txt
+
+# 4. Delete file and directory.
+hadoop fs -rm -r /hadoop-bos/
+```
+
+## Introduction
+
+This is a brief introduction of hadoop-bos design and basic functions. The 
following contents are
+based on flat mode by default. The differences between hierarchy mode will be 
explained at the end
+of each section.
+
+### BOS
+
+BOS is the object storage service of Baidu Cloud. It is similar to AWS S3, 
Azure Blob Storage
+and Aliyun OSS. BOS has 2 modes: the flat mode and the hierarchy mode. In flat 
mode, there are no directories,
+all objects are files indexed by the object names. User can use 'slash' in the 
object name to
+logically divide objects into different "directories", though the "directories 
divided by the slash"
+are not real. Cleanup a logic directory is to clean all the files with 
"directory path" as prefix.
+
+In hierarchy mode, there are directories and files. A directory object is the 
object whose name
+ends with slash. All objects start with the directory object name are the 
directory object's
+consecutive objects, and together they form a directory tree. A directory 
object can't contain
+any data. Delete or rename a directory object will clean or rename all objects 
under the
+directory tree atomically.
+
+### Directory and file
+
+This section illustrates how hadoop-bos transforms BOS to a hadoop FileSystem. 
BOS requires object's
+name must not start with slash, must not contain consecutive slash and must 
not be empty. Here is
+the transformation rules.
+
+* Object name is divided by slash to form hierarchy.
+* An object whose name ends with slash is a directory.
+* An object whose name doesn't end with slash is a file.
+* A file's parents are directories, no matter whether the parent exists or not.
+
+For example, supposing we have 2 objects "user/table/" and 
"user/table/part-0". The first object
+is mapped to "/user/table" in hadoop and is a directory. The second object is 
mapped to
+"/user/table/part-0" as a file. The non-existent object "user/" is mapped to 
"/user" as a directory
+because it's the parent of file "/user/table/part-0".
+
+| Object name       | Object existence | FileSystem path    | FileSystem Type |
+|-------------------|------------------|--------------------|-----------------|
+| user/table/       | yes              | /user/table        | Directory       |
+| user/table/part-0 | yes              | /user/table/part-0 | File            |
+| user/             | no               | /user              | Directory       |
+
+The FileSystem requirements above are not enforced rules in flat mode, users 
can construct
+cases violating the requirements above. For example, creating a file with its 
parent is a file. In
+hierarchy mode, the requirements are enforced rules controlled by BOS service, 
so there won't be
+semantic violations.
+
+### List, Rename and Delete
+
+List, rename and delete are costly operations in flat mode. Since the 
namespace is flat, to list
+a directory, the client needs to scan all objects with directory as the prefix 
and filter with
+delimiter. For rename and delete directory, the client needs to first list the 
directory to get all
+objects and then rename or delete objects one by one. So they are not atomic 
operations and costs a
+lot comparing to hdfs.
+
+The idiosyncrasies of hierarchy mode is supporting directory. So it can list 
very fast and
+support atomic rename and delete directory. Rename or delete failure in flat 
mode may leave
+the bucket in an inconsistent state, the hierarchy mode won't have this 
problem.
+
+### Read and write file
+
+The read behaviour in hadoop-bos is very like reading an HDFS file. The 
challenge is how to keep the
+input stream consistent with object. If the object is changed after we open 
the file, the input
+stream should fail. This is implemented by saving the file checksum when open 
file. If the
+file is changed while reading, the input stream will compare the checksum and 
trigger an exception.
+
+The write behaviour in hadoop-bos is slightly different from hdfs. Firstly, 
the append interface
+is not supported. Secondly, the file is not visible until it is successfully 
closed. Finally,
+when 2 clients try to write one file, the last client to close the file will 
override the previous
+one.
+
+Both read and write has many performance optimizations. E.g. range read, 
connection reuse, local
+write buffer, put for small files, multipart-upload for big files etc.
+
+### Permissions
+
+BOS permission model is different from hadoop filesystem permission model. BOS 
supports permissions
+based on IAM, Bucket Policy, Bucket and Object ACL, while hadoop filesystem 
permission model uses
+mode and acl. There is no way to map BOS permission to hadoop filesystem 
permission, so we have
+to use fake permissions in BaiduBosFileSystem and BOS. Users can read and 
change the filesystem
+permissions, they can only be seen but not effective. Permission control 
eventually depends on BOS
+permission model.
+
+### Times
+
+Hadoop-bos supports last modified time and doesn't support access time. For 
files, the last modified
+time is the object's modified time. For directories, if the directory object 
doesn't exist, the last
+modified time is the current system time. If the directory object exists, the 
last modified time is
+the object's modify time when `getFileStatus` and current system time when 
`listStatus`.
+
+### File checksum
+
+BOS supports CRC32 checksum. We can retrieve it by calling 
`FileSystem#getFileChecksum`.
+To be compatible with HDFS, BOS provides optional CRC32C checksum. When we 
distcp
+between HDFS and BOS, we can rely on distcp checksum mechanisms to keep data 
consistent.
+
+### Credential
+
+BOS client uses access key id and secret access key to authenticate with BOS 
service. There are 2
+ways to configure them. First is adding to hadoop configuration, such as 
adding to core-site.xml or
+configuring through `-D` parameter. The second is setting environment 
variable, hadoop-bos will
+search for environment variables automatically.
+
+To configure ak, sk in hadoop configuration, using the key below.
+
+```xml
+<configuration>
+  <!--Set global ak, sk for all buckets.-->
+  <property>
+    <name>fs.bos.access.key</name>
+    <value></value>
+    <description>
+      The accessKey key to access the BOS object storage.
+    </description>
+  </property>
+  <property>
+    <name>fs.bos.secret.access.key</name>
+    <value></value>
+    <description>
+      The secret access key to access the object storage.
+    </description>
+  </property>
+  <property>
+    <name>fs.bos.session.token.key</name>
+    <value></value>
+    <description>
+      The session token to access the object storage.
+    </description>
+  </property>
+
+  <!--Set ak, sk for specified bucket. It has higher priority then the global 
keys.-->
+  <property>
+    <name>fs.bos.bucket.{bucket_name}.access.key</name>
+    <value></value>
+    <description>
+      The access key to access the object storage for the configured bucket.
+    </description>
+  </property>
+  <property>
+    <name>fs.bos.bucket.{bucket_name}.secret.access.key</name>
+    <value></value>
+    <description>
+      The secret access key to access the object storage for the configured 
bucket.
+    </description>
+  </property>
+  <property>
+    <name>fs.bos.bucket.{bucket_name}.session.token.key</name>
+    <value></value>
+    <description>
+      The session token to access the object storage for the configured bucket.
+    </description>
+  </property>
+</configuration>
+```
+
+The ak, sk in environment variables have the top priority and automatically 
fall back to hadoop
+configuration if not found.
+
+## Properties Summary
+
+| properties                                | description                      
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                      | default value                           
                                                                                
                          | required |
+|-------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------|----------|
+| fs.bos.access.key                         | The accessKey key to access the 
BOS object storage                                                              
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                       | NONE                                   
                                                                                
                           | YES      |
+| fs.bos.secret.access.key                  | The secret access key to access 
the object storage                                                              
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                       | NONE                                   
                                                                                
                           | YES      |
+| fs.bos.session.token.key                 | The session token to access the 
object storage                                                                  
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                       | NONE                                   
                                                                                
                           | NO       |
+| fs.bos.endpoint                          | Object storage endpoint to 
connect to, e.g. bj.bcebos.com, gz.bcebos.com                                   
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                          | NONE                                
                                                                                
                              | NO       |
+| fs.bos.bucket.%s.access.key              | The access key to access the 
object storage for the configured bucket, where %s is the bucket name.          
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                          | NONE                                
                                                                                
                              | NO       |
+| fs.bos.bucket.%s.secret.access.key        | The secret access key to access 
the object storage for the configured bucket, where %s is the bucket name       
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                       | NONE                                   
                                                                                
                           | NO       |
+| fs.bos.bucket.%s.session.token.key        | The session token to access the 
object storage for the configured bucket, where %s is the bucketname            
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                       | NONE                                   
                                                                                
                           | NO       |
+| fs.bos.credentials.provider              | Credentials provider class for 
BOS authentication. Available providers: ConfigurationCredentialsProvider, 
EnvironmentVariableCredentialsProvider, HadoopCredentialsProvider               
                                                                                
                                                                                
                                                                                
                                                                                
                                                           | 
org.apache.hadoop.fs.bos.credentials.ConfigurationCredentialsProvider           
                                                                        | NO    
   |
+| fs.bos.multipart.uploads.block.size      | The size of each part for 
multipart uploads (in bytes).                                                   
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                            | 16777216 (16MB)                   
                                                                                
                               | NO       |
+| fs.bos.multipart.uploads.concurrent.size  | The number of concurrent threads 
for multipart uploads.                                                          
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                       | 10                                     
                                                                                
                           | NO       |
+| fs.bos.copy.large.file.threshold          | The threshold (in bytes) for 
using multipart upload during copy operations.                                  
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                           | 5368709120 (5GB)                   
                                                                                
                            | NO       |
+| fs.bos.max.connections                   | The maximum number of connections 
to the BOS service that a client can create.                                    
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                      | 50                                      
                                                                                
                          | NO       |
+| fs.bos.readahead.size                   | The size of readahead buffer (in 
bytes).                                                                         
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                     | 4194304 (4MB)                            
                                                                                
                         | NO       |
+| fs.bos.read.buffer.size                 | The size of read buffer (in 
bytes).                                                                         
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                          | 131072 (128KB)                      
                                                                                
                              | NO       |
+| fs.bos.threads.max.num                 | The maximum number of threads for 
BOS operations.                                                                 
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                      | 64                                      
                                                                                
                          | NO       |
+| fs.bos.bucket.hierarchy                 | Whether the bucket uses 
hierarchical namespace mode.                                                    
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                 | NONE                         
                                                                                
                                     | NO       |
+
+## Running unit tests in hadoop-bos module
+
+Unit tests need to connect to BOS service. Setting the environment variables 
below to run unit
+tests.
+
+```bash
+export FS_BOS_ACCESS_KEY=YOUR_ACCESS_KEY
+export FS_BOS_SECRET_ACCESS_KEY=YOUR_SECRET_ACCESS_KEY
+export FS_BOS_ENDPOINT=bj.bcebos.com
+```
+
+Then cd to hadoop project root directory, and run the test command below.
+
+```bash
+mvn -Dtest=org.apache.hadoop.fs.bos.** test -pl org.apache.hadoop:hadoop-bos
+```
+
+## Testing the hadoop-bos Module
+
+To test BOS filesystem, the following configuration file is needed:
+
+### `contract-test-options.xml`
+
+All configurations related to support contract tests need to be specified in 
`contract-test-options.xml`. Here is an example of `contract-test-options.xml`.
+
+```xml
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
+<configuration>
+    <property>
+        <name>fs.contract.test.fs.bos</name>
+        <value>bos://your-bucket-name/test</value>
+    </property>
+    <property>
+        <name>fs.bos.endpoint</name>
+        <value>bj.bcebos.com</value>
+    </property>
+    <property>
+        <name>fs.bos.credentials.provider</name>
+        
<value>org.apache.hadoop.fs.bos.credentials.EnvironmentVariableCredentialsProvider</value>
+    </property>
+</configuration>
+```
+
+If the option `fs.contract.test.fs.bos` is not defined in the file, all 
contract tests will be skipped.
+
+## Features and Limitations
+
+### Supported Features
+
+- File create, read, delete
+- Directory operations (mkdir, delete)
+- Rename (via copy + delete)
+- Random access (seek)
+- Content summary
+- Checksum verification
+- Hierarchical namespace buckets (atomic rename/delete)
+
+### Unsupported Features
+
+- Append to files
+- File concatenation
+- File truncation
+- Symbolic links
+- Extended attributes (xattr)
+- Full Unix permissions (limited support in hierarchy mode)
+- hflush/hsync operations

Review Comment:
   keep your change sync from README-TEST.md





> Incorporate Baidu Yun BOS file system implementation
> ----------------------------------------------------
>
>                 Key: HDFS-11161
>                 URL: https://issues.apache.org/jira/browse/HDFS-11161
>             Project: Hadoop HDFS
>          Issue Type: New Feature
>          Components: fs
>            Reporter: Faen Zhang
>            Priority: Major
>              Labels: pull-request-available
>   Original Estimate: 840h
>  Remaining Estimate: 840h
>
> Baidu Yun ( https://cloud.baidu.com/ ) is one of top tier cloud computing 
> provider. Baidu Yun BOS is widely used among China's cloud users, but 
> currently it is not easy to access data laid on BOS storage from user's 
> Hadoop/Spark application, because of no original support for BOS in Hadoop.
> This work aims to integrate Baidu Yun BOS with Hadoop. By simple 
> configuration, Spark/Hadoop applications can read/write data from BOS without 
> any code change. Narrowing the gap between user's APP and data storage, like 
> what have been done for S3 and Aliyun OSS in Hadoop.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to