草庐IT

HDFS操作方法和基础编程

半濠春水 2023-12-11 原文

(一)完成相关的HDFS的基本shell命令

0.命令基础

①执行命令启动Hadoop(版本是Hadoop3.1.3)。

Hadoop支持很多Shell命令,其中fsHDFS最常用的命令,利用fs可以查看HDFS文件系统的目录结构、上传和下载数据、创建文件等。在终端输入如下命令可以查看fs全部支持的命令。

③在终端输入如下命令,可以查看具体某个命令的作用。例如查看put命令如何使用,可以输入如下命令。

1.目录操作

Hadoop系统安装好后,第一次使用HDFS时需要首先在HDFS中创建用户目录。hadoop用户需要在HDFS中创建一个用户目录,操作如下:

该命令表示在HDFS中创建一个“/user/hadoop”目录,“–mkdir”是创建目录的操作,“-p”表示如果是多级目录,则父目录和子目录一起创建,这里“/user/hadoop”就是一个多级目录,因此必须使用参数“-p”,否则会出错。
②“/user/hadoop”目录成为hadoop用户对应的用户目录,可以使用如下命令显示HDFS中与当前用户hadoop对应的用户目录下的内容。
在命令中,“-ls”表示列出HDFS某个目录下的所有内容,“.”表示HDFS中的当前用户目录,也就是“/user/hadoop”目录。因此,命令"./bin/hdfs dfs -ls.”和命令"./bin/hdfs dfs -ls /user/Hadoop"是等价的。
④列出HDFS上的所有目录。

⑤创建一个input目录,但该目录已经存在。

⑥在创建个input目录时,采用了相对路径形式,实际上⑤的input目录创建成功以后,它在HDFS中的完整路径是“/user/hadoop/input”。如果要在HDFS的根目录下创建一个名称为input的目录,则需要使用如下命令。

⑦使用rm命令删除一个目录,例如使用如下命令删除刚才在HDFS中创建的“/input”目录(不是“/user/hadoop/input”目录):

上面命令中,“-r”参数表示如果删除“/input”目录及其子目录下的所有内容,如果要删除的一个目录包含了子目录,则必须使用“-r”参数,否则会执行失败。

2.文件操作

在实际应用中,经常需要从本地文件系统向HDFS中上传文件,或者把HDFS中的文件下载到本地文件系统中。
①首先,使用vim编辑器,在本地Linux文件系统的“/home/hadoop/”目录下创建一个文件myLocalFile.txt,里面可以随意输入一些单词,比如,输入如下三行:

Hadoop
Spark
XMU DBLAB


②使用如下命令把本地文件系统的“/home/hadoop/myLocalFile.txt”上传到HDFS中的当前用户目录的input目录下,也就是上传到HDFS的“/user/hadoop/input/”目录下:

③使用ls命令查看一下文件是否成功上传到HDFS中,执行后会显示类似如下的信息。
④使用如下命令查看HDFS中的myLocalFile.txt文件的内容。

⑤把HDFS中的myLocalFile.txt文件下载到本地文件系统中的“/home/hadoop/下载/”这个目录下。

⑥使用如下命令,到本地文件系统查看下载下来的文件myLocalFile.txt

⑦把文件从HDFS中的一个目录拷贝到HDFS中的另外一个目录。比如要把HDFS的“/user/hadoop/input/myLocalFile.txt”文件,拷贝到HDFS的另外一个目录“/input”中(注意,这个input目录位于HDFS根目录下),可以使用如下命令。

(二)查看HDFS的网页管理界面。请描述网页界面中的各个参数的名称

打开Linux自带的Firefox浏览器,点击此链接HDFSWeb界面,即可看到HDFSweb管理界面。WEB界面的访问地址是http://localhost:9870

1.菜单栏

Overview:集群概述
Datanode::数据节点
datanode-volume-failures: 数据节点卷故障
snapshot: 快照
startup-progress: 启动进度

2.Overview

Started:启动
Version:版本
Compiled:已编译
Cluster ID: 群集ID:
Block Pool ID: 块池ID:

3.Summary

