一:HDFS 的 启动命令:
在/home/自己目录/hadoop-2.6.0-cdh5.15.1/sbin 下
./start-dfs.sh ----启动 Hadoop HDFS
启动后 输入 jps 可以看到 以下几个进程 代表已经启动成功
NameNode 进程
DataNode 进程
SecondaryNameNode 进程
./stop-dfs.sh ----停止 Hadoop HDFS
还可以通过命名启动每个单进程
./hadoop-daemons.sh start namenode ----启动namenode进程
./hadoop-daemons.sh start datanode ----启动dataNode进程
./hadoop-daemons.sh start secondarynamenode ----启动SecondaryNameNode 进程
因此:
start-dfs.sh 等于以上三个启动 命令
关闭同理
启动成功后 可以通过 50070 默认端口
http://IP:50070/explorer.html //查看hadoop 后台web
二:HDFS 的命令
命令格式:hadoop fs [generic options]
直接输入 hadoop fs 可以查看 命令参数
以下是一些较常用的 命令 很多都和Linux 的命令很相似
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...] 查看文件内容
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>] :将本地文件上传到目的路径 同 put
[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-count [-q] [-h] [-v] [-x] <path> ...]
[-cp [-f] [-p | -p[topax]] <src> ... <dst>] 同linux cp移动文件 eg: hadoop fs -cp /README.txt /hdfs-test/README.txt.bak 复制根目录下README.txt 文件到 /hdfs-test文件夹中并重命名为README.txt.bak
[-df [-h] [<path> ...]]
[-du [-s] [-h] [-x] <path> ...]
[-find <path> ... <expression> ...]
[-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] :将hadoop 的文件拿到本地 eg: hadoop fs -get /README.txt . 将/ 根目录下的README.txt 文件拿到当前 目录下 注意文件名 后面有空格和点
[-getmerge [-nl] <src> <localdst>] 将文件内容合并成下载下来 eg: hadoop fs -getmerge /hdfs-test ./t.txt 将hadooop 上 /hdfs-test 目录下的文件 合并成t.txt 并下载在本地根目录下
[-help [cmd ...]]
[-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [<path> ...]]
[-mkdir [-p] <path> ...] : 同linux mkdir 创建文件夹 eg: hadoop fs -mkdir /hdfs-test 在根目录下创建hdfs-test 文件夹
[-moveFromLocal <localsrc> ... <dst>] :将本地文件移动拷贝到目的路径 ,原路径文件不存在
[-moveToLocal <src> <localdst>]
[-mv <src> ... <dst>] : 同linux mv 移动文件 eg: hadoop fs -mv /README.txt /hdfs-test 移动根目录下README.txt 文件到 /hdfs-test文件夹中
[-put [-f] [-p] [-l] <localsrc> ... <dst>] :将本地文件上传到目的路径,原路径文件还存在 例如: hadoop fs -put README.txt / 将当前目录的README.txt 文件 上传到 / 根目录下
[-rm [-f] [-r|-R] [-skipTrash] <src> ...] 同linux rm 删除文件 eg: hadoop fs -rm t.txt 删除t.txt 文件 hadoop fs -rm -r /hdfs-test 删除 hdfs-test 文件夹
[-rmdir [--ignore-fail-on-non-empty] <dir> ...] 删除为空的文件夹
[-tail [-f] <file>]
[-test -[defsz] <path>]
[-text [-ignoreCrc] <src> ...] 查看文件内容
[-touchz <path> ...]
最常用的命令
hadoop fs -ls / --查看目录
hadoop fs -put --上传
hadoop fs -copyFromLocal --从本地拷贝
hadoop fs -moveFromLocal --从本地移动
hadoop fs -cat --查看文件内容
hadoop fs -text --查看文件内容
hadoop fs -get --下载
hadoop fs -mkdir --创建文件夹
hadoop fs -mv --移动/改名
hadoop fs -getmerge --合并
hadoop fs -rm --删除
hadoop fs -rmdir --删除空的文件夹
hadoop fs -rm -r --递归删除
三 :HDFS 文件上传,读取的流程
四:HDFS API 操作代码
package com.imooc.bigdata.hadoop.hdfs;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.BlockLocation;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocatedFileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.RemoteIterator;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.util.Progressable;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class HDFSApp {
public static final String HDFS_PATH = "hdfs://hadoop000:8020";
FileSystem fileSystem = null;
Configuration conf = null;
@Before
public void setUp() throws Exception{
System.out.println("------setUp-------");
conf = new Configuration();
conf.set("dfs.replication", "1");//api 不设置的话 默认取jar 包中 hdfs-default.xml 中的值
fileSystem = FileSystem.get(new URI(HDFS_PATH), conf, "hadoop");
}
/**
* 创建HDFS文件夹
* @throws Exception
*/
@Test
public void mkdir() throws Exception {
fileSystem.mkdirs(new Path("/hdfsapi/myTest"));
}
/**
* 查看HDFS 文件
* @throws Exception
*/
@Test
public void text() throws Exception {
FSDataInputStream in = fileSystem.open(new Path("/README.txt"));
IOUtils.copyBytes(in, System.out, 1024);
}
/**
* 创建HDFS 文件并写入内容
* @throws Exception
*/
@Test
public void create() throws Exception {
//FSDataOutputStream out = fileSystem.create(new Path("/hdfsapi/myTest/test.txt"));
FSDataOutputStream out = fileSystem.create(new Path("/hdfsapi/myTest/b.txt"));
out.writeUTF("hello myTest");
out.flush();
out.close();
}
/**
* 测试HDFS副本
* @throws Exception
*/
@Test
public void testReplication() throws Exception {
System.out.println(conf.get("dfs.replication"));
}
/**
* 对HDFS文件 重命名
* @throws Exception
*/
@Test
public void rename() throws Exception {
Path oldPath = new Path("/hdfsapi/myTest/test.txt");
Path newPath = new Path("/hdfsapi/myTest/a.txt");
boolean result = fileSystem.rename(oldPath, newPath);
System.out.println(result);
}
/**
* 本地上传文件到hdfs
* @throws Exception
*/
@Test
public void copyFromLocalFile() throws Exception {
Path src = new Path("E:\\hello.txt");
Path dst = new Path("/hdfsapi/myTest");
fileSystem.copyFromLocalFile(src, dst);;
}
/**
* 拷贝大数据文件到HDFS 带进度条
* @throws Exception
*/
@Test
public void copyFromLocalBigFile() throws Exception {
InputStream in = new BufferedInputStream(new FileInputStream(new File("本地文件路径")));
FSDataOutputStream out =fileSystem.create(new Path("/hdfsapi/myTest/distname.tgz"), new Progressable() {
@Override
public void progress() {
// TODO Auto-generated method stub
System.out.println(".");
}
});
IOUtils.copyBytes(in, out, 4096);
}
/**
* 从HDFS 下载文件到本地
* @throws Exception
*/
@Test
public void copyToLocalFile() throws Exception {
Path src = new Path("/hdfsapi/myTest/a.txt");
Path dst = new Path("D:\\");
//fileSystem.copyToLocalFile(src, dst);//win 下报空指针错误 下载的文件为空
/**
* 第一种 实现
* 第一个参数 delSrc:是否删除掉源目录
* 最后一个参数RawLocalFileSystem:是否使用本地文件系统
*可能在win下就是要开启使用本地文件系统吧
*/
fileSystem.copyToLocalFile(false,src,dst,true);
/**
* 第二种 用流的形式
*/
FSDataInputStream in = fileSystem.open(new Path("/hdfsapi/myTest/a.txt"), 4096);
OutputStream out = new BufferedOutputStream(new FileOutputStream(new File("D:\\")));
IOUtils.copyBytes(in, out, 4096);
/**
* 第三种 解决win
* 针对windows 通过HADOOP-API提交Linux系统异常,报winutils.exe缺失及找不到NativeIO,IO异常问题
* 第一步:
* 下载winutils.exe 放到根目录下,任意hadoop/bin/文件夹下,在不添加windows系统环境变量情况下,
* 针对JRM环境变量,添加
* 第二步:
* 在maven 仓库李找到org.apache.hadoop.hadoop-common 下,CDH版本文件夹里hadoop-common-${version}.jar
* 在项目里创建包路径“org.apache.hadoop.io.nativeio”,在这个路径下,创建类NativeIO,并反编译jar包里,这个类内容,拷贝进来
* 或者将jar包这个类源文件拷贝进来
* 修改类NativeIO里,access 方法
* public static boolean access() throws IOException{
* return true;
* //return access(path,desiredAccess.accessRight());
* }
*
* 在调用方法前 加上
* System.setProperty("hadoop.home.dir","E:\\项目路径\\winutil");
*/
}
/**
* 查看HDSF 目标文件夹下 所有文件列表
* @throws Exception
*/
@Test
public void listFile() throws Exception {
FileStatus[] files = fileSystem.listStatus(new Path("/hdfsapi/test"));
for(FileStatus file : files) {
String isDir = file.isDirectory() == true ?"文件夹":"文件";
String permission = file.getPermission().toString();
long len = file.getLen();
short replication = file.getReplication();
String path = file.getPath().toString();
System.out.println(isDir + "\t"+permission +"\t"+len +"\t" +replication+"\t"+path);
}
}
/**
* 查看HDSF 目标文件夹下 所有文件列表 递归包含的文件夹
* @throws Exception
*/
@Test
public void listFileRecursive() throws Exception {
RemoteIterator<LocatedFileStatus> files = fileSystem.listFiles(new Path("/hdfsapi/test"), true);
while(files.hasNext()) {
LocatedFileStatus file = files.next();
String isDir = file.isDirectory() == true ?"文件夹":"文件";
String permission = file.getPermission().toString();
long len = file.getLen();
short replication = file.getReplication();
String path = file.getPath().toString();
System.out.println(isDir + "\t"+permission +"\t"+len +"\t" +replication+"\t"+path);
}
}
/**
* 获取HDFS 文件的块信息
* @throws Exception
*/
@Test
public void getFileBlockLocations() throws Exception {
FileStatus fileStatus = fileSystem.getFileStatus(new Path("/jdk-8u91-linux-x64.tar.gz"));
BlockLocation[] blocks =fileSystem.getFileBlockLocations(fileStatus, 0, fileStatus.getLen());
for(BlockLocation block : blocks) {
for(String name : block.getNames()) {
System.out.println(name + " : " + block.getOffset() + " : "
+ block.getLength());
}
}
}
/**
* 删除HDFS 文件
* @throws Exception
*/
@Test
public void delete() throws Exception {
boolean result= fileSystem.delete(new Path("/hdfsapi/myTest"),true);//第二参数为是否递归删除
System.out.println(result);
}
@After
public void tearDown() {
conf = null;
fileSystem = null;
System.out.println("------tearDown-------");
}
/*
* HDFS基本访问方式
*
public static void main(String[] args) throws IOException, InterruptedException, URISyntaxException {
Configuration conf = new Configuration();
FileSystem fileSystem = FileSystem.get(new URI("hdfs://hadoop000:8020"), conf, "hadoop");
Path path = new Path("/hdfsapi/myTest");
boolean resFlag = fileSystem.mkdirs(path);
System.out.println(resFlag);
}*/
}
使用的Hadoop相关版本:CDH
CDH相关软件包下载地址:http://archive.cloudera.com/cdh5/cdh/5/
Hadoop使用版本:hadoop-2.6.0-cdh5.15.1
Hadoop下载:wget http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.15.1.tar.gz