首页 文章 精选 留言 我的

精选列表

搜索[通用具身大脑],共10000篇文章
优秀的个人博客,低调大师

这是一篇最通熟易懂的Hadoop HDFS实践攻略!

本文主要帮您解决一下几个问题: HDFS是用来解决什么问题?怎么解决的? 如何在命令行下操作HDFS? 如何使用Java API来操作HDFS? 在了解基本思路和操作方法后,进一步深究HDFS具体的读写数据流程 学习并实践本文教程后,可以对HDFS有比较清晰的认识,并可以进行熟练操作,为后续学习Hadoop体系打好基础。 目录: 理论部分 HDFS 基本原理 文件读取、写入机制 元数据管理思路 实践部分 安装实践环境 Shell 命令行操作方式 Java API操作方式 一、HDFS基本原理 HDFS(Hadoop Distribute File System)是一个分布式文件系统,是Hadoop的重要成员。 1、文件系统的问题 文件系统是操作系统提供的磁盘空间管理服务,只需要我们制定把文件放到哪儿,从哪个路径读取文件就可以了,不用关心文件在磁盘上是如何存放的。 当文件所需空间大于本机磁盘空间时,如何处理呢? 一是加磁盘,但是加到一定程度就有限制了;二是加机器,用远程共享目录的方式提供网络化的存储,这种方式可以理解为分布式文件系统的雏形,可以把不同文件放入不同的机器中,空间不足了可继续加机器,突破了存储空间的限制。但这个方式有多个问题: 单机负载可能极高例如某个文件是热门,很多用户经常读取这个文件,就使得次文件所在机器的访问压力极高。 数据不安全如果某个文件所在的机器出现故障,这个文件就不能访问了,可靠性很差。 文件整理困难例如想把一些文件的存储位置进行调整,就需要看目标机器的空间是否够用,并且需要自己维护文件位置,如果机器非常多,操作就极为复杂。 2、HDFS的解决思路 HDFS是个抽象层,底层依赖很多独立的服务器,对外提供统一的文件管理功能,对于用户来讲,感觉就像在操作一台机器,感受不到HDFS下面的多台服务器。 例如用户访问HDFS中的/a/b/c.mpg这个文件,HDFS负责从底层相应服务器中读取,然后返回给用户,这样用户只需和HDFS打交道,不关心这个文件是怎么存储的。 例如用户需要保存一个文件/a/b/xxx.avi。 HDFS首先会把这个文件进行分割,例如分为4块,然后分别放到不同服务器上。 这样做有个好处,不怕文件太大,并且读文件的压力不会全部集中在一台服务器上。但如果某台服务器坏了,文件就读不全了。 HDFS为保证文件可靠性,会把每个文件块进行多个备份: 块1:A B C 块2:A B D 块3:B C D 块4:A C D 这样文件的可靠性就大大增强了,即使某个服务器坏了,也可以完整读取文件。 同时还带来一个很大的好处,就是增加了文件的并发访问能力,比如多个用户读取这个文件时,都要读块1,HDFS可以根据服务器的繁忙程度,选择从那台服务器读块1。 3、元数据的管理 HDFS中存了哪些文件? 文件被分成了哪些块? 每个块被放在哪台服务器上? …… 这些都叫做元数据,这些元数据被抽象为一个目录树,记录了这些复杂的对应关系。这些元数据由一个单独的模块进行管理,这个模块叫做NameNode。存放文件块的真实服务器叫做DataNode,所以用户访问HDFS的过程可以理解为: 用户-> HDFS -> NameNode -> DataNode 4、HDFS优点 容量可以线性扩展 有副本机制,存储可靠性高,吞吐量增大 有了NameNode后,用户访问文件只需指定HDFS上的路径 二、HDFS实践 经过上面介绍,可以对HDFS有个基本的了解,下面开始进行实际操作,在实践中更好的认识HDFS。 1、安装实践环境 您可以选择自己搭建环境,也可以使用打包好的Hadoop环境(版本2.7.3) 这个Hadoop环境实际上是一个虚机镜像,所以需要安装virtualbox虚拟机、vagrant镜像管理工具,和我的Hadoop镜像,然后用这个镜像启动虚机就可以了,下面是具体操作步骤: 1)安装virtualbox 下载地址:https://www.virtualbox.org/wiki/Downloads 2)安装vagrant 因为官网下载较慢,我上传到了云盘 Windows版 链接:https://pan.baidu.com/s/1pKKQGHl 密码: eykr Mac版 链接:https://pan.baidu.com/s/1slts9yt 密码: aig4 安装完成后,在命令行终端下就可以使用vagrant命令。 3)下载Hadoop镜像 链接:https://pan.baidu.com/s/1bpaisnd 密码: pn6c 4)启动 加载Hadoop镜像 vagrant box add {自定义镜像名称} {镜像所在路径} 例如您想命名为Hadoop,镜像下载后的路径为d:\hadoop.box,加载命令就是这样: vagrant box add hadoop d:\hadoop.box 创建工作目录,例如d:\hdfstest。 进入此目录,初始化 cdd:\hdfstest vagrantinithadoop 启动虚机 vagrantup 启动完成后,就可以使用SSH客户端登录虚机了 IP 127.0.0.1 端口 2222 用户名 root 密码 vagrant 登录后使用命令ifconfig 查看本虚机的IP(如192.168.31.239),可以使用此IP和端口22登录了 IP 192.168.31.239 端口 22 用户名 root 密码 vagrant Hadoop服务器环境搭建完成。 2、Shell命令行操作 登录Hadoop服务器后,先启动HDFS,执行命令: start-dfs.sh 查看帮助 hdfsdfs–help 显示目录信息 -ls 后面是要查看的目录路径 创建目录 创建目录/test hdfsdfs-mkdir/test 一次创建多级目录/aa/bb hdfsdfs-mkdir-p/aa/bb 上传文件 形式 hdfs dfs -put {本地路径} {hdfs中的路径} 实例(先创建好一个测试文件mytest.txt,内容随意,然后上传到/test) hadoopfs-put~/mytest.txt/test 显示文件内容 hdfsdfs-cat/test/mytest.txt 下载文件 hdfsdfs-get/test/mytest.txt./mytest2.txt 合并下载 先创建2个测试文件(log.access, log.error),内容随意,使用-put上传到/test目录下 hdfsdfs-putlog.*/test 然后把2个log文件合并下载到一个文件中 hdfsdfs-getmerge/test/log.*./log 查看本地log文件内容,应该包含log.access与log.error两个文件的内容。 复制 从HDFS的一个路径拷贝HDFS的另一个路径 hdfsdfs-cp/test/mytest.txt/aa/mytest.txt.2 验证 hdfsdfs-ls/aa 移动文件 hdfsdfs-mv/aa/mytest.txt.2/aa/bb 验证 hdfsdfs-ls/aa/bb 应列出mytest.txt.2。 删除 hdfsdfs-rm-r/aa/bb/mytest.txt.2 使用-r参数可以一次删除多级目录。 验证 hdfsdfs-ls/aa/bb 应为空 修改文件权限 与Linux文件系统中的用法一样,修改文件所属权限 -chgrp -chmod -chown 示例 hdfsdfs-chmod666/test/mytest.txt hdfsdfs-chownsomeuser:somegrp/test/mytest.txt 统计文件系统的可用空间 hdfsdfs-df-h/ 统计文件夹的大小 hdfsdfs-du-s-h/test 3、Java API操作 (1)环境配置 因为需要在本机链接Hadoop虚机服务器,所以需要配置Hadoop,使其可以被外部访问。 先登录Hadoop虚机服务器,然后: 1)查看本机IP ipaddress 例如IP为:192.168.31.239 2)修改文件: vi/usr/local/hadoop-2.7.3/etc/hadoop/core-site.xml fs.defaultFS hdfs://localhost:9000 把其中的localhost:9000修改为本机IP 192.168.31.239:9000 3)重新启动HDFS #停止 stop-dfs.sh #启动 start-dfs.sh (2)搭建开发环境 1)新建项目目录hdfstest 2)在项目目录下创建pom.xml 内容: 3)创建源码目录src/main/java 现在项目目录结构 ├──pom.xml !""src │└──main │└──java (3)示例代码 查看文件列表ls 1)新建文件src/main/java/Ls.java 列出/下的文件列表,及递归获取所有文件 2)编译执行 mvncompile mvnexec:java-Dexec.mainClass="Ls"-Dexec.cleanupDaemonThreads =false 创建目录mkdir 在HDFS中创建目录/mkdir/a/b 1)新建文件 src/main/java/Mkdir.java 2)编译执行 mvncompile mvnexec:java-Dexec.mainClass="Mkdir"-Dexec.cleanupDaemonThre ads=false 3)在服务器中使用HDFS命令验证 hdfsdfs-ls/mkdir 上传文件put 在当前项目目录下新建测试文件,上传到HDFS中的/mkdir 1)在项目目录下创建测试文件testfile.txt,内容随意 2)新建文件src/main/java/Put.java 3)编译执行 mvncompile mvnexec:java-Dexec.mainClass="Put"-Dexec.cleanupDaemonThread s=false 4)在服务器中使用HDFS命令验证 hdfsdfs-ls/mkdir hdfsdfs-cat/mkdir/testfile.txt 下载文件get 1)新建文件src/main/java/Get.java 把HDFS中/mkdir/testfile.txt下载到当前项目目录下 2)编译执行 mvncompile mvnexec:java-Dexec.mainClass="Get"-Dexec.cleanupDaemonThread s=false 3)查看项目目录下是否存在testfile2.txt及其内容 删除文件delete 删除HDFS上之前上传的/mkdir/testfile.txt 1)新建文件src/main/java/Del.java 2)编译执行 mvncompile mvnexec:java-Dexec.mainClass="Del"-Dexec.cleanupDaemonThread s=false 3)在服务器中使用HDFS命令验证,检查testfile.txt是否被删除 hdfsdfs-ls/mkdir 重命名rename 把HDFS中的/mkdir/a重命名为/mkdir/a2 1)新建文件src/main/java/Rename.java 2)编译执行 mvncompile mvnexec:java-Dexec.mainClass="Rename"-Dexec.cleanupDaemonThr eads=false 3)在服务器中使用HDFS命令验证 hdfsdfs-ls/mkdir 流方式读取文件部分内容 上传一个文本文件,然后使用流方式读取部分内容保存到当前项目目录。 1)在服务器中创建一个测试文件test.txt,内容: 123456789abcdefghijklmn 上传到HDFS hdfsdfs-puttest.txt/ 2)在本地项目中新建文件src/main/java/StreamGet.java 2)编译执行 mvncompile mvnexec:java-Dexec.mainClass="StreamGet"-Dexec.cleanupDaemon Threads=false 3)执行后查看项目目录下的test.txt.part2 6789abcdefghijklmn 前面的12345已经被略过 三、深入了解 1、写入机制 向HDFS中写入文件时,是按照块儿为单位的,client会根据配置中设置的块儿的大小把目标文件切为多块,例如文件是300M ,配置中块大小值为128M,那么就分为3块儿。 具体写入流程: client向namenode发请求,说想要上传文件 namenode会检查目标文件是否存在、父目录是否存在,检查没有问题后返回确认信息 client再发请求,问第一个block应该传到哪些datanode上 namenode经过衡量,返回3个可用的datanode(A,B,C) client与A建立连接,A与B建立连接,B与C建立连接,形成一个pipeline 传输管道建立完成后,client开始向A发送数据包,此数据包会经过管道一次传递到B和C 当第一个block的数据都传完以后,client再向namenode请求第二个block上传到哪些datanode,然后建立传输管道发送数据 就这样,直到client把文件全部上传完成 2、读取机制 Client把要读取的文件路径发给namenode,查询元数据,找到文件块所在的datanode服务器 Client直到了文件包含哪几块儿、每一块儿在哪些datanode上,就选择那些离自己进的datanode(在同一机房,如果有多个离着近的,就随机选择),请求简历socket流 从datanode获取数据 Client接收数据包,先本地缓存,然后写入目标文件 直到文件读取完成 3、NameNode机制 通过对HDFS读写流程的了解,可以发现namenode是一个很重要的部分,它记录着整个HDFS系统的元数据,这些元数据是需要持久化的,要保存到文件中。 Namenode还要承受巨大的访问量,client读写文件时都需要请求namenode,写文件时要修改元数据,读文件时要查询元数据。 为了提高效率,namenode便将元数据加载到内存中,每次修改时,直接修改内存,而不是直接修改文件,同时会记录下操作日志,供后期修改文件时使用。 这样,namenode对数据的管理就涉及到了3种存储形式: 内存数据 元数据文件 操作日志文件 namenode需要定期对元数据文件和日志文件进行整合,以保证文件中数据是新的,但这个过程很消耗性能,namenode需要快速地响应client的大量请求,很难去完成文件整合操作,这时就引入了一个小助手secondnamenode。 secondnamenode会定期从namenode中下载元数据文件和操作日志,进行整合,形成新的数据文件,然后传回namenode,并替换掉之前的旧文件。 secondnamenode是namenode的好帮手,替namenode完成了这个重体力活儿,并且还可以作为namenode的一个防灾备份,当namenode数据丢失时,secondnamenode上有最近一次整理好的数据文件,可以传给namenode进行加载,这样可以保证最少的数据丢失。 小结 HDFS的基础内容介绍完了,希望可以帮助您快速熟悉HDFS的思路和使用方式。 本文作者:杜亦舒 来源:51CTO

