hadoop与HDFS交互

一、利用Shell命令与HDFS进行交互

在进行HDFS编程实践前,需要首先启动Hadoop。可以执行如下命令启动Hadoop:

cd /usr/local/hadoop

./sbin/start-dfs.sh #启动hadoop

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

注意

本教程的命令是以”./bin/hadoop dfs”开头的Shell命令方式,实际上有三种shell命令方式。
1. hadoop fs
2. hadoop dfs
3. hdfs dfs

hadoop fs适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
hadoop dfs只能适用于HDFS文件系统
hdfs dfs跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统

我们可以在终端输入如下命令,查看fs总共支持了哪些命令

./bin/hadoop fs

 

在终端输入如下命令,可以查看具体某个命令的作用

例如:我们查看put命令如何使用,可以输入如下命令

./bin/hadoop fs -help put

 

1.目录操作

需要注意的是,Hadoop系统安装好以后,第一次使用HDFS时,需要首先在HDFS中创建用户目录。本教程全部采用hadoop用户登录Linux系统,因此,需要在HDFS中为hadoop用户创建一个用户目录,命令如下:

cd /usr/local/hadoop

./bin/hdfs dfs -mkdir -p /user/hadoop

该命令中表示在HDFS中创建一个“/user/hadoop”目录,“-mkdir”是创建目录的操作,“-p”表示如果是多级目录,则父目录和子目录一起创建,这里“/user/hadoop”就是一个多级目录,因此必须使用参数“-p”,否则会出错。
“/user/hadoop”目录就成为hadoop用户对应的用户目录,可以使用如下命令显示HDFS中与当前用户hadoop对应的用户目录下的内容:

./bin/hdfs dfs -ls .

该命令中,“-ls”表示列出HDFS某个目录下的所有内容,“.”表示HDFS中的当前用户目录,也就是“/user/hadoop”目录,因此,上面的命令和下面的命令是等价的:

./bin/hdfs dfs -ls /user/hadoop

如果要列出HDFS上的所有目录,可以使用如下命令:

./bin/hdfs dfs -ls

下面,可以使用如下命令创建一个input目录:

./bin/hdfs dfs -mkdir input

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

./bin/hdfs dfs -mkdir /input

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

./bin/hdfs dfs –rm –r /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/”目录下:

./bin/hdfs dfs -put /home/hadoop/myLocalFile.txt  input

可以使用ls命令查看一下文件是否成功上传到HDFS中,具体如下:

./bin/hdfs dfs -ls input

该命令执行后会显示类似如下的信息:

Found 1 items   

-rw-r--r--   1 hadoop supergroup         36 2017-01-02 23:55 input/ myLocalFile.txt

下面使用如下命令查看HDFS中的myLocalFile.txt这个文件的内容:

./bin/hdfs dfs –cat input/myLocalFile.txt

下面把HDFS中的myLocalFile.txt文件下载到本地文件系统中的“/home/hadoop/下载/”这个目录下,命令如下:

./bin/hdfs dfs -get input/myLocalFile.txt  /home/hadoop/下载

 

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

cd ~

cd 下载

ls

cat myLocalFile.txt

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

./bin/hdfs dfs -cp input/myLocalFile.txt  /input

二、利用Java API与HDFS进行交互

Hadoop不同的文件系统之间通过调用Java API进行交互,上面介绍的Shell命令,本质上就是Java API的应用。下面提供了Hadoop官方的Hadoop API文档,想要深入学习Hadoop,可以访问如下网站,查看各个API的功能。

Hadoop API文档http://hadoop.apache.org/docs/stable/api/

利用Java API进行交互,需要利用软件Eclipse编写Java程序。

(一)在Ubuntu中安装Eclipse

Eclipse是常用的程序开发工具,很多程序代码都是使用Eclipse开发调试,因此,需要在Linux系统中安装Eclipse。可以在 ubuntu software 中直接下载 eclipse

 

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

