1. 程式人生 > >HDFS常用的Java Api詳解

HDFS常用的Java Api詳解

一、使用Hadoop URL讀取資料

複製程式碼
package hadoop;

import java.io.InputStream;
import java.net.URL;

import org.apache.hadoop.fs.FsUrlStreamHandlerFactory;
import org.apache.hadoop.io.IOUtils;

public class URLCat {

    static {
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    }

    
public static void readHdfs(String url) throws Exception { InputStream in = null; try { in = new URL(url).openStream(); IOUtils.copyBytes(in, System.out, 4096, false); } finally { IOUtils.closeStream(in); } } public static
void main(String[] args) throws Exception { readHdfs("hdfs://192.168.49.131:9000/user/hadoopuser/input20120828/file01"); } }
複製程式碼

其中,我使用到的jar包有:

hadoop-core的版本一定要和分散式環境上安裝的hadoop版本保持一致,不然會報錯:

12/09/11 14:18:59 INFO security.UserGroupInformation: JAAS Configuration already set up for Hadoop, not re-installing.
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/thirdparty/guava/common/collect/LinkedListMultimap
    at org.apache.hadoop.hdfs.SocketCache.<init>(SocketCache.java:48)
    at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:240)


分散式環境上安裝的hadoop版本如下:

執行main方法,輸出:hello world bye world 和hdfs中儲存的檔案資訊是保持一致的:

二、使用FileSystem API 讀取資料

複製程式碼
package hadoop;

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;

public class FileSystemCat {

    public static void readHdfs(String url) throws IOException {
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(url), conf);
        InputStream in = null;
        try {
            in = fs.open(new Path(url));
            IOUtils.copyBytes(in, System.out, 4096, false);
        } finally {
            IOUtils.closeStream(in);
        }
    }

    public static void main(String[] args) throws IOException {
        readHdfs("hdfs://192.168.49.131:9000/user/hadoopuser/output20120828/part-00000");
    }
}
複製程式碼

執行輸出:

bye    2
hadoop    2
hello    2
world    2

三、建立目錄

     3.1 寫資料 public boolean mkdirs(Path f) throws IOException 會按照客戶端請求建立未存在的父目錄

複製程式碼
package hadoop;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;

public class FileCopyWithProgress {

    public static void fileCopy(String localFile, String hdfsFile) throws IOException{
        InputStream in = new BufferedInputStream(new FileInputStream(localFile));
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(hdfsFile),conf);
        OutputStream out  = fs.create(new Path(hdfsFile),new Progressable(){
            public void progress(){
                System.out.println("*");
            }
        });
        IOUtils.copyBytes(in, out, 4096,true);
    }

    public static void main(String[] args) throws IOException {
        fileCopy("D://heat2.txt", "hdfs://192.168.49.131:9000/user/hadoopuser/output20120911/");
    }
}
複製程式碼

執行後會報錯如下:

Exception in thread "main" org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied: user=libininfo, access=WRITE, inode="/user/hadoopuser":hadoopuser:supergroup:drwxr-xr-x

因為往hadoop寫檔案是許可權不容許的,

解決方法:在hdfs-site.xml 中取消許可權校驗,即加入以下配置:

到伺服器上修改hadoop的配置檔案:conf/hdfs-core.xml, 找到 dfs.permissions 的配置項 , 將value值改為 false

再次執行,如果有以下報錯:

Exception in thread "main" org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create file/user/hadoopuser/output20120911. Name node is in safe mode.
The reported blocks 6 has reached the threshold 0.9990 of total blocks 6. Safe mode will be turned off automatically in 5 seconds.

說明Hadoop的NameNode處在安全模式下,那什麼是Hadoop的安全模式呢?
在分散式檔案系統啟動的時候,開始的時候會有安全模式,當分散式檔案系統處於安全模式的情況下,檔案系統中的內容不允許修改也不允許刪除,直到安全模式結束。安全模式主要是為了系統啟動的時候檢查各個DataNode上資料塊的有效性,同時根據策略必要的複製或者刪除部分資料塊。執行期通過命令也可以進入安全模式。在實踐過程中,系統啟動的時候去修改和刪除檔案也會有安全模式不允許修改的出錯提示,只需要等待一會兒即可。
現在就清楚了,那現在要解決這個問題,我想讓Hadoop不處在safe mode 模式下,能不能不用等,直接解決呢?
答案是可以的,只要在Hadoop的目錄下輸入:
bin/hadoop dfsadmin -safemode leave
也就是關閉Hadoop的安全模式,這樣問題就解決了。如果不這麼操作,我們可以等待幾秒,然後再次執行程式,可以看到程式正常執行,有以下輸出:

*
*
*
*
*
"*",即上傳進度,沒寫入64KB即輸出一個"*"
然後檢視hdfs的目錄發現檔案已經存在。

     3.2 檔案系統查詢 列出目錄檔案資訊

複製程式碼
package hadoop;

import java.io.IOException;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;

public class ListStatus {

    public static void readStatus(String url) throws IOException {
        Configuration conf = new Configuration();
        FileSystem fs = FileSystem.get(URI.create(url), conf);
        Path[] paths = new Path[1];
        paths[0] = new Path(url);
        FileStatus[] status = fs.listStatus(paths);
        Path[] listedPaths = FileUtil.stat2Paths(status);
        for (Path p : listedPaths) {
            System.out.println(p);
        }
    }

    public static void main(String[] args) throws IOException {
        readStatus("hdfs://192.168.49.131:9000/user/hadoopuser/output20120828/");
    }
}
複製程式碼

輸出:

hdfs://192.168.49.131:9000/user/hadoopuser/output20120828/_SUCCESS
hdfs://192.168.49.131:9000/user/hadoopuser/output20120828/_logs
hdfs://192.168.49.131:9000/user/hadoopuser/output20120828/part-00000

相關推薦

HDFS常用Java Api

一、使用Hadoop URL讀取資料 package hadoop; import java.io.InputStream; import java.net.URL; import org.apache.hadoop.fs.FsUrlStreamHandlerFactory; import org.

spark2.x由淺入深深到底系列六之RDD java api

spark 大數據 javaapi 老湯 rdd package com.twq.javaapi.java7; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaRDD; import org.

spark2.x由淺入深深到底系列六之RDD java api

老湯 spark 大數據 javaapi rdd 學習任何spark知識點之前請先正確理解spark,可以參考:正確理解spark本文詳細介紹了spark key-value類型的rdd java api一、key-value類型的RDD的創建方式1、sparkContext.parall

spark2.x由淺入深深到底系列六之RDD java api

spark 大數據 javaapi 老湯 rdd 學習spark任何的知識點之前,先對spark要有一個正確的理解,可以參考:正確理解spark本文對join相關的api做了一個解釋SparkConf conf = new SparkConf().setAppName("appName")

HDFS常用Java API程式碼演示

1、 建立資料夾 2、 上傳檔案     3、 下載檔案   4、 刪除檔案或者資料夾     5、 重新命名檔案或者資料夾     6、 檢視目錄資訊,只顯示該資料夾下的檔案資訊    7、 檢視檔案及資料夾資訊 

支付寶支付-常用支付API(查詢、退款、提現等)

本文章已同步釋出到簡書 http://www.jianshu.com/p/b6e6291709c7 1、前言 此專案已開源歡迎Start、PR、發起Issues一起討論交流共同進步 https://github.com/Javen205/IJPay  http://git

Java API --(七)

Java API概念: API (Application Program Interface):應用程式介面;Java API是Java提供很多類和應用程式介面,主要用來幫助我們程式設計; java API的使用: 比如想查詢java的隨機函式的用法 1、  單擊類目錄

ZooKeeper 常用操作API

轉載:http://www.aboutyun.com/thread-12817-1-1.html 問題導讀: 1、ZooKeeper的常用API方法都有那些? 2、Zookeeper 到底能幫我們解決那些問題? 3、如何實現共享鎖(Locks)?   ZooKeeper是一個用於分散式應用程式的

Appium-java API

目前appium-java最新版本是5.0.0-BETA3,因此就拿最新的說明,以Java為例,首先引入java client的依賴: <dependency> <groupId>io.appium</

Java常用IO流

cat exce getpath tst IV trac AC output har 一、流的分類: 按照數據流向的不同:輸入流 輸出流 按照處理數據的單位的不同:字節流 字符流(處理的文本文件) 按照角色的不同:節點流(直接作用於文件的) 處理流 二、IO的體系

Java 8 集合之流式(Streams)操作, Streams API

因為當時公司的業務需要對集合進行各種各樣的業務邏輯操作,為了提高效能,就用到了這個東西,因為以往我們以前用集合都是需要去遍歷(序列),所以效率和效能都不是特別的好,而Streams就可以使用並行的方式來操作集合。 Stream 就如同一個迭代器(Iterator),單向,不可往復,資料只能遍歷一次,遍歷過一

分享知識-快樂自己:Hibernate框架常用API

1):Configuration配置物件 Configuration用於載入配置檔案。 1): 呼叫configure()方法,載入src下的hibernate.cfg.xml檔案     Configuration conf = new Configuration().configure(); 2)

Java程式設計師從笨鳥到菜鳥之(五十三)細談Hibernate(四)Hibernate常用配置檔案

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Collection中帶有All結尾的常用API

相同 contains 不變 這樣的 添加 重新 lean addall als Collection中帶有All結尾的常用API有四種:addAll(),removeAll(),containsAll() 和 retainAll() 詳解: 假設現有2個List對象,分別

java常用jar包

1、dt.jar SUN對於dt.jar的定義:Also includes dt.jar, the DesignTime archive of BeanInfo files that tell interactive development environments (IDE's) h

Hibernate的常用API

Hibernate的常用API詳解 一、Configuration配置物件 Configuration:載入配置檔案 1.1 呼叫configure()方法,載入src下的hibernate.cfg.xml檔案 Configuration conf = new Configu

[轉]Java 8 中的 Streams API

原文連結:https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/   為什麼需要 Stream Stream 作為 Java 8 的一大亮點,它與 java.io 包裡的 InputStream 和 OutputStrea

Java 8 中的 Streams API

Streams 的背景,以及 Java 8 中的使用詳解 陳 爭雲, 佔 宇劍, 和 司 磊 2014 年 9 月 11 日釋出 49 為什麼需要 Stream Stream 作為 Java 8 的一大亮點,它與 java.io 包裡的 InputStre

java常用集合類(有例子,集合類糊塗的來看!)

TreeSet:TreeSet是依靠TreeMap來實現的.TreeSet是一個有序集合,TreeSet中元素將按照升序排列,預設是按照自然排序進行排列,意味著TreeSet中元素要實現Comparable介面.我們可以在構造TreeSet物件時,傳遞實現了Comparator介面的比較器物件.java.ut

Java程式設計中常用的集合 對你非常有用

Java中的集合概述 集合是一個容器,用來存放引用型別的資料,在java.util包下。 Java中的集合主要有3種類型: List介面: 是一個有序集合,可以放重複的資料。 Set介面: 是一個無序集合,不允許放重複的資料。 Map介面: 是一個無序集合,集合