HDFS的API操作


创建maven工程并导入jar包

  <repositories>
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
</repository>
</repositories>

  再从这里找需要的jar包:https://www.cloudera.com/documentation/enterprise/release-notes/topics/cdh_vd_cdh5_maven_repo_514x.html

<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.0-mr1-cdh5.14.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.6.0-cdh5.14.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>2.6.0-cdh5.14.0</version>
</dependency> <dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.6.0-cdh5.14.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<!-- <verbal>true</verbal>-->
</configuration>
</plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<minimizeJar>true</minimizeJar>
</configuration>
</execution>
</executions>
</plugin>
<!-- <plugin>
<artifactId>maven-assembly-plugin </artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>cn.itcast.hadoop.db.DBToHdfs2</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>-->
</plugins>
</build>

使用URL的方式访问数据(重在了解)

import org.apache.commons.io.IOUtils;
import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.junit.Test; import java.io.*;
import java.net.MalformedURLException;
import java.net.URL; public class demo {
@Test
public void demo1() throws IOException {
//第一步:注册HDFS的URL,让java代码能够识别HDFS的URL形式
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); InputStream inputStream = null;
FileOutputStream outputStream =null; //URL地址可以在hadoop配置文件core-site.xml中查看
String url = "hdfs://192.168.0.10:8020/test/yum.log"; //打开文件输入流
try {
inputStream =new URL(url).openStream();
outputStream = new FileOutputStream(new File("/Users/zhaozhuang/Downloads/hello.txt"));
IOUtils.copy(inputStream,outputStream);
}catch (IOException e){
e.printStackTrace();
}finally {
IOUtils.closeQuietly(inputStream);
IOUtils.closeQuietly(outputStream);
}
}
}

上述代码中String url的出处


获取FileSystem的几种方式

  • 第一种方式获取FileSystem
	@Test
public void getFileSystem1() throws IOException {
/*
FileSystem是一个抽象类,获取抽象类的实例有两种方式
第一种,看看这个抽象类有没有提供什么方法,返回它本身
第二种,找子类
*/
Configuration configuration = new Configuration();
//如果这里不加任何配置,这里获取到的就是本地文件系统
configuration.set("fs.defaultFS","hdfs://node01:8020");
FileSystem fileSystem = FileSystem.get(configuration); System.out.println(fileSystem.toString());
fileSystem.close();
}
  • 第二种方式获取FileSystem
	@Test
public void getFileSystem2() throws URISyntaxException, IOException {
Configuration configuration = new Configuration();
FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), configuration); System.out.println(fileSystem.toString());
fileSystem.close();
}
  • 第三种方式获取FileSystem
	@Test
public void getFileSystem3() throws IOException {
Configuration configuration = new Configuration();
configuration.set("fs.defaultFS","hdfs://node01:8020"); FileSystem fileSystem = FileSystem.newInstance(configuration); System.out.println(fileSystem.toString());
fileSystem.close();
}
  • 第四种方式获取FileSystem
	@Test
public void getFileSystem4() throws URISyntaxException, IOException {
Configuration configuration = new Configuration();
FileSystem fileSystem = FileSystem.newInstance(new URI("hdfs://node01:8020"), configuration); System.out.println(fileSystem.toString());
fileSystem.close();
}

递归遍历HDFS的所有文件

  • 通过递归遍历hdfs文件系统
	@Test
public void getAllFiles() throws URISyntaxException, IOException {
//获取HDFS
FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
//获取文件的状态,可以通过fileStatuses来判断究竟是文件夹还是文件
FileStatus[] fileStatuses = fileSystem.listStatus(new Path("hdfs://node01:8020/"));
/**
循环遍历FileStatus,判断文件究竟是文件夹还是文件
如果是文件,直接输出路径
如果是文件夹,继续遍历
*/
for (FileStatus fileStatus : fileStatuses) {
if (fileStatus.isDirectory()){
//如果是文件夹,继续遍历(需要再写一个方法来获取文件夹中的文件)
getDirFiles(fileStatus.getPath(),fileSystem);
} else {
Path path = fileStatus.getPath();
System.out.println(path.toString());
}
}
} public void getDirFiles(Path path,FileSystem fileSystem) throws IOException {
//还是先获取文件的状态
FileStatus[] fileStatuses = fileSystem.listStatus(path);
//循环遍历fileStatus
for (FileStatus fileStatus : fileStatuses) {
if (fileStatus.isDirectory()){
getDirFiles(fileStatus.getPath(),fileSystem);
} else {
System.out.println(fileStatus.getPath().toString());
}
}
}
  • 官方提供的API直接遍历
	/**
* 通过hdfs直接提供的API进行遍历
*/
@Test
public void getAllFiles2() throws URISyntaxException, IOException {
//获取HDFS
FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
//获取RemoteIterator 得到所有的文件或者文件夹,第一个参数指定遍历的路径,第二个参数表示是否要递归遍历
RemoteIterator<LocatedFileStatus> locatedFileStatusRemoteIterator = fileSystem.listFiles(new Path("hdfs://node01:8020/"), true);
//while循环遍历
while (locatedFileStatusRemoteIterator.hasNext()){
LocatedFileStatus next = locatedFileStatusRemoteIterator.next();
System.out.println(next.getPath().toString());
}
fileSystem.close();
}

