赞
踩
1. 实验目的
(1) 熟练使用HDFS操作常用的Shell命令。
(2) 熟悉HDFS操作常用的Java API。
2. 实验内容
(1) 编程实现指定功能,并利用Hadoop提供的Shell命令完成相同任务(文件的上传、下载、输出、删除、移动等操作)。
(2) 有余力编写一个Java程序,读取HDFS中的指定文件。
3. 实验平台(软件版本)
VirtualBox-6.1.4
jdk-8u162-linux-x64.tar
eclipse-4.7.0-linux.gtk.x86_64.tar
ubuntukylin-16.04-desktop-amd64
hadoop-3.1.3
FileZilla_3.17.0.0_win64_setup 这是一个用于将windows文件与linux互相传的软件
**4. 实验步骤 **
实验步骤思维导图如下图所示
(1) 启动全分布集群
$ start-dfs.sh
$ start-yarn.sh
$ mr-jobhistory-daemon.sh start historyserver
通过命令jps可以查看各个节点所启动的进程(如下图所示:)
在Slave节点可以看到DataNode和NodeManager进程(如下图所示:)
集群启动成功:如下图所示
(2) 目录操作:
① 本教程全部采用hadoop用户登录Linux系统,因此,需要在HDFS中为hadoop用户创建一个用户目录,命令如下:
$ hdfs dfs -mkdir -p /user/hadoop
该命令中表示在HDFS中创建一个“/user/hadoop”目录,“–mkdir”是创建目录的操作,“-p”表示如果是多级目录,则父目录和子目录一起创建,这里“/user/hadoop”就是一个多级目录,因此必须使用参数“-p”,否则会出错。
② “-ls”表示列出HDFS某个目录下的所有内容,“.”表示HDFS中的当前用户目录,也就是“/user/hadoop”目录,以下两个命令等价!
$ hdfs dfs –ls .
$ hdfs dfs –ls /user/hadoop
目录创建与显示如下图所示
(3) 文件操作:
① 首先使用vim编辑器,在本地Linux文件系统的“/home/hadoop/”目录下创建四个文件file1.txt、file2.txt、file3.txt、file4.abc和file5.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
② 可以使用如下命令把本地文件系统的“/home/hadoop/***.txt”上传到HDFS中的当前用户目录
上传文件的代码显示如下图所示
(4) 利用Java API与HDFS进行交互——在Ubuntu中安装Eclipse
① 可以到Eclipse官网(https://www.eclipse.org/downloads/)下载安装包。
② 假设安装文件下载后保存在了Linux系统的目录“~/Downloads”下,下面执行如下命令对文件进行解压缩:
$ cd ~/Downloads
$ sudo tar -zxvf ./eclipse-4.7.0-linux.gtk.x86_64.tar.gz -C /usr/local
③ 然后,执行如下命令启动Eclipse:
$ cd /usr/local/eclipse`
$ ./eclipse
这样就可以看到启动界面,如下图所示:提示设置工作空间(workspace)
可以直接采用默认的设置“/home/hadoop/workspace”,点击“OK”按钮。可以看出,由于当前是采用hadoop用户登录了Linux系统,因此,默认的工作空间目录位于hadoop用户目录“/home/hadoop”下。
④ 为了能让代码顺利运行,需要在Eclipse工作空间(workspace)的bin目录下复制属于集群上的core-site.xml和dfs-site.xml(它们存放在/usr/local/hadoop/etc/hadoop目录下)
⑤ Eclipse启动以后,选择“File->New–>Java Project”菜单,开始创建一个Java工程,会弹出如下图所示界面。
⑥ 点击界面底部的“Next>”按钮,为项目添加需要用到的JAR包,包含common或者common/lib与hdfs或者hdfs/lib,还有client下所有的JAR包这些JAR包都位于Linux系统的Hadoop安装目录下,对于本教程而言,就是在“/usr/local/hadoop/share/hadoop”目录下。点击界面中的“Libraries”选项卡,然后,点击界面右侧的“Add External JARs…”按钮,会弹出如下图所示界面。
(5) 编写Java应用程序
① 请在Eclipse工作界面左侧的“Package Explorer”面板中(如下图所示),找到刚才创建好的工程名称“HDFSExample”,然后在该工程名称上点击鼠标右键,在弹出的菜单中选择“New–>Class”菜单。然后在出现的界面中只需要在“Name”后面输入新建的Java类文件的名称,这里采用名称“MergeFile1”(其余java文件操作类似)“HDFSCreate”“HDFSUpload”…其他都可以采用默认设置,然后,点击界面右下角“Finish”按钮
出现如下图所示界面。
② read.java创建并编写完毕后结果以及最终演示如下图所示(实现下载功能,并展示下载内容):
(6) 这里展示MergeFile1.java的源代码文件。
package Demo;
import java.io.IOException;
import java.io.PrintStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
/**
* 过滤掉文件名满足特定条件的文件
*/
class Filter implements PathFilter {
String reg = null;
Filter(String reg) {
this.reg = reg;
}
public boolean accept(Path path) {
if (!(path.toString().matches(reg)))
return true;
return false;
}
}
/***
* 利用FSDataOutputStream和FSDataInputStream合并HDFS中的文件
*/
public class MergeFile1 {
Path inputPath = null; //待合并的文件所在的目录的路径
Path outputPath = null; //输出文件的路径
public MergeFile1(String input, String output) {
this.inputPath = new Path(input);
this.outputPath = new Path(output);
}
public void doMerge() throws IOException {
Configuration conf = new Configuration();
conf.set("fs.defaultFS","hdfs://192.168.43.49:9000");//特别注意此处192.168.43.49是自己主节点的IP地址
conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fsSource = FileSystem.get(URI.create(inputPath.toString()), conf);
FileSystem fsDst = FileSystem.get(URI.create(outputPath.toString()), conf);
//下面过滤掉输入目录中后缀为.abc的文件
FileStatus[] sourceStatus = fsSource.listStatus(inputPath,
new Filter(".*\\.abc"));
FSDataOutputStream fsdos = fsDst.create(outputPath);
PrintStream ps = new PrintStream(System.out);
//下面分别读取过滤之后的每个文件的内容,并输出到同一个文件中
for (FileStatus sta : sourceStatus) {
//下面打印后缀不为.abc的文件的路径、文件大小
System.out.print("路径:" + sta.getPath() + " 文件大小:" + sta.getLen()
+ " 权限:" + sta.getPermission() + " 内容:");
FSDataInputStream fsdis = fsSource.open(sta.getPath());
byte[] data = new byte[1024];
int read = -1;
while ((read = fsdis.read(data)) > 0) {
ps.write(data, 0, read);
fsdos.write(data, 0, read);
}
fsdis.close();
}
ps.close();
fsdos.close();
}
public static void main(String[] args) throws IOException {
MergeFile1 merge = new MergeFile1(
"hdfs://192.168.43.49:9000/user/hadoop/",//特别注意此处192.168.43.49是自己主节点的IP地址
"hdfs://192.168.43.49:9000/user/hadoop/merge.txt");//特别注意此处192.168.43.49是自己主节点的IP地址
merge.doMerge();
}
}
MergeFile.java运行结果如下
merge.txt文件生成成功
merge.txt文件内容展示如下
5. 完成情况与问题讨论
(1) 实际完成情况
完成!
(2) 问题与讨论
问题一:伪分布的java API实现与全分布有什么不同?
解决:
Configuration conf =new Configuration();
//对于全分布而言是连接到NameNode(主节点的ip地址)
//对于伪分布而言使用localhost代替主机ip地址的输入。
conf.set("fs.defaultFS", "hdfs://192.168.43.49:9000");
//得到HDFS的客户端
FileSystem fs = FileSystem.get(conf);
问题二:出现Wrong FS:hdfs://localhost:9000/user/hadoop/input.txt,excepted:file:///这类问题该怎么办?
解决:
把配置文件放到当前Java工程目录下:需要把集群上的core-site.xml和hdfs-site.xml(这两个文件存在于/usr/local/hadoop/etc/hadoop目录下)放到当前工程项目下,即eclipse工作目录的bin文件夹下面
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。