Hadoop入門系列(四) HDFS的使用與編程

2021-03-02 童的小屋
Hadoop入門系列(四) HDFS的使用與編程內容使用Hadoop Shell命令操作hdfs文件系統,熟悉分布式文件系統及操作命令。配置Maven及使用Maven構建的Hadoop工程項目。使用Hadoop的JAVA api操作hdfs文件系統。HDFS的使用與編程HDFS基本命令

mkdir創建文件目錄

hadoop  fs  -mkdir  -p  /Software/hadoop/
hadoop  fs  -mkdir  -p  hdfs://localhost:9000/Software/Java/

put上傳文件

hadoop  fs  -put  ~/hadoop-2.8.3.tar.gz  /Software/hadoop/
hadoop  fs  -put  ~/jdk-8u172-linux-x64.rpm  /Software/Java/
hadoop  fs  -put  /usr/local/hadoop2/README.txt  /

ls顯示目錄結構

hadoop fs -ls  /Software/

chmod修改文件權限

hadoop fs -chmod 600 /Software/hadoop
hadoop fs -ls  /Software/

rm刪除文件

hadoop fs -rm /Software/Java/*

rmdir刪除目錄

hadoop fs -rmdir /Software/Java

get下載文件

hadoop fs -get /README.txt  ~
ls -l ~

cat顯示文件內容

hadoop fs -cat /README.txt

cp複製文件

hadoop fs -cp /Software/hadoop/hadoop-2.8.3.tar.gz /Software

mv移動文件

hadoop fs -mkdir -p /input
hadoop fs -mv /README.txt /input

使用Java API 訪問HDFS文件系統

ApacheMaven是一套軟體工程管理和整合工具。基於工程對象模型(POM)的概念
通過一個中央信息管理模塊,Maven能夠管理項目的構建、發布、報告和文檔。即使常用
的Eclipse這樣的JavaIDE開發環境,其內部也是通過Maven管理Java項目的。在編程時,
通過Maven的包管理功能可以自動下載程序所需要的jar包,使得開發過程十分方便。

MAVEN 的安裝與配置

這裡的安裝包我已經事先準備好了,所以可以直接從sudo tar開始執行

cd 
curl  -O  http://mirrors.shu.edu.cn/apache/maven/binaries/apache-maven-3.2.2-bin.tar.gz
sudo tar -xvf ./apache-maven-3.2.2-bin.tar.gz -C /usr/local/
echo 'export MAVEN_HOME=/usr/local/apache-maven-3.2.2
> export MAVEN_OPTS="$MAVEN_OPTS -Xms256m -Xmx512m -XX:ReservedCodeCacheSize=64m"
> export PATH=${PATH}:${MAVEN_HOME}/bin' > ~/maven.sh
sudo  mv  ~/maven.sh   /etc/profile.d/
source  /etc/profile.d/maven.sh
mvn  --version


使用 Maven 阿里雲中央倉庫

由於Maven 預設使用國外的中央倉庫,使得下載依賴包時十分緩慢,因此,需要將中央倉庫配置為國內的阿里雲中央倉庫。
打開maven的配置文件

sudo gedit  /usr/local/apache-maven-3.2.2/conf/settings.xml

在這裡插入圖片描述
  <mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
  </mirrors>

在這裡插入圖片描述使用 Maven 構建Java項目

在本實驗中我們將要開發一個讀取並顯示hdfs文件系統根目錄下的README.txt文件
的程序。
為此我們採用Maven構建Java項目
使用Maven只要學習很少的命令就可以創
建和管理Java項目
在命令行下執行以下代碼,以創建Java項目。

cd  ~
mvn archetype:generate -DgroupId=edu.dufe.hdfstest -DartifactId=HdfsCatREADME -DarchetypeArtifactId=maven-archetype-quickstart  -DinteractiveMode=false


我們可以使用tree 命令查看一下目錄的結構

**如果沒有下載過tree命令的用下面的語句下載**
sudo yum -y install tree


上圖就是剛剛創建的java項目的結構了
項目目錄下pom.xml文件,它描述了整個項目的信息,一切從目錄結構,項目的插件,
項目依賴,如何構建這個項目等。App.java是項目源程序AppTest.java是項目測試源程序。
在本實驗中我們將要開發一個讀取並顯示hdfs文件系統根目錄下的README.txt文件
的程序因此需要將App.java名稱重命名為HdfsCatREADME.java並在pom.xml中添加與
hadoop2.8.3的依賴項。為此執行以下命令。

修改源程序文件名

cd   ~/HdfsCatREADME/src/main/java/edu/dufe/hdfstest/
mv  ./App.java  ./HdfsCatREADME.java
cd   ~/HdfsCatREADME

然後在CentOS7桌面上,使用gedit打開HdfsCatREADME/pom.xml文件。將以下紅色內
容添加到文件的對應位置處。

gedit ~/HdfsCatREADME/pom.xml 

下面是整個文件修改後的內容

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>edu.dufe.hdfstest</groupId>
  <artifactId>HdfsCatREADME</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>HdfsCatREADME</name>
  <url>http://maven.apache.org</url>
  <dependencies>
   <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>2.8.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.8.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-core</artifactId>
        <version>2.8.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>2.8.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-auth</artifactId>
        <version>2.8.3</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>


<build>
    <finalName>HdfsCatREADME</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
        <configuration>
          <archive>
            <manifest>
              <mainClass>edu.dufe.hdfstest.HdfsCatREADME</mainClass>
              <addClasspath>true</addClasspath>
              <classpathPrefix>lib/</classpathPrefix>
            </manifest>
            <manifestEntries>
              <Class-Path>lib/slf4j-api-1.7.13.jar</Class-Path>
            </manifestEntries>
          </archive>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
          <execution>
            <id>copy</id>
            <phase>package</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>
                ${project.build.directory}/lib
              </outputDirectory>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

接下裡編寫Java源程序
gedit src/main/java/edu/dufe/hdfstest/HdfsCatREADME.java

package edu.dufe.hdfstest;


import java.io.IOException;  
import java.net.URI;  
  
import org.apache.hadoop.conf.Configuration;  
import org.apache.hadoop.fs.FSDataInputStream;  
import org.apache.hadoop.fs.FileSystem;  
import org.apache.hadoop.fs.Path;  
  

public class HdfsCatREADME 
{
    public static void main(String[] args) {  
        try {  
        String dsf = "hdfs://127.0.0.1:9000/README.txt";  
        Configuration conf = new Configuration();  
          
        FileSystem fs = FileSystem.get(URI.create(dsf),conf);  
        FSDataInputStream hdfsInStream = fs.open(new Path(dsf));  
          
        byte[] ioBuffer = new byte[1024];  
        int readLen = hdfsInStream.read(ioBuffer);  
        while(readLen!=-1)  
        {  
            System.out.write(ioBuffer, 0, readLen);  
            readLen = hdfsInStream.read(ioBuffer);  
        }  
        hdfsInStream.close();  
        fs.close();  
        } catch (IOException e) {  
               e.printStackTrace();  
        }  
    }  
}  

使用 Maven 編譯打包Java項目

項目開發完成後,我們就可以編譯、打包項目了,為此執行以下命令。

cd   ~/HdfsCatREADME
mvn  clean  compile   
mvn  clean  package  

當命令執行後,顯示出[INFO] BUILD SUCCESS內容時,說明編譯打包成功。這裡
在~/HdfsCatREADME目錄下就會多出一個target的文件夾, 並在此文件夾下有編譯打包好
的目標程序 HdfsCatREADME.jar

如果編譯失敗,則有可能是源程序有錯誤,請根據出錯
提示,仔細核對源程序是否正確。

下圖是成功的結果

執行程序
cd   ~/HdfsCatREADME
java  -jar  ./target/HdfsCatREADME.jar  #執行程序

這裡我產生了如下的報錯

Call From HadoopMaster/192.168.206.15 to localhost:9000 failed on connection exception: java.net.ConnectException: 拒絕連接;

仔細一看 拒絕連接,是因為我重啟虛擬機之後尚未啟動hadoop 這裡只需要start-dfs.sh就可以了

又報錯了,這次是README.txt不存在,簡單的檢查一下

因為之前Java裡面定義的是根目錄下的,這裡就簡單的copy一份就好了

這裡的命令在文章開頭就講了,所以遇到錯誤不要慌

成功讀出結果

更多關於Java操作HDFS的實例 可以看東財實驗4PDF的附錄

使用Python 訪問HDFS文件系統安裝python及hdfs包

注意要先執行下面命令,不然可能會顯示python34不存在
官方的rpm repository提供的rpm包往往是很滯後的,裝上了 epel 之後,就相當於添加了一個第三方源

yum install epel-release

安裝python與hdfs包

sudo  yum  install   python34      #安裝python3
sudo  yum  install   python34-pip   #安裝包管理工具
sudo  pip3.4  install  hdfs            #安裝hdfs包


可以看到我們已經安裝了hdfs,下面的提示是警告你升級pip的,按它說的執行就好了

創建 hdfs 連接實例

python的操作非常簡單
先創建client連接
然後通過client對象來操作hdfs ,下面的代碼創建了文件夾並且 列舉了根目錄的內容

permission參數是對要創建的文件夾設置權限

#創建hdfs連接實例
import sys
import hdfs
client = hdfs.Client("http://127.0.0.1:50070")
#創建文件目錄並列表
client.makedirs("/data/tmp",permission=755)
client.list("/")

更多python操作的細節 可搜索百度

相關焦點

  • java大數據之Hadoop開發環境
    安裝javahadoop2.6以前的版本,需要jdk1.6以上的版本;從hadoop2.7開始,則需要jdk1.7以上的版本。我推薦使用jdk1.8,穩定可靠。 對於linux作業系統用戶下載jdk-8u161-linux-x64.tar.gz壓縮包文件,進行解壓。
  • 最詳細的 Hadoop 入門教程
    這是一篇入門文章,Hadoop 的學習方法很多,網上也有很多學習路線圖。本文的思路是:以安裝部署 Apache Hadoop2.x 版本為主線,來介紹 Hadoop2.x 的架構組成、各模塊協同工作原理、技術細節。安裝不是目的,通過安裝認識Hadoop才是目的。本文分為五個部分、十三節、四十九步。
  • Hadoop「填坑」指南
    ,經常會出現一些集群問題,有些問題會導致數據查詢錯誤,有些問題會導致整個集群無法正常運行,本系列文章將列舉一些問題案例,通過描述問題處理過程。問題),解決辦法1.在hive客戶端執行:export HADOOP_HEAPSIZE="8192"2.hdfs解決策略(需要重啟hdfs解決問題)官方詳細描述:https://issues.apache.org/jira/browse/HADOOP-13039場景:hadoop hdfs 中的nondfs增加到一定大小時會導致dfs可用空間減小
  • 關於HDFS-KMS集群化部署教程,你以前看的都錯了!
    </configuration>使用keytool生成的秘鑰密碼是123456  將密碼直接寫入到kms.keystore.password文件:echo   123456  > ${HADOOP_HOME}/share/hadoop/kms/tomcat/webapps/kms/WEB-INF/classes/kms.keystore.password
  • 史上最詳細、最全面的Hadoop環境搭建
    作者:鳴宇淳原文:https://gitbook.cn/books/5954c9600326c7705af8a92a/index.html 前言這是一篇入門文章
  • 0508-如何使用Hadoop的Archive處理小文件
    ,可以使用手機打開文章單擊文中的圖片放大查看高清原圖。文章中也提到小文件過多會對NameNode造成壓力,導致NameNode內存使用過高。本篇文章Fayson主要使用Hadoop Archive Files功能將集群中的小文件進行歸檔。
  • Hadoop之wordcount實例-MapReduce程序
    Hadoop 的MapReduce處理框架,一般的編程模型如下圖所示, 將一個業務拆分為 Mapper 和 Reducer 兩個階段。使用 Python 語言背後的「技巧」是我們將使用 Hadoop Streaming API 來幫助我們通過 STDIN(標準輸入)和 STDOUT(標準輸出)在 Map 和 Reduce 代碼之間傳遞數據。
  • 獨家 | 帶你認識HDFS和如何創建3個節點HDFS集群(附代碼&案例)
    在本文中,大數據專家將為您介紹如何使用HDFS以及如何利用HDFS創建HDFS集群節點。我們將從HDFS、Zookeeper、Hbase和OpenTSDB上的系列博客開始,了解如何利用這些服務設置OpenTSDB集群。在本文中,我們將探究HDFS。
  • 實戰 | HDFS常用的40個命令,你都知道嗎?
    首先在 HDFS 中創建目錄 /sn,並將 /sn 目錄設置為可快照,如下所示:[root@node01 zwj]# hadoop fs -mkdir /sn[root@node01 zwj]# hdfs dfsadmin -allowSnapshot /snAllowing snaphot on /sn succeeded
  • Logstash讀取Kafka數據寫入HDFS詳解
    ,webhdfs使用HDFS提供的API將數據寫入HDFS集群插件安裝插件安裝比較簡單,直接使用內置命令即可# cd /home/opt/tools/logstash-6.6.2# ./bin/logstash-plugin install logstash-output-webhdfs配置hostsHDFS集群內通過主機名進行通信所以logstash所在的主機需要配置hadoop集群的hosts信息192.168.107.154 master01192.168.107.155 slave01192.168.107.156
  • 獨家 | 一文讀懂Hadoop(三):Mapreduce
    2017年年初apache發行了Hadoop3.0,也意味著一直有一群人在對Hadoop不斷的做優化,不僅如此,各個Hadoop的商業版本也有好多公司正在使用,這也印證了它的商業價值。讀者可以通過閱讀「一文讀懂Hadoop」系列文章,對Hadoop技術有個全面的了解,它涵蓋了Hadoop官網的所有知識點,並且通俗易懂,英文不好的讀者完全可以通過閱讀此篇文章了解Hadoop。
  • Hadoop大數據面試題全版本
    解壓hadoop安裝包7 配置hadoop的核心文件 hadoop-env.sh,core-site.xml , mapred-site.xml , hdfs-site.xml8 配置hadoop環境變量9 格式化 hadoop namenode-format
  • Java從WordCount看hadoop執行流程
    準備要執行Map reduce程序,首先得安裝hadoop,hadoop安裝可以參考hadoop安裝啟動hdfs和yarnstart-dfs.cmdstart-yarn.cmd創建待處理數據目錄:hadoop fs -mkdir /wchadoop fs -mkdir /wc/in# 查看目錄hadoop fs -ls -R /上傳待處理數據文件:hadoop fs
  • 大數據架構師基礎:hadoop家族,Cloudera系列產品介紹
    我們可以帶著下面問題來閱讀本文章:1.hadoop都包含什麼技術?2.Cloudera公司與hadoop的關係是什麼,都有什麼產品,產品有什麼特性?3.Spark與hadoop的關聯是什麼?4.Storm與hadoop的關聯是什麼?
  • 使用JavaScript編寫MapReduce程序
    本文轉載自:http://www.jianshu.com/p/227c4155941e最近在學習 Hadoop ,權威指南 中介紹到了 Hadoop Streaming,說 Hadoop Streaming 是 Hadoop 提供的一個編程工具
  • 大數據開發入門實例
    案例比較簡單,使用 MapReduce、hive、Spark 等框架進行計算,對框架有一個簡單的了解。現在對這個案例進行一個簡單的整理,方便後期學習。3.1.準備工作在正式開始這項工作時,首先要保證自己的環境可以正常運行,hadoop 集群、mysql、hive
  • Apache Hadoop 3.0.0 GA 正式發布,要求 Java 8
    更多關於HDFS的糾刪碼可以參見http://hadoop.apache.org/docs/r3.0.0-beta1/hadoop-project-dist/hadoop-hdfs/HDFSErasureCoding.html或者直接閱讀本博客Hadoop 3.0糾刪碼(Erasure Coding):節省一半存儲空間的相關介紹。
  • 大數據快速入門(09):永久弄清楚 Hive 分區表和分桶表的區別
    從文件上來看,分區是 hdfs 的一個目錄,可以指定多個分區,這樣在插入數據的時候,hdfs 會產生多個目錄。」假設一個表的一級分區是 dt,二級分區是 user_id,那麼這種劃分方式可能導致太多的小分區,如果使用動態分區,創建超多的目錄,hdfs 爸爸肯定就要炸了。所以分桶表,是將一個完整的數據集分成若干部分。它存在的意義是:一是提高 join 查詢的效率;二是利於抽樣。
  • HDFS的Shell操作(開發重點)
    >具體命令 OR bin/hdfs dfs具體命令dfs是fs的實現類。>(1)-help:輸出這個命令參數[hadoop@hadoop103 hadoop-2.7.2]$ hadoop fs -help rm(2)-ls: 顯示目錄信息[hadoop@hadoop103 hadoop-2.7.2
  • 成為大數據頂尖程式設計師,先過了這些Hadoop面試題!(附答案解析)
    導讀:在大數據開發崗位的需求下,工資待遇水漲船高,不少編程人員在面對職業瓶頸期的時候,會選擇轉編程方向發展。你是否已經意識這是你人生中的一個重要轉機?能不能抓住這個時代的機遇,就在於你對大數據信息的應用和獲取。而如何成為大數據時代的弄潮兒,掌握當下最緊缺的軟體技能是關鍵!