Security is off:安全关闭
Safemode is off:安全模式已关闭
Configured Capacity::集群配置的总的容量
DFS Used: 已使用的DFS集群总量
Non DFS Used: 已使用的非DFS的量
DFS Remaining: DFS未使用(剩余)的容量
Block Pool Used: 数据块使用的量
DataNodes usages% (Min/Median/Max/stdDev): 数据节点使用率(最小值/中间值/最大值/标准偏差)
Live Nodes:存活的节点(活动节点)
Dead Nodes:宕机的节点(死节点)
Decommissioning Nodes:已停用节点
Entering Maintenance Nodes:进入维护节点
Total Datanode Volume Failures:数据节点卷失败的总数
Number of Under-Replicated Blocks:复制不足的块数
Number of Blocks Pending Deletion:挂起删除的块数 
Block Deletion Start Time:块删除的开始时间
Last Checkpoint Time:上次检查点时间

4.NameNode Journal Status

Journal Manager:Journal Node 存储EditLog数据的路径
State: Journal Node 存储EditLog数据的文件名

5.NameNode Storage

NameNode 存储数据的路径
        NameNode存储name的路径
            /usr/local/hadoop/tmp/dfs/name

6.DFS Storage Types

Storage Type :集群存储类型  
Configured Capacity :配置容量 
Capacity Used :使用的容量 
Capacity Remaining :剩余容量 
Block Pool Used :使用的块池 
Nodes In Service :服务中的节点

7.Datanode

Datanode usage histogram :数据节点使用率柱状图
Disk usage of each DataNode (%) :每个数据节点的磁盘使用率(%)
In operation :运行中的节点

8.Entering Maintenance和Decommissioning

 Entering Maintenance: 进入维护的节点列表
 Decommissioning: 退役的节点列表

9.Snapshot Summary

Snapshot Summary:快照摘要
Snapshottable directories : 快照目录列表
Snapshotted directories: 已创建的快照目录

10.Startup Progress

Startup Progress:集群启动时加载的fsimage和edits
        启动时加载的fsimage:fsimage_0000000000000012857
        启动时加载的edits:edits_0000000000000012858-0000000000000012864

10.Browse the file system

集群DFS存储系统的可视化浏览

11.Directory:/logs/

集群组件 NameNode、DataNode、Balance 、Journalnode、Secondarynamenode、Historyserver、Nodemanager、Resourcemanager等组件的日志

(三)完成eclipse的安装,在eclipse中创建项目,配置所需要的jar包,编写一个可以和HDFS相交互的Java应用程序

1.在Ubuntu中安装Eclipse

Eclipse是常用的程序开发工具,本教程很多程序代码都是使用Eclipse开发调试,因此,需要在Linux系统中安装Eclipse。是eclipse-4.7.0-linux.gtk.x86_64.tar.gz文件下载后保存在了Linux系统的目录“/home/hadoop/桌面/”下.
①下面执行如下命令对文件进行解压缩:

②执行如下命令启动Eclipse,就可以看到Eclipse的启动界面。

(2)使用Eclipse开发调试HDFS Java程序

Hadoop采用Java语言开发的,提供了Java APIHDFS进行交互。以上介绍的Shell命令,在执行时实际上会被系统转换成Java API调用。
现在要执行的任务是:假设在目录“hdfs://localhost:9000/user/hadoop”下面有几个文件,分别是file1.txtfile2.txtfile3.txtfile4.abcfile5.abc,这里需要从该目录中过滤出所有后缀名不为“.abc”的文件,对过滤之后的文件进行读取,并将这些文件的内容合并到文件“hdfs://localhost:9000/user/hadoop/merge.txt”中。
1.在Eclipse中创建项目
①启动Eclipse。当Eclipse启动以后,会弹出如下图所示界面,提示设置工作空间(workspace)。

可以直接采用默认的设置“/home/hadoop/workspace”,点击“OK”按钮。可以看出,由于当前是采用hadoop用户登录了Linux系统,因此,默认的工作空间目录位于hadoop用户目录“/home/hadoop”下。Eclipse启动以后,会呈现如下图所示的界面。

②选择“File–>New–>Java Project”菜单,开始创建一个Java工程,会弹出如下图所示界面。 在“Project name”后面输入工程名称“HDFSExample”,选中“Use default location”,让这个Java工程的所有文件都保存到“/home/hadoop/workspace/HDFSExample”目录下。在“JRE”这个选项卡中,可以选择当前的Linux系统中已经安装好的JDK,比如jdk1.8.0_162。然后,点击界面底部的“Next>”按钮,进入下一步的设置。

2. 为项目添加需要用到的JAR

①进入下一步的设置以后,会弹出如下图所示界面。

需要在这个界面中加载该Java工程所需要用到的JAR包,这些JAR包中包含了可以访问HDFSJava API。这些JAR包都位于Linux系统的Hadoop安装目录下,对于本教程而言,就是在“/usr/local/hadoop/share/hadoop”目录下。点击界面中的“Libraries”选项卡,然后,点击界面右侧的“Add External JARs…”按钮,会弹出如下图所示界面。

