配置和使用
您只需下载相应的 SDK 包,修改部分配置即可使用 BOS HDFS 工具。
下载
- 下载 BOS FS JAR,将解压后的jar包复制到
$hadoop_dir/share/hadoop/common
中。
使用前准备
- 在 Hadoop 配置路径中修改
log4j.properties
,调整 BOS SDK 的日志配置:log4j.logger.com.baidubce.http=WARN
- 在
$hadoop_dir/etc/hadoop/core-site.xml
文件中添加或者修改 BOS HDFS 相关配置。
<property>
<name>fs.bos.access.key</name>
<value>{Your AK}</value>
</property>
<property>
<name>fs.bos.secret.access.key</name>
<value>{Your SK}</value>
</property>
<property>
<name>fs.bos.endpoint</name>
<value>http://bj.bcebos.com</value>
</property>
<property>
<name>fs.bos.impl</name>
<value>org.apache.hadoop.fs.bos.BaiduBosFileSystem</value>
</property>
<property>
<name>fs.AbstractFileSystem.bos.impl</name>
<value>org.apache.hadoop.fs.bos.BOS</value>
</property>
可配置的属性:
名称 | 描述 |
---|---|
fs.bos.access.key | 必须,BOS 的访问 accessKey。 |
fs.bos.secret.access.key | 必须,BOS 的访问 secretKey。 |
fs.bos.endpoint | 必须,BOS存储桶所在的endpoint。 |
fs.bos.session.token.key | 可选,临时访问方式,如果配置,fs.bos.access.key 和 fs.bos.secret.access.key 也应该是临时访问密钥。 |
fs.bos.credentials.provider | 可选,credentials 获取方式,可配置 value 值:org.apache.hadoop.fs.bos.credentials.BasicBOSCredentialsProvider、org.apache.hadoop.fs.bos.credentials.EnvironmentVariableCredentialsProvider,默认org.apache.hadoop.fs.bos.credentials.BasicBOSCredentialsProvider。 |
fs.bos.bucket.{your bucket}.access.key | 可选,指定 {your bucket} 的 BOS 访问 accessKey,访问 {your bucket} 资源优先使用此项。 |
fs.bos.bucket.{your bucket}.secret.access.key | 可选,指定 {your bucket} 的 BOS 访问 secretKey,访问 {your bucket} 资源优先使用此项。 |
fs.bos.bucket.{your bucket}.session.token.key | 可选,指定 {your bucket} 的临时访问 STS 方式,如果配置,fs.bos.bucket.{your bucket}.access.key 和 fs.bos.bucket.{your bucket}.secret.access.key 也应该是临时访问密钥,访问 {your bucket} 资源优先使用此项。 |
fs.bos.bucket.{your bucket}.endpoint | 可选,指定 {your bucket} 的 BOS 存储桶所在的 endpoint,访问 {your bucket} 资源优先使用此项。 |
fs.bos.block.size | 可选,默认128MB, 模拟 HDFS Block Size,在 DistCp 等需要验证 Block 信息的场景使用。 |
fs.bos.max.connections | 可选,客户端支持的最大连接数,默认1000。 |
fs.bos.multipart.uploads.block.size | 可选,客户端使用分块上传时候的分块大小,16777216,单位:byte。 |
fs.bos.multipart.uploads.concurrent.size | 可选,客户端使用分块上传时候并发数,默认10。 |
fs.bos.object.dir.showtime | 可选,list 时候显示目录的修改时间,会额外增加一些交互次数,默认 false。 |
fs.bos.tail.cache.enable | 可选,缓存文件尾部部分数据,可以提升 parquet/orc 等文件的解析性能,默认 true。 |
fs.bos.crc32c.checksum.enable | 可选,开启 crc32c checksum 校验,开启后上传的文件才会计算 CRC32C。 |
fs.bos.bucket.hierarchy | 可选,Bucket 是否是 namespace 类型的,正确设置可节省一次校验开销,错误设置会到导致 Bucket 访问失败。缺省,则自动查询选择。 |
fs.bos.rename.enable | 可选,开启后支持元数据 rename 语义,当前小范围内测阶段,开启前需工单联系是否能使用,否则请求会返回 403 授权失败,默认 false。 |
如使用 EnvironmentVariableCredentialsProvider,需设置环境变量:
# 必须,BOS的访问accessKey
FS_BOS_ACCESS_KEY
# 必须,BOS的访问secretKey
FS_BOS_SECRET_ACCESS_KEY
# 可选,临时访问方式
FS_BOS_SESSION_TOKEN_KEY
开始使用
使用 BOS HDFS 访问 BOS 服务时路径需要以 bos://
开始。如:
$ hdfs dfs -ls bos://{bucket}/
$ hdfs dfs -put ${local_file} bos://{bucket}/a/b/c
或者,在 $hadoop_dir/etc/core-site.xml
下配置默认文件目录
<property>
<name>fs.defaultFS</name>
<value>bos://{bucket}</value>
</property>
注意,在配置 fs.defaultFS 为 BosFileSystem 后,如果启动 NameNode 和 DataNode 可能会触发 scheme 检查失败。
建议在仅使用 BosFileSystem 时配置 fs.defaultFS,且无需启动 NameNode 和 DataNode;否则配置 HDFS 默认地址。
就像使用原生 hdfs 那样:
$ hdfs dfs -ls /
一次 wordcount 的实践
1. 创建数据目录
用于保存 MapReduce 任务的输入文件
$ hdfs dfs -mkdir -p bos://test-bucket/data/wordcount
用于保存 MapReduce 任务的输出文件
$ hdfs dfs -mkdir bos://test-bucket/output
查看这两个新创建的目录
$ hdfs dfs -ls bos://test-bucket/
Found 2 items
drwxrwxrwx - 0 1970-01-01 08:00 bos://test-bucket/data
drwxrwxrwx - 0 1970-01-01 08:00 bos://test-bucket/output
如果想要显示文件夹的准确创建时间,可以在 $hadoop_dir/etc/core-site.xml
下配置
<property>
<name>fs.bos.object.dir.showtime</name>
<value>true</value>
</property>
2. 写一个单词文件,并上传到 hdfs
单词文件的内容
$ cat words.txt
hello baidu
hello bos
hadoop hdfs
hello hadoop
bos hdfs
上传 words.txt 到 hdfs
$ hdfs dfs -put words.txt bos://test-bucket/data/wordcount
在 hdfs 中查看刚刚上传的文件
$ hdfs dfs -cat bos://test-bucket/data/wordcount/words.txt
hello baidu
hello bos
hadoop hdfs
hello hadoop
bos hdfs
3. 运行 wordcount 程序
hadoop自带的wordcount程序在$hadoop_dir/share/hadoop/mapreduce/
下
$ hadoop jar hadoop-mapreduce-examples-2.7.7.jar wordcount bos://test-bucket/data/wordcount bos://test-bucket/output/wordcount
4. 查看统计结果
$ hdfs dfs -ls bos://test-bucket/output/wordcount/
-rw-rw-rw- 1 0 2020-06-12 16:55 bos://test-bucket/output/wordcount/_SUCCESS
-rw-rw-rw- 1 61 2020-06-12 16:55 bos://test-bucket/output/wordcount/part-r-00000
$ hdfs dfs -cat bos://test-bucket/output/wordcount/part-r-00000
baidu 1
bos 2
hadoop 2
hdfs 2
hello 3
Hadoop DistCp 使用
DistCp(分布式拷贝)是 Hadoop 自带的用于大规模集群内部和集群之间拷贝的工具。 它使用 Map/Reduce 实现文件分发,错误处理和恢复,以及报告生成。 它把文件和目录的列表作为 map 任务的输入,每个任务会完成源列表中部分文件的拷贝。
对于 HDFS 集群和 BOS 间的数据拷贝,可以借助 BOS HDFS 工具,像标准的 Hadoop DistCp 那样。
前置工作
如上,下载 BOS HDFS 相关 jar 包,并做一些必要的配置。
以数据源端是 HDFS 集群,目的端是 BOS 为例,检查源和目的端的读写正常。
$ hadoop fs -get hdfs://host:port/xxx ./
$ hadoop fs -put xxx bos://bucket/xxx
开始拷贝
普通拷贝
# 从hdfs的src,拷贝到bos指定bucket下的dst路径,默认情况会跳过已经存在的目标文件
$ hadoop distcp hdfs://host:port/src bos://bucket/dst
注意:使用 CRC 校验拷贝前后的数据,BOS HDFS 需设置 fs.bos.block.size 和源 HDFS 一致,并开启fs.bos.crc32c.checksum.enable;仅支持 HDFS 的 dfs.checksum.combine.mode=COMPOSITE_CRC 校验算法。
更新和覆盖
# 拷贝,执行覆盖的唯一标准是源文件和目标文件大小是否相同,如果不同,则源文件替换目标文件
$ hadoop distcp -update hdfs://host:port/src bos://bucket/dst
# 拷贝,并覆盖已经存在的目标文件
$ hadoop distcp -overwrite hdfs://host:port/src bos://bucket/dst
拷贝多个源
# 指定多个源路径
$ hadoop distcp hdfs://host:port/src1 hdfs://host:port/src2 bos://bucket/dst
# 从文件里获得多个源
# srcList的内容是类似hdfs://host:port/src1、hdfs://host:port/src2的多行源路径
$ hadoop distcp hdfs://host:port/srcList bos://bucket/dst
注意:多个源的拷贝可能会有冲突,参考标准 hadoop distcp 的处理。
更多配置
# 指定拷贝数据时map的数目
# 更多的map数量可能不会提升数据吞吐,反而会带来一些问题,map数量应该根据集群资源和拷贝数据规模综合设定
$ hadoop distcp -m 10 hdfs://host:port/src bos://bucket/dst
# 忽略失败的map,但会保留失败操作日志
$ hadoop distcp -i hdfs://host:port/src bos://bucket/dst
# 动态分配任务
# 默认的分配策略是基于文件大小,在更新拷贝时候,因为有跳过文件,实际拷贝时候有类似"数据倾斜"的问题,耗时最长的map拖慢整体进度
$ hadoop distcp -strategy dynamic -update hdfs://host:port/src bos://bucket/dst
更多配置参数,输入 hadoop distcp
命令即可获取帮助信息。
使用进阶
由于自建 Hadoop 集群的可拓展性有限,且需要大量人力对集群进行运维,如果您对性能及安全性有更高要求,推荐使用百度智能云提供的 百度 MapReduce(BMR)。BMR 是全托管的 Hadoop/Spark 集群,您可以按需部署并弹性扩展集群,只需专注于大数据处理、分析、报告,拥有多年大规模分布式计算技术积累的百度运维团队全权负责集群运维,能够在性能,安全性和便捷性上有大幅提升。