Hadoop采用Java语言开发的,提供了Java API与HDFS进行交互。上面介绍的Shell命令,在执行时实际上会被系统转换成Java API调用。Hadoop官方网站提供了完整的Hadoop API文档(http://hadoop.apache.org/docs/stable/api/),想要深入学习Hadoop编程,可以访问Hadoop官网查看各个API的功能和用法。本教程只介绍基础的HDFS编程。
为了提高程序编写和调试效率,本教程采用Eclipse工具编写Java程序。
现在要执行的任务是:用Java编写程序检测HDFS中是否存在文件myLocalFile.txt,编译运行程序并显示检测结果。

1. 在Eclipse中创建项目

启动Eclipse。当Eclipse启动以后,会弹出如下图所示界面,提示设置工作空间(workspace)。

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

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

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

 若没有,且找不到jdk,只有jre,可根据下面的文章进行操作。

https://blog.csdn.net/weixin_52308622/article/details/130688200?spm=1001.2014.3001.5501

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

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

比如,如果要把“/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-3.3.2.jar、hadoop-common-3.3.2-tests.jar、hadoop-nfs-3.3.2.jarhadoop-kms-3.3.2.jarhadoop-registry-3.3.2.jar添加到当前的Java工程中,可以在界面中点击目录按钮,进入到common目录,然后,界面会显示出common目录下的所有内容在界面中用鼠标点击选中hadoop-common-3.3.2.jar、hadoop-common-3.3.2-tests.jar、hadoop-nfs-3.3.2.jarhadoop-kms-3.3.2.jarhadoop-registry-3.3.2.jar(不要选中目录jdiff、lib、sources和webapps),然后点击界面右角的“open”按钮,就可以把JAR包增加到当前Java工程中,出现的界面如下图所示。

 

从这个界面中可以看出,hadoop-common-3.3.2.jar、hadoop-common-3.3.2-tests.jar、hadoop-nfs-3.3.2.jarhadoop-kms-3.3.2.jarhadoop-registry-3.3.2.jar已经被添加到当前Java工程中。然后,按照类似的操作方法,可以再次点击“Add External JARs…”按钮,把剩余的其他JAR包都添加进来。需要注意的是,当需要选中某个目录下的所有JAR包时,可以使用“Ctrl+A”组合键进行全选操作。全部添加完毕以后,就可以点击界面右下角的“Finish”按钮,完成Java工程HDFSExample的创建。

3. 编写Java应用程序

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

 

 在该界面中,只需要在“Name”后面输入新建的Java类文件的名称,这里采用名称“HDFSFileIfExist”,其他都可以采用默认设置,然后,点击界面右下角“Finish”按钮,出现如下图所示界面。

 

 

可以看出,Eclipse自动创建了一个名为“HDFSFileIfExist.java”的源代码文件,请在该文件中输入以下代码:

import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;public class HDFSFileIfExist {public static void main(String[] args){try{String fileName = "test";Configuration conf = new Configuration();conf.set("fs.defaultFS", "hdfs://localhost:9000");conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");FileSystem fs = FileSystem.get(conf);if(fs.exists(new Path(fileName))){System.out.println("文件存在");}else{System.out.println("文件不存在");}}catch (Exception e){e.printStackTrace();}}}

该程序用来测试HDFS中是否存在一个文件,其中有一行代码:

String fileName = "test"

这行代码给出了需要被检测的文件名称是“test”,没有给出路径全称,表示是采用了相对路径,实际上就是测试当前登录Linux系统的用户hadoop,在HDFS中对应的用户目录下是否存在test文件,也就是测试HDFS中的“/user/hadoop/”目录下是否存在test文件。(根据前序实验内容,myLocalFile.txt的完整路径为/user/hadoop/(名字)/myLocalFile.txt

4. 编译运行程序

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

cd /usr/local/hadoop

./sbin/start-dfs.sh

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

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/18485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT的功能与特点

随着人工智能技术的不断发展,ChatGPT作为OpenAI公司开发的基于GPT-3.5架构的大型语言模型,正引领着智能交互的新纪元。ChatGPT的功能与特点使其能够在多个领域展现出惊人的能力,本文将深入探讨ChatGPT的功能与特点,以及它在人工智…

HCIA-datacom数通题库和录播视频资料

HCIA-Datacom,是华为数通认证的初级考试,培训与认证具备数通基础通用知识和技能水平的工程师,只是入门了解数通的一些基础通用知识,适用于小白了解和学习数通知识点起点。 个人建议还是有必要考的,如果在企业考试考试…

Kubernetes (k8s)理论介绍

一:K8s 简介 1、K8s作用 2、K8s 来历 3、为什么要用 K8S? 4、Kubernetes 功能 二:Kubernetes 集群架构与组件 1、Kubernetes 集群架构与组件 2、核心组件 -Master 组件 (1)Kube-apiserver (2)Kube…

【数据预测】基于蜣螂优化算法DBO的VMD-KELM光伏发电功率预测 短期功率预测【Matlab代码#53】

文章目录 【可更换其他算法,获取资源请见文章第6节:资源获取】1. 蜣螂优化算法DBO2. 变分模态分解VMD3. 核极限学习机KELM4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法,获取资源请见文章第6节:资源获取】 1. 蜣螂…

实现Feed流的三种模式:拉模式、推模式和推拉结合模式

在互联网产品中,Feed流是一种常见的功能,它可以帮助我们实时获取我们关注的用户的最新动态。Feed流的实现有多种模式,包括拉模式、推模式和推拉结合模式。在本文中,我们将详细介绍这三种模式,并通过Java代码示例来实现…

关于BQ27427的配置问题

EVM是TI家做的BQ27427的开发板,这款芯片还挺新的。 大概是这样,一块开发板要一千多块钱,使用的时候还出现了一些奇怪的问题。 配置使用的是买的盗版的EV2400,就是黑色的那个东西,使用的通信方式IIC。 TI手册上写的软件…

Spring框架 —— AOP面向切面编程

前言 前面荔枝已经梳理了Spring框架中的IOC部分的知识,接下来荔枝继续梳理Spring框架的另一大重点:AOP面向切面编程。在这篇文章中,荔枝会着重弄清楚AOP的概念并对实现AOP的两种方式进行梳理,同时荔枝也会相应给出代码样例。毕竟荔…

AGI如何提高智力水平

AGI(Artificial General Intelligence)是一种新型的人工智能系统,具有人类智能的多个方面,能够在各种不同的任务和环境中进行决策和执行。要提高AGI的智力水平,需要从多个方面进行研究和改进。 改进算法和模型&#x…

远程访问本地mysql

文章目录 一、设置本地mysql允许外部访问找到mysql配置文件my.ini &#xff0c;linux环境是my.cnf配置mysql配置文件 二、创建外部访问的mysql用户三、配置mysql用户的权限四、配置防火墙端口五、连接查看本地ip地址 参考 连接命令 mysql -h <host> -P <port> -u &…

Server - 网络粘包原因

网络粘包是指发送方发送的数据被接收方一次性接收的现象&#xff0c;导致接收方无法正确解析数据的边界。网络粘包的原因主要有以下几点&#xff1a; 帧定界错误&#xff1a;在数据传输过程中&#xff0c;接收方无法准确判断每一帧的起始和结束位置&#xff0c;可能将多个帧合并…

后端接收json格式的字符串出现json格式错误

问题描述&#xff1a;在进行接口测试时&#xff0c;出现了一个问题&#xff0c;json格式错误&#xff0c;前端在接口传的其中一个参数是一个字符串&#xff0c;此字符串就是一个json格式的数据&#xff0c;此参数需要在后台执行相对应的业务&#xff0c;业务需要的就是一个json…

rust里用什么表示字节类型?

在Rust中&#xff0c;字节可以使用 u8 类型来表示。 u8 是一个无符号8位整数类型&#xff0c;可以表示0到255之间的值&#xff0c;对应于一个字节的范围。 以下是一个示例&#xff0c;演示了如何声明和使用字节&#xff1a; fn main() {let byte: u8 65; // 表示字母A的ASCI…

Linux【网络基础】IP协议

文章目录 一、IP协议&#xff08;1&#xff09;IP地址协议概念和理解&#xff08;2&#xff09;IP地址协议格式&#xff08;3&#xff09;网络号和主机号&#xff08;4&#xff09;地址管理&#xff08;一&#xff09;分配IP地址方法&#xff08;二&#xff09;CIDR分配IP地址&…

【题解】两个链表的第一个公共结点、链表相加(二)

文章目录 两个链表的第一个公共结点链表相加(二) 两个链表的第一个公共结点 题目链接&#xff1a;两个链表的第一个公共结点 解题思路1&#xff1a;利用路程相同 两个指针从两个链表的头结点出发&#xff0c;以相同的速度开始往前走&#xff0c;走完一条继续走另一条&#x…

【C++】类和对象(上)

1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将意见事情拆分为不同的对象&#xff0c;靠对象之间的交互完成。 …

慕课网Go-4.package、单元测试、并发编程

package 1_1_User.go package usertype User struct {Name string }1_1_UserGet.go package userfunc GetCourse(c User) string {return c.Name }1_1_UserMain.go package mainimport ("fmt"Userch03 "goproj/IMOOC/ch03/user"//别名&#xff0c;防止同名…

uniapp跨域解决

uniapp跨域解决 跨域是什么 跨域指的是浏览器不能执行其他网站的脚本&#xff0c;当一个网页去请求另一个域名的资源时&#xff0c;域名、端口、协议任一不同&#xff0c;就会存在跨域。跨域是由浏览器的同源策略造成的&#xff0c;是浏览器对JavaScript施加的安全限制。 报错…

【python脚本】python实现xml文件的图片标签可视化

【python脚本】python实现xml文件的图片标签可视化 批量实现文件夹下xml文件可视化展现结果。 import xml.dom.minidom import cv2 import os import xml.etree.ElementTree as ET""" 该脚本用于目标框可视化 IMAGE_INPUT_PATH&#xff1a;输入图片路径 XML_I…

Wi-Fi 6技术详解

1. 介绍 Wi-Fi 6&#xff0c;也称为802.11ax&#xff0c;是Wi-Fi技术的最新标准。它是对之前标准Wi-Fi 5&#xff08;802.11ac&#xff09;的升级和改进&#xff0c;旨在提供更高的速度、更大的容量、更好的性能和更高的可靠性。Wi-Fi 6技术的引入为无线网络带来了革命性的变化…

机柜PDU的选购也有大学问——与机柜PDU相关的那些事儿

在各行各业数据中心机房供配电建设过程中&#xff0c;机柜专用PDU电源插座看似是一个较为简单的用电设备&#xff0c;事实上又不那么简单。机柜PDU&#xff0c;是为安装在机柜内部的IT设备提供电源分配、管理的末端配电设备&#xff0c;在不同的工作场合对于PDU的规格要求也是不…