②需要在这个界面中加载该Java工程所需要用到的JAR包,这些JAR包中包含了可以访问HDFSJava API。这些JAR包都位于Linux系统的Hadoop安装目录下,就是在“/usr/local/hadoop/share/hadoop”目录下。点击界面中的“Libraries”选项卡,然后,点击界面右侧的“Add External JARs…”按钮,会弹出如下图所示界面。

③在该界面中,上面的一排目录按钮(即“usr”、“local”、“hadoop”、“share”、“hadoop”和“common”),当点击某个目录按钮时,就会在下面列出该目录的内容。
为了编写一个能够与HDFS交互的Java应用程序,一般需要向Java工程中添加以下JAR包:
a.“/usr/local/hadoop/share/hadoop/common”目录下的所有JAR包,包括hadoop-common-3.1.3.jarhadoop-common-3.1.3-tests.jarhaoop-nfs-3.1.3.jarhaoop-kms-3.1.3.jar,注意,不包括目录jdifflibsourceswebapps
b. “/usr/local/hadoop/share/hadoop/common/lib”目录下的所有JAR包;

c.“/usr/local/hadoop/share/hadoop/hdfs”目录下的所有JAR包,注意,不包括目录jdifflibsourceswebapps

d./usr/local/hadoop/share/hadoop/hdfs/lib”目录下的所有JAR包。

全部添加完毕以后,就可以点击界面右下角的“Apply and close”按钮,完成Java工程HDFSExample的创建。

3. 编写Java应用程序

①编写一个Java应用程序:在Eclipse工作界面左侧的“Package Explorer”面板中(如下图所示),找到刚才创建好的工程名称“HDFSExample”,然后在该工程名称上点击鼠标右键,在弹出的菜单中选择“New–>Class”菜单。

②选择“New–>Class”菜单以后会出现如下图所示界面。在该界面中,只需要在“Name”后面输入新建的Java类文件的名称,这里采用名称“MergeFile”,其他都可以采用默认设置。

③然后点击界面右下角“Finish”按钮,出现如下图所示界面。可以看出,Eclipse自动创建了一个名为“MergeFile.java”的源代码文件。

④随后在该文件中输入代码。

4. 编译运行程序

①在开始编译运行程序之前,请一定确保Hadoop已经启动运行,如果还没有启动,需要打开一个Linux终端,输入以下命令启动Hadoop

②然后,要确保HDFS的“/user/hadoop”目录下已经存在file1.txtfile2.txtfile3.txtfile4.abcfile5.abc,每个文件里面有内容。这里,假设文件内容如下:
file1.txt的内容是: this is file1.txt
file2.txt的内容是: this is file2.txt
file3.txt的内容是: this is file3.txt
file4.abc的内容是: this is file4.abc
file5.abc的内容是: this is file5.abc

③现在就可以编译运行上面编写的代码。可以直接点击Eclipse工作界面上部的运行程序的快捷按钮,当把鼠标移动到该按钮上时,在弹出的菜单中选择“Run As”,继续在弹出来的菜单中选择“Java Application”,如下图所示。

④在该界面中,点击界面右下角的“OK”按钮,开始运行程序。程序运行结束后,会在底部的“Console”面板中显示运行结果信息(如下图所示)。同时,“Console”面板中还会显示一些类似“log4j:WARN…”的警告信息,可以不用理会。

⑤如果程序运行成功,这时可以到HDFS中查看生成的merge.txt文件,比如可以在Linux终端中执行如下命令。

(四)生成jar包,部署相关的应用程序

①首先,在Hadoop安装目录下新建一个名称为myapp的目录,用来存放我们自己编写的Hadoop应用程序,可以在Linux的终端中执行如下命令。

②然后,请在Eclipse工作界面左侧的“ Package Explorer”面板中,在工程名称“HDFSExample”上点击鼠标右键,在弹出的菜单中选择“Export”,如下图所示。

③然后会弹出如下图所示界面。在该界面中,选择“Runnable JAR file”。

④然后,点击“Next>”按钮,弹出如下图所示界面。在该界面中,“Launch configuration”用于设置生成的JAR包被部署启动时运行的主类,需要在下拉列表中选择刚才配置的类“MergeFile-HDFSExample”。在“Export destination”中需要设置JAR包要输出保存到哪个目录,比如,这里设置为“/usr/local/hadoop/myapp/HDFSExample.jar”。在“Library handling”下面选择“Extract required libraries into generated JAR”。

