配置和使用
您只需下载相应的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 集群,您可以按需部署并弹性扩展集群,只需专注于大数据处理、分析、报告,拥有多年大规模分布式计算技术积累的百度运维团队全权负责集群运维,能够在性能,安全性和便捷性上有大幅提升。