日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

hadoop java访问_Hadoop(五)搭建Hadoop客户端与Java访问HDFS集群

發布時間:2025/3/17 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hadoop java访问_Hadoop(五)搭建Hadoop客户端与Java访问HDFS集群 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一篇詳細介紹了HDFS集群,還有操作HDFS集群的一些命令,常用的命令:

hdfs dfs -ls xxx

hdfs dfs -mkdir -p /xxx/xxx

hdfs dfs -cat xxx

hdfs dfs -put local cluster

hdfs dfs -get cluster local

hdfs dfs -cp /xxx/xxx /xxx/xxx

hdfs dfs -chmod -R 777 /xxx

hdfs dfs -chown -R zyh:zyh /xxx

注意:這里要說明一下-cp,我們可以從本地文件拷貝到集群,集群拷貝到本地,集群拷貝到集群。

一、Hadoop客戶端配置

其實在前面配置的每一個集群節點都可以做一個Hadoop客戶端。但是我們一般都不會拿用來做集群的服務器來做客戶端,需要單獨的配置一個客戶端。

1)安裝JDK

2)安裝Hadoop

3)客戶端配置子core-site.xml

4)客戶端配置之mapred-site.xml

5)客戶端配置之yarn-site.xml

以上就搭建了一個Hadoop的客戶端

二、Java訪問HDFS集群

2.1、HDFS的Java訪問接口

1)org.apache.hadoop.fs.FileSystem

是一個通用的文件系統API,提供了不同文件系統的統一訪問方式。

2)org.apache.hadoop.fs.Path

是Hadoop文件系統中統一的文件或目錄描述,類似于java.io.File對本地文件系統的文件或目錄描述。

3)org.apache.hadoop.conf.Configuration

讀取、解析配置文件(如core-site.xml/hdfs-default.xml/hdfs-site.xml等),或添加配置的工具類

4)org.apache.hadoop.fs.FSDataOutputStream

對Hadoop中數據輸出流的統一封裝

5)org.apache.hadoop.fs.FSDataInputStream

對Hadoop中數據輸入流的統一封裝

2.2、Java訪問HDFS主要編程步驟

1)構建Configuration對象,讀取并解析相關配置文件

Configuration conf=new Configuration();

2)設置相關屬性

conf.set("fs.defaultFS","hdfs://1IP:9000");

3)獲取特定文件系統實例fs(以HDFS文件系統實例)

FileSystem fs=FileSystem.get(new URI("hdfs://IP:9000"),conf,“hdfs");

4)通過文件系統實例fs進行文件操作(以刪除文件實例)

fs.delete(new Path("/user/liuhl/someWords.txt"));

2.3、使用FileSystem API讀取數據文件

有兩個靜態工廠方法來獲取FileSystem實例文件系統。

常用的就第二個和第四個

三、實戰Java訪問HDFS集群

3.1、環境介紹

1)使用的是IDEA+Maven來進行測試

2)Maven的pom.xml文件

?pom.xml

3)HDFS集群一個NameNode和兩個DataNode

3.2、查詢HDFS集群文件系統的一個文件將它文件內容打印出來

package com.jslg.zyh.hadoop.hdfs;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.fs.FSDataInputStream;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.net.URI;

public class CatDemo_0010 {

public static void main(String[] args) throws IOException {

// 創建Configuration對象

Configuration conf=new Configuration();

// 創建FileSystem對象

FileSystem fs=

FileSystem.get(URI.create(args[0]),conf);

// 需求:查看/user/kevin/passwd的內容

// args[0] hdfs://1.0.0.5:9000/user/zyh/passwd

// args[0] file:///etc/passwd

FSDataInputStream is=

fs.open(new Path(args[0]));

byte[] buff=new byte[1024];

int length=0;

while((length=is.read(buff))!=-1){

System.out.println(

new String(buff,0,length));

}

System.out.println(

fs.getClass().getName());

}

}

1)需要在HDFS文件系統中有passwd.txt文件,如果沒有需要自己創建

hdfs dfs -mkdir -p /user/zyh

hdfs dfs -put /etc/passwd /user/zyh/passwd.txt

2)將Maven打好的jar包發送到服務器中,這里我們就在NameNode主機中執行,每一個節點都是一個客戶端。

注意:

這里要發送第二個包,因為它把相關類也打進jar中

查看服務器已經收到jar包

3)執行jar包查看結果

我們可以看到查詢出來了passwd.txt中的內容

注意:在最后我們還查看了一下FileSystem類,因為我們知道FileSystem是抽象類,它是根據后面的URI來確定到底調用的是哪一個子類的。

3.3、我們在IEDA中執行來獲取文件系統的內容并打印在控制臺和相應的本地文件中

1)主要代碼

public static void main(String[] args) throws IOException {

//創建configuration對象

Configuration conf = new Configuration();

//創建FileSystem對象

//需求:查看hdfs集群服務器/user/zyh/passwd.txt的內容

FileSystem fs = FileSystem.get(URI.create("hdfs://1.0.0.5:9000/user/zyh/passwd.txt"), conf);

// args[0] hdfs://1.0.0.3:9000/user/zyh/passwd.txt

// args[0] file:///etc/passwd.txt

FSDataInputStream is = fs.open(new Path("hdfs://1.0.0.5:9000/user/zyh/passwd.txt"));

OutputStream os=new FileOutputStream(new File("D:/a.txt"));

byte[] buff= new byte[1024];

int length = 0;

while ((length=is.read(buff))!=-1){

System.out.println(new String(buff,0,length));

os.write(buff,0,length);

os.flush();

}

System.out.println(fs.getClass().getName());

//這個是根據你傳的變量來決定這個對象的實現類是哪個

}