⑤然后点击“Finish”按钮,会出现如下图所示界面。可以忽略该界面的信息,直接点击界面右下角的“OK”按钮,启动打包过程。


⑥打包过程结束后,会出现一个警告信息界面,如下图所示。可以忽略该界面的信息,直接点击界面右下角的“OK”按钮。

⑦至此,已经顺利把HDFSExample工程打包生成了HDFSExample.jar。可以到Linux系统中查看一下生成的HDFSExample.jar文件,可以在Linux的终端中执行如下命令。可以看到,“/usr/local/hadoop/myapp”目录下已经存在一个HDFSExample.jar文件。

⑧由于之前已经运行过一次程序,已经生成了merge.txt,因此,需要首先执行如下命令删除该文件。

⑨现在就可以在Linux系统中,使用hadoop jar命令运行程序,命令如下。

⑩上面程序执行结束以后,可以到HDFS中查看生成的merge.txt文件,比如可以在Linux终端中执行如下命令。

(五)思考题

1.HadoopHDFS包含哪些命令,这些命令各自代表什么意思?

①帮助命令 hdfs dfs -help
②查看命令

# -h 以更友好的方式列出,主要针对文件大小显示成相应单位K、M、G等
# -r 递归列出,类似于linux中的tree命令
 hdfs dfs -ls [-h] [-r] <path> 

查看文件内容 hdfs dfs -cat <hdfsfile>
查看文件末尾的1KB数据 hdfs dfs -tail [-f] <hdfsfile>

③创建命令
新建目录 hdfs dfs -mkdir <path>
创建多级目录 hdfs dfs -mkdir -p <path>
新建一个空文件 hdfs dfs -touchz <filename>
上传本地文件到 hdfs hdfs dfs -put [-f] <local src> ... <hdfs dst>
④删除命令
删除文件或目录

# -r 递归删除目录下的所有文件
# -f为直接删除,不予提示
# -skipTrash为彻底放入文件,不放入回收站
hdfs dfs -rm [-r] [-f] [-skipTrash] <hdfs path>

⑤获取命令将hdfs文件下载到本地 hdfs dfs -get < hdfs path> < localpath>
将hdfs文件合并起来下载到本地 hdfs hdfs -getmerge [-nl] <hdfs path> <localdst>
⑥其他hdfs文件操作命令

拷贝:hdfs dfs -cp [-r] < hdfs path >  < hdfs path1 >
移动:hdfs dfs -mv < hdfs path >  < hdfs path1 >
统计目录下的对象数:hdfs dfs -count < hdfs path >
统计目录下的对象大小:hdfs dfs -du [-s] [-h] < hdfs path >
修改hdfs文件权限
修改所属组[-chgrp [-R] GROUP PATH...] 
修改权限模式[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
修改所需组和所有者[-chown [-R] [OWNER][:[GROUP]] PATH...] 

hdfs管理命令
显示帮助 hdfs dfsadmin -help
查看文件系统健康状态 hdfs dfsadmin -report
安全模式管理
a. 查看安全模式状态 hdfs dfsadmin -safemode get
b. 强制进入安全模式 hdfs dfsadmin -safemode enter
c. 强制离开安全模式 hdfs dfsadmin -safemode leave

2.Hadoop创建的应用程序,需要导入哪些安装包,这些安装包里面有什么功能?

需要导入的安装包
①“/usr/local/hadoop/share/hadoop/common”目录下的所有JAR包,包括hadoop-common-3.1.3.jarhadoop-common-3.1.3-tests.jarhaoop-nfs-3.1.3.jarhaoop-kms-3.1.3.jar
②“/usr/local/hadoop/share/hadoop/common/lib”目录下的所有JAR包;
③“/usr/local/hadoop/share/hadoop/hdfs”目录下的所有JAR包,注意,不包括目录jdifflibsourceswebapps
④“/usr/local/hadoop/share/hadoop/hdfs/lib”目录下的所有JAR包。

安装包的功能
a.用于发布和使用类库
b.作为应用程序和扩展的构建单元
c.作为组件、applet 或者插件程序的部署单位
d.用于打包与组件相关联的辅助资源

有关HDFS操作方法和基础编程的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  5. Ruby 方法() 方法 - 2

    我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

  6. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  7. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  8. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  9. ruby - 多个属性的 update_column 方法 - 2

    我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

  10. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

随机推荐