下载文件到本地

	@Test
public void downloadFileToLocal() throws URISyntaxException, IOException {
//获取HDfS
FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
//打开输入流,读取HDfS上的文件
FSDataInputStream inputStream = fileSystem.open(new Path("hdfs://node01:8020/test/yum.log"));
//用输出流,确定下载到本地的路径
FileOutputStream outputStream = new FileOutputStream(new File("/Users/zhaozhuang/Downloads/hello2.txt"));
//用IOUtils把文件下载下来
IOUtils.copy(inputStream,outputStream);
//关闭输入流和输出流
IOUtils.closeQuietly(inputStream);
IOUtils.closeQuietly(outputStream);
fileSystem.close();
}

在HDFS上创建文件夹

	@Test
public void mkdirs() throws URISyntaxException, IOException {
//获取HDFS
FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
//创建文件夹
boolean mkdirs = fileSystem.mkdirs(new Path("/hello/mydir/test"));
//关闭系统
fileSystem.close();
}

HDFS文件上传

	@Test
public void uploadFileFromLocal() throws URISyntaxException, IOException {
//获取HDfS
FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
//上传文件
fileSystem.copyFromLocalFile(new Path("/Users/zhaozhuang/Downloads/hello2.txt"),new Path("/"));
//关闭系统
fileSystem.close();
}

HDFS权限问题以及伪造用户

  • 首先停止hdfs集群,在node01机器上执行以下命令
cd /export/servers/hadoop-2.6.0-cdh5.14.0

stop-dfs.sh
  • 修改node01机器上的hdfs-site.xml当中的配置文件
<property>
<name>dfs.permissions</name>
<value>true</value>
</property>
  • 修改完成之后配置文件发送到其他机器上面去
scp hdfs-site.xml node02:$PWD
scp hdfs-site.xml node03:$PWD
  • 重启hdfs集群
start-dfs.sh
  • 随意上传一些文件到我们hadoop集群当中准备测试使用
cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
hdfs dfs -mkdir /config
hdfs dfs -put *.xml /config
hdfs dfs -chmod 600 /config/core-site.xml
  • Java伪造root用户下载
	@Test
public void getConfig() throws URISyntaxException, IOException, InterruptedException {
//获取HDFS(第三个参数为伪造的用户)
FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration(),"root");
//下载文件
fileSystem.copyToLocalFile(new Path("/config/core-site.xml"),new Path("/Users/ZhaoZhuang/Downloads/hello3.txt"));
//关闭系统
fileSystem.close();
}

HDFS的小文件合并

  • 在linux进行小文件合并
cd /export/servers

