我们之前所学习的HDFS shell客户端和Java客户端,都客户端上安装了HDFS客户端。之前我们在windows上也配置了HDFS的windows版本客户端,否则,我们将无法操作HDFS。而且,客户端的版本如果不匹配,有可能会导致无法操作。接下来,我们将学习几种基于HTTP协议的客户端,HTTP是跨平台的,它不要求客户端上必须安装Hadoop,就可以直接操作HDFS。
概述:WebHDFS其实是HDFS提供的HTTP RESTFul API接口,并且它是独立于Hadoop的版本的,它支持HDFS的完整FileSystem / FileContext接口。它可以让客户端发送http请求的方式来操作HDFS,而无需安装Hadoop。
在我们经常使用的HDFS Web UI,它就是基于webhdfs来操作HDFS的。
概述:符合REST设计风格的Web API称为RESTful API。它从以下三个方面资源进行定义:
http://example.com/resources
资源 | GET | PUT | POST | DELETE |
---|---|---|---|---|
一组资源的URI,比如 https://example.com/resources |
列出URI,以及该资源组中每个资源的详细信息。 | 使用给定的一组资源替换当前整组资源。 | 在本组资源中创建/追加一个新的资源。该操作往往返回新资源的URL。 | 删除整组资源。 |
单个资源的URI,比如https://example.com/resources/142 |
获取指定的资源的详细信息,格式可以自选一个合适的网络媒体类型(比如:XML、JSON等) | 替换/创建指定的资源。并将其追加到相应的资源组中。 | 把指定的资源当做一个资源组,并在其下创建/追加一个新的元素,使其隶属于当前资源。 | 删除指定的元素。 |
PUT请求类型和POST请求类型的区别:
HDFS HTTP RESTFUL API它支持以下操作:
HTTP GET:
HTTP PUT:
HTTP POST:
HTTP DELETE:
WebHDFS的文件系统schema是webhdfs://。WebHDFS文件系统URL具有以下格式。
webhdfs://:/
上面的WebHDFS URL对应于下面的HDFS URL。
hdfs://:/
在RESTAPI中,在路径中插入前缀“/webhdfs/v1”,并在末尾追加一个查询。因此,对应的HTTPURL具有以下格式。
http://:/webhdfs/v1/?op=...
请求URL:http://node1.itcast.cn:9870/webhdfs/v1/?op=LISTSTATUS
该操作表示要查看根目录下的所有文件以及目录,相当于 hdfs dfs -ls /
在/data/hdfs-test目录中创建一个名字为webhdfs_api.txt文件,并写入内容。
创建一个请求,设置请求方式为PUT,请求url为:
http://node1.itcast.cn:9870/webhdfs/v1/data/hdfs-test/webhdfs_api.txt?op=CREATE&overwrite=true&replication=2&noredirect=true
HTTP会响应一个用于上传数据的URL链接。
使用Location标头中的URL提交另一个HTTP PUT请求(如果指定了noredirect,则返回返回的响应),并写入要写入的文件数据。
curl -i -X PUT -T "http://:/webhdfs/v1/?op=CREATE..."
概述:
操作方式:
$curl ‘http://httpfs-host:14000/webhdfs/v1/user/foo/README.txt?op=OPEN&user.name=foo’
返回HDFS的内容/user/foo/README.txt档案。
$curl ‘http://httpfs-host:14000/webhdfs/v1/user/foo?op=LISTSTATUS&user.name=foo’
返回HDFS的内容/user/foo目录中的JSON格式。
$curl ‘http://httpfs-host:14000/webhdfs/v1/user/foo?op=GETTRASHROOT&user.name=foo’
返回路径/user/foo/.trash,如果/是加密区域,则返回路径。/.Trash/Foo。看见更多细节关于加密区域中的垃圾路径。
$curl -X POST‘http://httpfs-host:14000/webhdfs/v1/user/foo/bar?op=MKDIRS&user.name=foo’
创建HDFS/user/foo/bar目录。
1 编辑Hadoop的core-site.xml,并将运行HttpFS服务器的Unix用户定义为proxyuser。例如:
hadoop.proxyuser.#HTTPFSUSER#.hosts
httpfs-host.foo.com
hadoop.proxyuser.#HTTPFSUSER#.groups
*
2 重要:替换#HTTPFSUSER#使用将启动HttpFS服务器的Unix用户。
例如:
hadoop.proxyuser.root.hosts
*
hadoop.proxyuser.root.groups
*
3 重启Hadoop
4 启动HttpFS
hdfs --daemon start httpfs
5 测试HttpFS工作
http://node1.itcast.cn:14000/webhdfs/v1?user.name=root&op=LISTSTATUS
webHDFS
httpFS
概述:
文件格式是定义数据文件系统中存储的一种方式,可以在文件中存储各种数据结构,特别是Row、Map,数组以及字符串,数字等。
在Hadoop中,没有默认的文件格式,格式的选择取决于其用途。而选择一种优秀、适合的数据存储格式是非常重要的。
后续我们要学习的,使用HDFS的应用程序(例如MapReduce或Spark)性能中的最大问题、瓶颈是在特定位置查找数据的时间和写入到另一个位置的时间,而且管理大量数据的处理和存储也很复杂(例如:数据的格式会不断变化,原来一行有12列,后面要存储20列)。
Hadoop文件格式发展了好一段时间,这些文件存储格式可以解决大部分问题。我们在开发大数据中,选择合适的文件格式可能会带来一些明显的好处:
某些文件格式是为通用设计的(如MapReduce或Spark),而其他文件则是针对更特定的场景,有些在设计时考虑了特定的数据特征。因此,确实有很多选择。
每种格式都有优点和缺点,数据处理的不同阶段可以使用不同的格式才会更有效率。通过选择一种格式,最大程度地发挥该存储格式的优势,最小化劣势。
行式存储(Row-Based):同一行数据存储在一起。
列式存储(Column-Based):同一列数据存储在一起。
优缺点:
结构:
概述:
Apache Arrow是一个跨语言平台,是一种列式内存数据结构,主要用于构建数据系统。
Apache Arrow在2016年2月17日作为顶级Apache项目引入。
Arrow促进了许多组件之间的通信。
极大的缩减了通信时候序列化、反序列化所浪费的时间。
性能提高:
压缩算法优劣指标:
压缩格式 | 工具 | 算法 | 文件扩展名 | 是否可切分 | 对应的编码解码器 |
---|---|---|---|---|---|
DEFLATE | 无 | DEFLATE | .deflate | 否 | org.apache.hadoop.io.compress.DefaultCodec |
Gzip | gzip | gzip | .gz | 否 | org.apache.hadoop.io.compress.GzipCodec |
bzip2 | bzip2 | bzip2 | .bz2 | 是 | org.apache.hadoop.io.compress.BZip2Codec |
LZO | lzop | LZO | .lzo | 是(切分点索引) | com.hadoop.compression.lzo.LzopCodec |
LZ4 | 无 | LZ4 | .lz4 | 否 | org.apache.hadoop.io.compress.Lz4Codec |
Snappy | 无 | Snappy | .snappy | 否 | org.apache.hadoop.io.compress.SnappyCodec |
使用原则:
冷、热、温、冻数据
通常,公司或者组织总是有相当多的历史数据占用昂贵的存储空间。典型的数据使用模式是新传入的数据被应用程序大量使用,从而该数据被标记为"热"数据。随着时间的推移,存储的数据每周被访问几次,而不是一天几次,这时认为其是"暖"数据。在接下来的几周和几个月中,数据使用率下降得更多,成为"冷"数据。如果很少使用数据,例如每年查询一次或两次,这时甚至可以根据其年龄创建第四个数据分类,并将这组很少被查询的旧数据称为"冻结数据"。
Hadoop允许将不是热数据或者活跃数据的数据分配到比较便宜的存储上,用于归档或冷存储。可以设置存储策略,将较旧的数据从昂贵的高性能存储上转移到性价比较低(较便宜)的存储设备上。
Hadoop 2.5及以上版本都支持存储策略,在该策略下,不仅可以在默认的传统磁盘上存储HDFS数据,还可以在SSD(固态硬盘)上存储数据。
异构存储概述:
HDFS中声明定义了4种异构存储类型:
问:如何让HDFS知道集群中的数据存储目录是哪种类型存储介质?
答:配置属性时主动声明。HDFS并没有自动检测的能力。
配置参数dfs.datanode.data.dir = [SSD]file:///grid/dn/ssdO
如果目录前没有带上[SSD] [DISK] [ARCHIVE] [RAM_DISK] 这4种类型中的任何一种,则默认是DISK类型 。
概述:
4.3 块存储类型选择策略–命令
hdfs storagepolicies -listPolicies
hdfs storagepolicies -setStoragePolicy -path -policy
hdfs storagepolicies -unsetStoragePolicy -path
在执行unset命令之后,将应用当前目录最近的祖先存储策略,如果没有任何祖先的策略,则将应用默认的存储策略。
hdfs storagepolicies -getStoragePolicy -path
LAZY PERSIST介绍:
LAZY PERSIST执行流程:
LAZY PERSIST设置使用:
mount -t tmpfs -o size=1g tmpfs /mnt/dn-tmpfs/
将tmpfs挂载到目录/mnt/dn-tmpfs/,并且限制内存使用大小为1GB 。
将机器中已经完成好的虚拟内存盘配置到dfs.datanode.data.dir 中,其次还要带上 RAM_DISK 标签.
dfs.storage.policy.enabled
是否开启异构存储,默认true开启
dfs.datanode.max.locked.memory
用于在数据节点上的内存中缓存块副本的内存量(以字节为单位)。默认情况下,此参数设置为0,这将禁用 内存中缓存。内存值过小会导致内存中的总的可存储的数据块变少,但如果超过 DataNode 能承受的最大内 存大小的话,部分内存块会被直接移出 。
hdfs storagepolicies -setStoragePolicy -path -policy LAZY_PERSIST
mnt/dn-tmpfs/,并且限制内存使用大小为1GB 。
将机器中已经完成好的虚拟内存盘配置到dfs.datanode.data.dir 中,其次还要带上 RAM_DISK 标签.
[外链图片转存中…(img-gJq9FwH8-1668077793343)]
dfs.storage.policy.enabled
是否开启异构存储,默认true开启
dfs.datanode.max.locked.memory
用于在数据节点上的内存中缓存块副本的内存量(以字节为单位)。默认情况下,此参数设置为0,这将禁用 内存中缓存。内存值过小会导致内存中的总的可存储的数据块变少,但如果超过 DataNode 能承受的最大内 存大小的话,部分内存块会被直接移出 。
hdfs storagepolicies -setStoragePolicy -path -policy LAZY_PERSIST