代碼文件上傳刪除等

package com.jinghang.hdfsclient;


import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.mapred.IFileInputStream;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

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

public class HdfsClient {
private Configuration configuration;
private FileSystem fileSystem;

@Before
public void init() throws IOException, InterruptedException {
System.out.println("即將開始執行");
this.configuration=new Configuration();
this.fileSystem =FileSystem.get(
//URI:統一資源標識符(包含URN、URL)
//URL:統一資源定位符
//URN:統一資源名稱
URI.create("hdfs://xiaokai01:9000"),
configuration,
"xiaokai"

);
}
@Test
public void put () throws IOException {
//獲取一個hdfs的文件抽象對象(ctrl+alt+v)
// Configuration configuration = new Configuration();
// FileSystem fileSystem = FileSystem.get(
// //URI:統一資源標識符(包含URN、URL)
// //URL:統一資源定位符
// //URN:統一資源名稱
// URI.create("hdfs://hadoop01:9000"),
// configuration,
// "jinghang"
// );//alt+enter
//將本地文件上傳至hdfs
//本地文件路徑
Path localPath = new Path("C:\\develop");
//hdfs文件路經
Path hdfslPath = new Path("/log100/log.txt");

//將本地文件上傳至hdfs經過copyFromLocalFile方法
fileSystem.copyFromLocalFile(localPath,hdfslPath);
fileSystem.close();
}
@Test
public void mkdir() throws IOException {
Path class222 = new Path("/class222");
boolean b = fileSystem.mkdirs(class222);
if(b){
System.out.println("文件建立成功");
}
else{
System.out.println("文件建立失敗");
}
}
@Test
public void rename() throws IOException {
//獲取須要重命名的文件的路徑
Path hdfsPath = new Path("/class222");

//重命名的名稱
Path newPath = new Path("/class999");

boolean b = fileSystem.rename(hdfsPath, newPath);

if (b){
System.out.println("文件名修改爲功");
}
else {
System.out.println("文件名修改失敗");
}
}
//文件追加
@Test
public void append() throws IOException {
//要追加的文件路徑(hdfs)

Path hdfsPath = new Path("/log200/log.txt");

// //本地文件的路徑
String localPath = "C:\\develop";
//hdfs的文件輸出流
FSDataOutputStream append = fileSystem.append(hdfsPath, 1024);
//本地文件的輸入流
FileInputStream inputStream = new FileInputStream(localPath);

IOUtils.copyBytes(inputStream,append,1024,true);

//手動關閉輸入流和輸出流
inputStream.close();
append.close();
}
//刪除文件
@Test
public void delete() throws IOException {
//指定須要刪除的文件的路徑
Path hdfsPath = new Path("/log100");

boolean b = fileSystem.delete(hdfsPath, true);
if(b){
System.out.println("文件刪除成功");
}else {
System.out.println("文件刪除失敗");
}
}
//讀取文件和文件夾
@Test
public void readFileAndDir() throws IOException {
//listStatus:讀取文件和文件夾
Path hdfsPath = new Path("/");
FileStatus[] fileStatuses = fileSystem.listStatus(hdfsPath);
for (FileStatus fileStatus : fileStatuses) {
if(fileStatus.isDirectory()){
System.out.println("是一一個文件夾");
System.out.println(fileStatus.getPath()); //路徑
System.out.println(fileStatus.getLen()); //文件長度
System.out.println(fileStatus.getPermission()); //文件的權限
System.out.println(fileStatus.getOwner()); // 文件夾的全部者
System.out.println(fileStatus.getGroup()); //文件夾的所屬組
}
else {
System.out.println("是一個文件");
System.out.println(fileStatus.getPath());//路徑
System.out.println(fileStatus.getPath().getName()); //名稱
System.out.println(fileStatus.getReplication()); //副本數
System.out.println(fileStatus.getLen());//文件長度
System.out.println(fileStatus.getBlockSize()); //塊大小
}
}
}
@Test
public void readFile() throws IOException {
//listFiles:只讀取文件
Path hdfsPath = new Path("/");

RemoteIterator<LocatedFileStatus> locatedFileStatusRemoteIterator = fileSystem.listFiles(hdfsPath, true);
while (locatedFileStatusRemoteIterator.hasNext()){
LocatedFileStatus next = locatedFileStatusRemoteIterator.next();
System.out.println(next.getBlockSize());
System.out.println(next.getLen());
System.out.println(next.getReplication());
System.out.println(next.getPath().getName());
System.out.println(next.getPermission());

BlockLocation[] blockLocations = next.getBlockLocations();
for (BlockLocation blockLocation : blockLocations) {
String[] hosts = blockLocation.getHosts();
System.out.println("塊所在的位置");
for (String host : hosts) {
System.out.println(host);
}
}
}
}
@After
public void after() throws IOException {
fileSystem.close();
System.out.println("執行完畢");
}

}
周總結
hadoop搭建
#從0搭建僞分佈式
root用戶
1.準備虛擬機
2.修改靜態ip
    DEVICE="eth0"
    BOOTPROTO="static"
    HWADDR="00:0C:29:A2:3B:C9"
    IPV6INIT="yes"
    NM_CONTROLLED="yes"
    ONBOOT="yes"
    TYPE="Ethernet"
    UUID="0202b9d4-9762-4348-aa0c-7ce122f50d9e"
    #IP地址
    IPADDR=192.168.1.111 
    #網關
    GATEWAY=192.168.1.2
    #域名解析器
    DNS1=114.114.114.114
    DNS2=8.8.8.8

    service network restart  重啓一下
    ifconfig                 查看IP是否變化,沒有變化重啓

 修改hostname主機
    vim /etc/sysconfig/network
        NETWORKING=yes
        HOSTNAME=hadoop01 (主機名)
        
        hostname主機重啓後生效
