草庐IT

大数据技术基础实验四:HDFS实验——读写HDFS文件

-北天- 2023-08-04 原文

大数据技术基础实验四:HDFS实验——读写HDFS文件

文章目录

一、前言

在前面的实验中我们进行了HDFS的部署,并设置了一键启动HDFS操作,本期实验我们将使用HDFS开发环境进行HDFS写、读的编写,以及程序的运行,了解HDFS读写文件的调用流程,理解HDFS读写文件的原理。

好啦废话不多说,我们开始今天的实验操作。

二、实验目的

  1. 会在Linux环境下编写读写HDFS文件的代码
  2. .会使用jar命令打包代码
  3. 会在master服务器上运行HDFS读写程序
  4. 会在Windows上安装Eclipse Hadoop插件
  5. 会在Eclipse环境编写读写HDFS文件的代码
  6. 会使用Eclipse打包代码
  7. 会使用Xftp工具将实验电脑上的文件上传至master服务器

三、实验原理

1、Java Classpath

Classpath设置的目的是告诉Java执行环境,在哪些目录下可以找到所要执行的Java程序所需要的类或者包。

Java执行环境本身就是一个平台,执行于这个平台上的程序是已编译完成的Java程序(文件后缀为.class)。如果将Java执行环境比喻为操作系统,如果设置Path变量是为了让操作系统找到指定的工具程序(以Windows来说就是找到.exe文件),则设置Classpath的目的就是让Java执行环境找到指定的Java程序(也就是.class文件)。

我们来设置一下Classpath:

在设置中打开环境变量,然后点击新建

每一路径中间必须以英文;作为分隔。

2、Eclipse Hadoop插件下载

我们通过在Eclipse上下载Hadoop插件来开发Hadoop相关程序

因为我们学校的虚拟机集群环境是hadoop2.7.1,所以就只需要下载2。7.1版本插件。
我在网上找了很久的hadoop-eclipse-plugin插件,如果你们没找到可以留下你们的邮箱我单独发给你们。

安装插件在后面具体实验步骤的时候再来说明。

四、实验步骤

1、配置master服务器classpath

在终端输入如下命令:

vi /etc/profile

进入文件进行编辑,在该文件的最后加上如下信息:

JAVA_HOME=/usr/local/jdk1.7.0_79/
export HADOOP_HOME=/usr/cstor/hadoop
export JRE_HOME=/usr/local/jdk1.7.0_79//jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$HADOOP_HOME/share/hadoop/common/*:$HADOOP_HOME/share/hadoop/common/lib/*
export PATH=$PATH:$HADOOP_HOME/bin
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_HOME/lib/native"

添加成功之后保存文件,然后再执行如下命令,让刚才设置的环境变量生效:

source /etc/profile

2、在master服务器编写HDFS写程序

在终端执行如下命令,然后编写HDFS写文件程序:

vi WriteFile.java

在文件内写入如下java程序代码然后保存退出。

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class WriteFile {
public static void main(String[] args)throws Exception{
Configuration conf=new Configuration();
FileSystem hdfs = FileSystem.get(conf);
Path dfs = new Path("/weather.txt");
FSDataOutputStream outputStream = hdfs.create(dfs);
outputStream.writeUTF("nj 20161009 23\n");
outputStream.close();
}
}

3、编译并打包HDFS写程序

使用javac编译刚刚编写的java代码,并使用jar命令打包为hdpAction.jar。

编译代码:

javac WriteFile.java

打包代码:

jar -cvf hdpAction.jar WriteFile.class

4、 执行HDFS写程序

在master虚拟机上使用如下命令执行hdpAction.jar:

hadoop jar ~/hdpAction.jar WriteFile

然后输入如下命令查看是否生成weather.txt文件:

hadoop fs -ls /

可以看出已经生成成功,我们来查看一下文件内容是否正确:

hadoop fs -cat /weather.txt

OK,结果是对的,我们继续下一步。

5、在master服务器编写HDFS读程序

直接在终端执行如下命令进行编写HDFS读文件程序操作:

vi ReadFile.java

然后填入如下java程序:

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class ReadFile {
  public static void main(String[] args) throws IOException {
    Configuration conf = new Configuration();
    Path inFile = new Path("/weather.txt");
    FileSystem hdfs = FileSystem.get(conf);
    FSDataInputStream inputStream = hdfs.open(inFile);
    System.out.println("myfile: " + inputStream.readUTF());
    inputStream.close();
  }
}

6、编译并打包HDFS读程序

再次使用刚刚的javac命令编译刚编写的java代码:

javac ReadFile.java

然后再次使用jar命令打包为hdpAction.jar:

jar -cvf hdpAction.jar ReadFile.class

7、 执行HDFS读程序

再次在master虚拟机上使用hadoop.jar命令执行hdpAction.jar,查看程序运行结果:

hadoop jar ~/hdpAction.jar ReadFile

8、安装与配置Eclipse Hadoop插件

现在我们开始之前的插件安装步骤,将我们下载的jar包放在Eclipse下载路径的插件包下面,如图:

然后我们需要在本地配置Hadoop环境,用于加载hadoop目录中的jar包,我们需要下载这个文件:

可以去官网下载,我是在学校大数据平台上面直接下载的,比较方便。

然后解压该文件到自己指定的路径。

然后我们需要验证是否可以用Eclipse新建Hadoop项目,打开Eclipse软件,按照如下操作选择:

点击之后查看是否有Map/Reduce Project的选项。

这里如果没有出现这个选项的话,需要去eclipse安装路径下的configuration文件中把org.eclipse.update删除,这是因为在 org.eclipse.update 文件夹下记录了插件的历史更新情况,它只记忆了以前的插件更新情况,而你新安装的插件它并不记录,之后再重启Eclipse就会出现这个选项了。

第一次新建Map/Reduce Project项目时需要指定hadoop解压后的位置:

9、使用Eclipse开发并打包HDFS写文件程序

紧接着上面输入项目名:WriteHDFS,创建一个Map/Reduce项目。

然后新建WriteFile类并填入如下java代码:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
public class WriteFile {
public static void main(String[] args)throws Exception{
Configuration conf=new Configuration();
FileSystem hdfs = FileSystem.get(conf);
Path dfs = new Path("/weather.txt");
FSDataOutputStream outputStream = hdfs.create(dfs);
outputStream.writeUTF("nj 20161009 23\n");
outputStream.close();
}
}

如果你出现报错的话,就需要进行导包操作并且配置设置文件,在项目目录下面创建jar或者lib文件夹,添加如下两个包,如果你找不到的话我可以发给你们,留下邮箱就行:

然后在Eclipse左侧导航栏里右击该项目,选择导出,然后选择java,选择JAR 文件:

然后填写导出文件的路径和文件名,自定义:

然后点击下一步,再点击下一步,然后配置程序主类,这里必须要选择主类,我被这里坑了好久一直报错,学校大数据平台实验指导书和实验视频错了,必须要选择主类,不然后面上传到服务器就会一直报错。

然后选择完成就打包完成。

10、上传HDFS写文件程序jar包并执行

我们使用Xftp工具将刚刚生成的jar包上传至master服务器上:

然后在master服务器上使用如下命令执行hdpAction.jar:

hadoop jar ~/hdpAction.jar WriteFile

然后查看是否生成了weather.txt文件:

hadoop fs -ls /

如果已经生成,然后再查看文件内容是否正确:

hadoop fs -act /weather.txt

11、使用Eclipse开发并打包HDFS读文件程序

这里建项目的方法和前面的一样,我就不再详细的描述了。

新建项目名为ReadHDFS,然后再新建ReadFile类并编写如下代码:

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

public class ReadFile {
  public static void main(String[] args) throws IOException {
    Configuration conf = new Configuration();
    Path inFile = new Path("/weather.txt");
    FileSystem hdfs = FileSystem.get(conf);
    FSDataInputStream inputStream = hdfs.open(inFile);
    System.out.println("myfile: " + inputStream.readUTF());
    inputStream.close();
  }
}

然后和前面一样进行导包操作,再次强调要选择主类!

12、上传HDFS读文件程序jar包并执行

然后再次使用Xftp工具将包上传至master服务器上,并在master服务器上使用hadoop jar命令执行上传的包,查看程序运行结果:

五、补充一点

学校大数据平台实验视频说,因为大数据集群是使用的jdk1.7版本,必须要使用相同版本才行,如果你是jdk1.8版本,也不用重新配置1.7版本,只需要在Eclipse切换执行环境就行,具体操作如下:

右击项目然后依次选择选项:

然后将你们一开始的这个库移除,再点击添加库,这里我已经切换好了:

然后选择JRE系统库,点击下一步:

然后选择要切换的库版本,最后点击完成即可:

六、最后我想说

本期的实验到这里就结束了,因为中间出现了各种报错,所以这个实验做了很久,最后在不断摸索中终于是完成了。

通过本次实验我深刻明白了大数据环境的各种配置是真的麻烦,各种烦人的要求,哈哈哈,真的是太绝了,你们做大数据实验的时候一定要注意细节,仔细一点,不然很容易踩各种坑。

大概就说这么多了,一定要多去实战,不然你们都不知道会收获多少经验(坑),如果你们在实验过程中遇见了什么问题,欢迎大家来提问,我们一起讨论学习交流。

最后,后续我仍会继续更新有关大数据的实验,虽然过程比较辛苦,但收获满满。

有关大数据技术基础实验四:HDFS实验——读写HDFS文件的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  8. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  9. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  10. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

随机推荐