2)Maven重新編譯,并執行

3)結果

在控制臺中:

在本地文件中:

3.4、獲取HDFS集群文件系統中的文件到本地文件系統

1)主要代碼

public class GetDemo_0010 {

public static void main(String[] args) throws IOException {

Configuration conf=

new Configuration();

// 獲取從集群上讀取文件的文件系統對象

// 和輸入流對象

FileSystem inFs=

FileSystem.get(

URI.create(args[0]),conf);

FSDataInputStream is=

inFs.open(new Path(args[0]));

// 獲取本地文件系統對象

//當然這個你也可以用FileOutputStream

LocalFileSystem outFs=

FileSystem.getLocal(conf);

FSDataOutputStream os=

outFs.create(new Path(args[1]));

byte[] buff=new byte[1024];

int length=0;

while((length=is.read(buff))!=-1){

os.write(buff,0,length);

os.flush();

}

System.out.println(

inFs.getClass().getName());

System.out.println(

is.getClass().getName());

System.out.println(

outFs.getClass().getName());

System.out.println(

os.getClass().getName());

os.close();

is.close();

}

}

2)結果

我們可以看到對于HDFS集群中獲取的FileSystem對象是分布式文件系統,而輸入流是HdfsDataInputStream主要用來做數據的傳輸。

對于本地來說獲取到的FileSystem對象時本地文件系統,而輸出流就是FSDataOutputStream。

將HDFS中的文件拿到windows中:

//創建configuration對象

Configuration conf = new Configuration();

// 獲取從集群上讀取文件的文件系統對象

// 和輸入流對象

FileSystem inFs=

FileSystem.get(

URI.create("file://1.0.0.5:9000/user/kevin/passwd"),conf);

FSDataInputStream is=

inFs.open(new Path("hdfs://1.0.0.5:9000/user/kevin/passwd"));

// 獲取本地文件系統對象

LocalFileSystem outFs=

FileSystem.getLocal(conf);

FSDataOutputStream os=

outFs.create(new Path("C:\\passwd"));

byte[] buff=new byte[1024];

int length=0;

while((length=is.read(buff))!=-1){

os.write(buff,0,length);

os.flush();

}

System.out.println(

inFs.getClass().getName());

System.out.println(

is.getClass().getName());

System.out.println(

outFs.getClass().getName());

System.out.println(

os.getClass().getName());

os.close();

is.close();

3.5、通過設置命令行參數變量來編程

這里需要借助Hadoop中的一個類Configured、一個接口Tool、ToolRunner(主要用來運行Tool的子類也就是run方法)

分析:

1)我們查看API可以看到ToolRunner中有一個run方法:

里面需要一個Tool的實現類和使用args用來傳遞參數的String類型的數據

2)分析Configured

這是Configurable接口中有一個getConf()方法

而在Configured類中實現了Configurable接口

所以Configured類中實現了Configurable接口的getConf()方法,使用它來獲得一個Configuration對象

3)細說Configuration對象

可以獲取Hadoop的所有配置文件中的數據

還可以通過使用命令行中使用-D(-D是一個標識)使用的變量以及值

1)主要代碼

import java.net.URI;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.conf.Configured;

import org.apache.hadoop.fs.FSDataInputStream;

import org.apache.hadoop.fs.FSDataOutputStream;

import org.apache.hadoop.fs.FileSystem;

import org.apache.hadoop.fs.Path;

import org.apache.hadoop.io.IOUtils;

import org.apache.hadoop.util.Tool;

import org.apache.hadoop.util.ToolRunner;

public class GetDemo_0011

extends Configured

implements Tool{

@Override

public int run(String[] strings) throws Exception{

//我們所有的代碼都寫在這個run方法中

Configuration conf=

getConf();

String input=conf.get("input");

String output=conf.get("output");

FileSystem inFs=

FileSystem.get(

URI.create(input),conf);

FSDataInputStream is=

inFs.open(new Path(input));

FileSystem outFs=

FileSystem.getLocal(conf);

FSDataOutputStream os=

outFs.create(new Path(output));

IOUtils.copyBytes(is,os,conf,true);

return 0;

}

public static void main(String[] args) throws Exception{

//ToolRunner中的run方法中需要一個Tool的實現類,和

System.exit(

ToolRunner.run(

new GetDemo_0011(),args));

}

}

分析:

1)介紹IOUtils

它是Hadoop的一個IO流的工具類,查看API中可知!

2)打包jar發送給服務器執行

3)查看結果

3.6、從HDFS集群中下載文件到本地

1)普通版

?P00032_HdfsDemo_PutFile_0010

2)可以觀察到寫入了多少

?P00031_HdfsDemo_PutFile_001

總結

以上是生活随笔為你收集整理的hadoop java访问_Hadoop(五)搭建Hadoop客户端与Java访问HDFS集群的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。