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集群的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 对象引用 弱引用吗_Java对
- 下一篇: 信息学奥赛一本通 1970:【15NOI