学习笔记(三)-----熟练掌握HDFS的Shell访问和JavaAPI访问

shell访问

将在 /middle 目录下建立目录 weibo

hadoop fs -mkdir /middle/weibo
上传文件 weibo.txt 到 weibo 目录下
hadoop fs -put weibo.txt /middle/weibo/
hadoop fs -copyFromLocal weibo.txt /middle/weibo/
查看 weibo.txt 文件内容
hadoop fs -text /middle/weibo/weibo.txt
hadoop fs -cat /middle/weibo/weibo.txt
hadoop fs -tail /middle/weibo/weibo.txt
把 weibo.txt 文件复制到本地
hadoop fs -get /middle/weibo/weibo.txt
hadoop fs -copyToLocal /middle/weibo/weibo.txt
删除 weibo.txt 文件
hadoop fs -rm /middle/weibo/weibo.txt
删除/middle/weibo文件夹
hadoop fs -rmr /middle/weibo
显示 /middle 目录下的文件
hadoop fs -ls /middle
两个 HDFS 集群之间传输数据,默认情况下 distcp 会跳过目标路径下已经存在的文件。
hadoop distcp hdfs://cloud004:9000/weather hdfs://cloud0042:9000/middle
两个 HDFS 集群之间传输数据,覆盖现有的文件使用overwrite。
hadoop distcp -overwrite hdfs://cloud004:9000/weather hdfs://cloud0042:9000/middle
两个 HDFS 集群之间传输数据,更新有改动过的文件使用update。
hadoop distcp -update hdfs://cloud004:9000/weather hdfs://cloud0042:9000/middle
查看正在运行的 Job
hadoop job -list
关闭正在运行的 Job
hadoop job -kill job_1432108212572_0001
检查 HDFS 块状态,查看是否损坏
hadoop fsck /
检查 HDFS 块状态,并删除损坏的块。
hadoop fsck / -delete
检查 HDFS 状态,包括 DataNode 信息。
hadoop dfsadmin -report
Hadoop 进入安全模式
hadoop dfsadmin -safemode enter
Hadoop 离开安全模式
hadoop dfsadmin -safemode leave
平衡集群中的文件
sbin/start-balancer.sh

 javaAPI访问

package com.hadoop.base;

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

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hdfs.DistributedFileSystem;
import org.apache.hadoop.hdfs.protocol.DatanodeInfo;
public class Test {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        mkdir();
        rmdir();
        ListAllFile();
        copyToHDFS();
        getFile();
        getHDFSNodes();
        getFileLocal();
    }
    
    //获取文件系统
    public static FileSystem getFileSystem() throws IOException, URISyntaxException {
            
        //读取配置文件
        Configuration conf = new Configuration();
        
        //返回默认文件系统  如果在 Hadoop集群下运行,使用此种方法可直接获取默认文件系统
        //FileSystem fs = FileSystem.get(conf);      
        
        //指定的文件系统地址
        URI uri = new URI("hdfs://master:9000");
        //返回指定的文件系统    如果在本地测试,需要使用此种方法获取文件系统
        FileSystem fs = FileSystem.get(uri,conf); 
        
        return fs;
    }
    
    //创建文件目录
    public static void mkdir() throws Exception {
            
        //获取文件系统
        FileSystem fs = getFileSystem();
        
        //创建文件目录
        fs.mkdirs(new Path("hdfs://master:9000/middle/weibo"));
        
        //释放资源
        fs.close();
    }
    
    //删除文件或者文件目录
    public static void rmdir() throws Exception {
            
        //返回FileSystem对象
        FileSystem fs = getFileSystem();
        
        //删除文件或者文件目录  delete(Path f) 此方法已经弃用
        fs.delete(new Path("hdfs://master:9000/middle/weibo"),true);
        
        //释放资源
        fs.close();
    }//获取目录下的所有文件
    public static void ListAllFile() throws IOException, URISyntaxException{
        
        //返回FileSystem对象
        FileSystem fs = getFileSystem();
        
        //列出目录内容
        FileStatus[] status = fs.listStatus(new Path("hdfs://master:9000/middle/weibo/"));
        
        //获取目录下的所有文件路径
        Path[] listedPaths = FileUtil.stat2Paths(status);
        
        //循环读取每个文件
        for(Path p : listedPaths){
            
            System.out.println(p);
            
        }
        //释放资源
        fs.close();
    }
    
    //文件上传至 HDFS
    public static void copyToHDFS() throws IOException, URISyntaxException{
            
        //返回FileSystem对象
        FileSystem fs = getFileSystem();
        
        //源文件路径是Linux下的路径,如果在 windows 下测试,需要改写为Windows下的路径,比如D://hadoop/data/weibo.txt
        Path srcPath = new Path("/home/hadoop/data/weibo.txt");
        
        // 目的路径
        Path dstPath = new Path("hdfs://master:9000/middle/weibo");
        
        //实现文件上传
        fs.copyFromLocalFile(srcPath, dstPath);
        
        //释放资源
        fs.close();
    }
    
    //从 HDFS 下载文件
    public static void getFile() throws IOException, URISyntaxException{
            
        //返回FileSystem对象
        FileSystem fs = getFileSystem();
        
        //源文件路径
        Path srcPath = new Path("hdfs://master:9000/middle/weibo/weibo.txt");
        
        //目的路径是Linux下的路径,如果在 windows 下测试,需要改写为Windows下的路径,比如D://hadoop/data/
        Path dstPath = new Path("/home/hadoop/data/");
        
        //下载hdfs上的文件
        fs.copyToLocalFile(srcPath, dstPath);
        
        //释放资源
        fs.close();
    }
    
    //获取 HDFS 集群节点信息
    public static void getHDFSNodes() throws IOException, URISyntaxException{
            
        //返回FileSystem对象
        FileSystem fs = getFileSystem();
        
        //获取分布式文件系统
        DistributedFileSystem hdfs = (DistributedFileSystem)fs;
        
        //获取所有节点
        DatanodeInfo[] dataNodeStats = hdfs.getDataNodeStats();
        //循环打印所有节点
        for(int i=0;i< dataNodeStats.length;i++){
            System.out.println("DataNode_"+i+"_Name:"+dataNodeStats[i].getHostName());
        }
    }
    
    //查找某个文件在 HDFS 集群的位置
    public static void getFileLocal() throws IOException, URISyntaxException{
            
        //返回FileSystem对象
        FileSystem fs = getFileSystem();
        
        //文件路径
        Path path = new Path("hdfs://master:9000/middle/weibo/weibo.txt");
        
        //获取文件目录
        FileStatus filestatus = fs.getFileStatus(path);
        //获取文件块位置列表
        BlockLocation[] blkLocations = fs.getFileBlockLocations(filestatus, 0, filestatus.getLen());
        //循环输出块信息
        for(int i=0;i< blkLocations.length;i++){
            String[] hosts = blkLocations[i].getHosts();
            System.out.println("block_"+i+"_location:"+hosts[0]);
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/zhoupp/p/10807020.html
今日推荐