代码文件上传删除等

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:WindowsSystem32driversetc 添加 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是文件系统,用来存储文件,通过目录树来定位文件,它是分布式的,适合一次写入,多次读出,不支持文件修改
具有高容错性,高扩展性,高性能。

    
            
                
                    
                
            




    
        
    
    
    






















原文地址:https://www.cnblogs.com/qu125-tf/p/12080934.html