3. 添加用戶
    useradd jinghang
    passwd  jinghang
    
4.建立目錄module(解壓的安裝包)、software(壓縮的安裝包)
    mkdir /opt/module /opt/software
    
    修改文件所屬主和組
    chown -R jinghang:jinghang /opt/module  /opt/software
    
5.給普通用戶添加sudo權限
    vim /etc/sudoers
    在93行添加
    jinghang        ALL=(ALL)       NOPASSWD:ALL

6.添加主機和IP的映射關係
    vim /etc/hosts
    靜態ip        主機名
    192.168.1.111 hadoop01
    192.168.1.112 hadoop02
    192.168.1.113 hadoop03
    
7.關機拍快照(conf_step1)

普通用戶操做

8.安裝jdk和hadoop
    將jdk-8u144-linux-x64.tar和hadoop-2.7.2.tar上傳到/opt/software(打開xshell鏈接SFTP拖動文件到/opt/software)
    
    安裝jdk
    1.解壓jdk
        tar -zxvf jdk-8u144-linux-x64.tar.gz -C /opt/module/
        
    2.配置環境變量
        sudo vim /etc/profile
        
            #JAVA_HOME
            export JAVA_HOME=/opt/module/jdk1.8.0_144
            export PATH=$PATH:$JAVA_HOME/bin
        
        注意:若是以前存在java安裝包,須要先卸載
        rpm -qa | grep java 查看
        rpm -e 安裝包 --nodeps 卸載
        
    安裝hadoop
    1.解壓hadoop
        tar -zxvf hadoop-2.7.2.tar.gz -C /opt/module/
    2.配置環境變量
        sudo vim /etc/profile
            #HADOOP_HOME
            export HADOOP_HOME=/opt/module/hadoop-2.7.2
            export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
            
    激活環境變量
    source /etc/profile
    
    檢查是否安裝成功
    java -version
    java version "1.8.0_144"
    Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
    Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
    
    hadoop version
    Hadoop 2.7.2
    Subversion Unknown -r Unknown
    Compiled by root on 2017-05-22T10:49Z
    Compiled with protoc 2.5.0
    From source with checksum d0fda26633fa762bff87ec759ebe689c
    This command was run using /opt/module/hadoop-2.7.2/share/hadoop/common/hadoop-common-2.7.2.jar
    
    僞分佈式配置
    1.添加JAVA_HOME
    hadoop-env.sh
    mapred-env.sh
    yarn-env.sh
    在以上三個文件中添加
    export JAVA_HOME=/opt/module/jdk1.8.0_144
    
    2.設置namenode節點所在的服務器地址和臨時文件的存儲目錄
    vim core-site.xml
        <!-- 指定HDFS中NameNode的地址 -->
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://本身服務器的主機名:9000</value>
        </property>

        <!-- 指定Hadoop運行時產生文件的存儲目錄 -->
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/opt/module/hadoop-2.7.2/data/tmp</value>
        </property>
        
    3.配置文件的副本數
        vim hdfs-site.xml
        
            <!-- 指定HDFS副本的數量hadoop集羣默認是3個副本 -->
            <property>
                    <name>dfs.replication</name>
                    <value>1</value>
            </property>
            
    4.配置yarn-site.xml
        vim yarn-site.xml
        
        <!-- Reducer獲取數據的方式 -->
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>

        <!-- 指定YARN的ResourceManager的地址 -->
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>本身服務器的主機名</value>
        </property>
        <!-- 日誌彙集功能使能 -->
        <property>
                <name>yarn.log-aggregation-enable</name>
                <value>true</value>
        </property>

        <!-- 日誌保留時間設置7天 -->
        <property>
                <name>yarn.log-aggregation.retain-seconds</name>
                <value>604800</value>
        </property>
        
    5.配置mapred-site.xml
        vim mapred-site.xml
        <!-- 指定MR運行在YARN上 -->
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        <!-- 歷史服務器端地址 -->
        <property>
                <name>mapreduce.jobhistory.address</name>
                <value>本身的主機名:10020</value>
        </property>
        <!-- 歷史服務器web端地址 -->
        <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>本身的主機名:19888</value>
        </property>
        
    以上配置完畢就能夠啓動集羣
    1.格式化namenode(只在集羣啓動的時候格式化一次)
        bin/hdfs namenode -format
        
        注意:不當心進行了兩次格式話(全部的節點服務都須要停掉)
        step1    rm -rf data/  logs/
        step2   bin/hdfs namenode -format
    2.啓動namenode
        sbin/hadoop-daemon.sh start namenode
    3.啓動datanode
        sbin/hadoop-daemon.sh start datanode
    4.啓動resourcemanager
        sbin/yarn-daemon.sh start resourcemanager
    5.必定要去啓動nodemanager
        sbin/yarn-daemon.sh start nodemanager
    6.開啓歷史服務
        sbin/mr-jobhistory-daemon.sh start historyserver
        
    查看你的datanode web服務(注意2.7.2:50070  3.2.1:9870)
    
    https://hadoop.apache.org/docs/r3.2.1/hadoop-project-dist/hadoop-common/ClusterSetup.html
    https://hadoop.apache.org/docs/r2.7.2/hadoop-project-dist/hadoop-common/ClusterSetup.html
    若是要使用
        主機名:50070 須要在windowns中的 C:\Windows\System32\drivers\etc 添加 hosts(主機和ip的映射關係)
    也能夠
        ip:50070
    
    查看yarn的web服務
         主機名:8088
    
    查看歷史服務器web端
        主機名:19888
        
    能夠完成以下操做:
    (a)在HDFS文件系統上建立一個input文件夾
        [jinghang@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -mkdir -p /input
    (b)將測試文件內容上傳到文件系統上
        [jinghang@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -put wcinput/wc.input /input
    (c)查看上傳的文件是否正確
        [jinghang@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -ls  /input
        [jinghang@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -cat /input/wc.input
    (d)運行MapReduce程序
        [jinghang@hadoop101 hadoop-2.7.2]$ bin/hadoop jar
        share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /input  /output
    (e)查看輸出結果
        命令行查看:
        [jinghang@hadoop101 hadoop-2.7.2]$ bin/hdfs dfs -cat /output/*
     2.關於hdfs的優缺點,定義
hdfs是文件系統,用來存儲文件,經過目錄樹來定位文件,它是分佈式的,適合一次寫入,屢次讀出,不支持文件修改具備高容錯性,高擴展性,高性能。
相關文章
相關標籤/搜索