优秀的个人博客,低调大师

高通暂时不会针对物联网打造专属处理器

针对将手机处理器成功经验套用在物联网应用,Qualcomm选择以效能、连接能力与电池损耗达成平衡的Snapdragon 410、Snapdragon 600切入市场,但强调针对特定产品如电视、无人机等也会视实际需求作调整。不过,若比照智慧穿戴装置推出Snapdragon Wear系列处理器的模式,未来是否也针对物联网装置提出专属分类处理器,Qualcomm方面表示考量目前尚未有明确需求,因此暂时还不会有此类计画。 Qualcomm Technologies产品管理总监Leon Farasati表示,目前透过移植Snapdragon系列处理器在手机应用成功经验,藉此对应越来越为庞大的物联网市场使用需求。同时在物联网装置要求占用体积更小、耗电更低,以及低价成本设计需求,目前选择以Snapdragon 410、Snapdragon 600投入多数装置应用为主。 同时,藉由Snapdragon 410、Snapdragon 600发展成熟与弹性应用等特性,Qualcomm目前也将这两款处理器导入开发板与商用模组化设计,前者将提供开发者藉此设计不同应用项目,并且衔接开放架构设计的Linux、Android平台,以及更多人使用的Windows环境架构,而后者则可让硬体厂商直接应用在不同家电等嵌入式产品,藉此扩大物联网应用范围。 但以Qualcomm规划来看,并非仅局限以Snapdragon 410、Snapdragon 600对应物联网使用需求,例如针对显示效能或演算需求更大的高解析电视、无人机等产品应用,依然会选择提供更高阶的Snapdragon 800处理器,甚至若开发厂商有特定需求的话,就连Snapdragon 200系列处理器也能套用在物联网设计项目。 而若比照近期针对智慧穿戴额外规划Snapdragon Wear,未来是否也会针对物联网应用另辟特定系列处理器产品?就Leon Farasati说明,由于目前市场对于物联网应用需求仍未有更明确方向,因此现阶段规划仍以可对应绝大多数需求的处理器产品使用为主。但若未来市场发展在物联网应用有更具体方向时,意味Qualcomm将会针对此类需求提供专属处理器规格。 本文转自d1net(转载)

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册