hdfs dfs -getmerge /config/*.xml ./hello.xml
  • 在java进行小文件合并
	@Test
public void mergeFiles() throws URISyntaxException, IOException, InterruptedException {
//获取HDFS
FileSystem fileSystem = FileSystem.get(new URI("hdfs://node01:8020"), new Configuration(), "root");
//创建输出流,在HDFS端创建一个合并文件
FSDataOutputStream outputStream = fileSystem.create(new Path("/bigFile.xml"));
//获取本地文件系统
LocalFileSystem local = FileSystem.getLocal(new Configuration());
//通过本地文件系统获取文件列表,为一个集合
FileStatus[] fileStatuses = local.listStatus(new Path("/Volumes/赵壮备份/大数据离线课程资料/3.大数据离线第三天/上传小文件合并"));
//遍历FileStatus
for (FileStatus fileStatus : fileStatuses) {
FSDataInputStream inputStream = local.open(fileStatus.getPath());
IOUtils.copy(inputStream,outputStream);
IOUtils.closeQuietly(inputStream);
}
IOUtils.closeQuietly(outputStream);
local.close();
fileSystem.close();
}

【Hadoop离线基础总结】HDFS的API操作的更多相关文章

  1. 【Hadoop离线基础总结】oozie的安装部署与使用

    目录 简单介绍 概述 架构 安装部署 1.修改core-site.xml 2.上传oozie的安装包并解压 3.解压hadooplibs到与oozie平行的目录 4.创建libext目录,并拷贝依赖包 ...

  2. 【Hadoop离线基础总结】impala简单介绍及安装部署

    目录 impala的简单介绍 概述 优点 缺点 impala和Hive的关系 impala如何和CDH一起工作 impala的架构及查询计划 impala/hive/spark 对比 impala的安 ...

  3. 【Hadoop离线基础总结】Hive调优手段

    Hive调优手段 最常用的调优手段 Fetch抓取 MapJoin 分区裁剪 列裁剪 控制map个数以及reduce个数 JVM重用 数据压缩 Fetch的抓取 出现原因 Hive中对某些情况的查询不 ...

  4. 【Hadoop离线基础总结】Hue的简单介绍和安装部署

    目录 Hue的简单介绍 概述 核心功能 安装部署 下载Hue的压缩包并上传到linux解压 编译安装启动 启动Hue进程 hue与其他框架的集成 Hue与Hadoop集成 Hue与Hive集成 Hue ...

  5. 【Hadoop离线基础总结】流量日志分析网站整体架构模块开发

    目录 数据仓库设计 维度建模概述 维度建模的三种模式 本项目中数据仓库的设计 ETL开发 创建ODS层数据表 导入ODS层数据 生成ODS层明细宽表 统计分析开发 流量分析 受访分析 访客visit分 ...

  6. 客户端操作 2 HDFS的API操作 3 HDFS的I/O流操作

    2 HDFS的API操作 2.1 HDFS文件上传(测试参数优先级) 1.编写源代码 // 文件上传 @Test public void testPut() throws Exception { Co ...

  7. HDFS03 HDFS的API操作

    HDFS的API操作 目录 HDFS的API操作 客户端环境准备 1.下载windows支持的hadoop 2.配置环境变量 3 在IDEA中创建一个Maven工程 HDFS的API实例 用客户端远程 ...

  8. 【Hadoop离线基础总结】Sqoop常用命令及参数

    目录 常用命令 常用公用参数 公用参数:数据库连接 公用参数:import 公用参数:export 公用参数:hive 常用命令&参数 从关系表导入--import 导出到关系表--expor ...

  9. hadoop hdfs java api操作

    package com.duking.util; import java.io.IOException; import java.util.Date; import org.apache.hadoop ...

随机推荐

  1. jquery 延迟执行方法

    setTimeout方法使用时需注意: //以下两种方式都行: setTimeout(function () { test(); }, ); //或者 setTimeout(); function t ...

  2. F - Robot Motion 栈加BFS

    A robot has been programmed to follow the instructions in its path. Instructions for the next direct ...

  3. A - Engines Atcoder 4900

    题目大意:n个点,任意几个点组合后得到的点距离原点的最远距离. 题解:极角排序:https://blog.csdn.net/qq_39942341/article/details/79840394 利 ...

  4. APP测试和WEB测试区别

    App测试web测试的区别 单纯从功能测试的层面上来讲的话,APP 测试.web 测试 在流程和功能测试上是没有区别的 根据两者载体不一样,则区别如下: 1.兼容性测试:web端兼容浏览器,app端兼 ...

  5. linux CVE-2019-14287 Sudo提权漏洞

    CVE-2019-14287 sudo介绍 sudo,也就是以超级管理员身份运行(superuser do)的意思.sudo 是 Linux 中最常使用的重要实用程序之一,它功能十分强大,几乎安装在每 ...

  6. python第三方库安装与卸载

    一.检查python环境是否正常 python安装完毕并设置环境变量后,可在cmd中运行python查看,显示版本等信息  二.查看已经安装的第三方库 通过pip list可查看已安装的库,以及对应的 ...

  7. JSP中引用CSS样式文件却无法显示的问题解决方案

    你也遇到过这种问题吗,CSS写好了,JSP写好了,在JSP中调用CSS文件,路径检查后也正确,但是无法显示渲染后的页面 原因:罪魁祸首就是过滤器响应数据的时候,响应头设置为了“text/html”,但 ...

  8. LABEL和UUID

    基本用法 blkid 查看LABEL # blkid -s LABEL /dev/hda3: LABEL="/" /dev/hda1: LABEL="/boot1&quo ...

  9. IntelliJ IDEA在mac中完全删除方法

    cd /Applications/ rm -r IntelliJ\ IDEA.app/ rm -r /Users/apple/Library/Logs/IntelliJIdea2019.3/ rm - ...

  10. tp5 auth权限的原理

    我的一些个人理解,还是有些不懂的地方,有错误请指正,谢谢!!! class Auth{ //默认配置 protected $_config = array( 'auth_on' => true, ...