Hadoop 核心-HDFS基础
目录
hadoop集群启动
cd /export/servers/hadoop-2.7.5/
sbin/start-dfs.sh
sbin/start-yarn.sh
sbin/mr-jobhistory-daemon.sh start historyserver
三个端口查看界面
http://node01:50070/explorer.html#/ 查看hdfs
http://node01:8088/cluster 查看yarn集群
http://node01:19888/jobhistory 查看历史完成的任务
HDFS 的架构
HDFS是一个主/从(Mater/Slave)体系结构
HDFS由四部分组成,HDFS Client、NameNode、DataNode和Secondary NameNode。
HDFS Client: 就是客户端。
文件切分。文件上传 HDFS 的时候,Client 将文件切分成 一个一个的Block,然后进行存
储。
与 NameNode 交互,获取文件的位置信息。
与 DataNode 交互,读取或者写入数据。
Client 提供一些命令来管理 和访问HDFS,比如启动或者关闭HDFS。
NameNode:就是 master,它是一个主管、管理者。
- 管理 HDFS 的名称空间
- 管理数据块(Block)映射信息
- 配置副本策略
- 处理客户端读写请求。
DataNode:就是Slave。NameNode 下达命令,DataNode 执行实际的操作。
- 存储实际的数据块。
- 执行数据块的读/写操作。
Secondary NameNode:并非 NameNode 的热备。当NameNode 挂掉的时候,它并不能马上替换 NameNode 并提供服务。
- 辅助 NameNode,分担其工作量。
- 定期合并 fsimage和fsedits,并推送给NameNode。
- 在紧急情况下,可辅助恢复 NameNode。
hdfs的命令行使用
-
ls
格式: hdfs dfs -ls URI 作用:类似于Linux的ls命令,显示文件列表 eg. hdfs dfs -ls /
-
lsr
格式 : hdfs dfs -lsr URI 作用 : 在整个目录下递归执行ls, 与UNIX中的ls-R类似 eg. hdfs dfs -lsr /
-
mkdir
格式 : hdfs dfs [-p] -mkdir <paths> 作用 : 以<paths>中的URI作为参数,创建目录。使用-p参数可以递归创建目录
-
put
格式 : hdfs dfs -put <localsrc > ... <dst> 作用 : 将单个的源文件src或者多个源文件srcs从本地文件系统拷贝到目标文件系统中(<dst>对应的路径)。也可以从标准输入中读取输入,写入目标文件系统中 hdfs dfs -put /rooot/a.txt /dir1
-
moveFromLocal
格式: hdfs dfs -moveFromLocal <localsrc> <dst> 作用: 和put命令类似,但是源文件localsrc拷贝之后自身被删除 hdfs dfs -moveFromLocal /root/install.log /
-
get
格式 hdfs dfs -get [-ignorecrc ] [-crc] <src> <localdst> 作用:将文件拷贝到本地文件系统。 CRC 校验失败的文件通过-ignorecrc选项拷贝。 文件和CRC校验和可以通过-CRC选项拷贝 hdfs dfs -get /install.log /export/servers
-
mv
格式 : hdfs dfs -mv URI <dest> 作用: 将hdfs上的文件从原路径移动到目标路径(移动之后文件删除),该命令不能跨文件系统 hdfs dfs -mv /dir1/a.txt /dir2
-
rm
格式: hdfs dfs -rm [-r] 【-skipTrash】 URI 【URI 。。。】 作用: 删除参数指定的文件,参数可以有多个。 此命令只删除文件和非空目录。 如果指定-skipTrash选项,那么在回收站可用的情况下,该选项将跳过回收站而直接删除文件;否则,在回收站可用时,在HDFS Shell 中执行此命令,会将文件暂时放到回收站中。 hdfs dfs -rm -r /dir1
-
cp
格式: hdfs dfs -cp URI [URI ...] <dest> 作用: 将文件拷贝到目标路径中。如果<dest> 为目录的话,可以将多个文件拷贝到该目录 下。 -f 选项将覆盖目标,如果它已经存在。 -p 选项将保留文件属性(时间戳、所有权、许可、ACL、XAttr)。 hdfs dfs -cp /dir1/a.txt /dir2/b.txt
-
cat
hdfs dfs -cat URI [uri ...] 作用:将参数所指示的文件内容输出到stdout hdfs dfs -cat /install.log
-
chmod
格式: hdfs dfs -chmod [-R] URI[URI ...] 作用: 改变文件权限。如果使用 -R 选项,则对整个目录有效递归执行。使用这一命令的用户 必须是文件的所属用户,或者超级用户。 hdfs dfs -chmod -R 777 /install.log
-
chown
格式: hdfs dfs -chmod [-R] URI[URI ...] 作用: 改变文件的所属用户和用户组。如果使用 -R 选项,则对整个目录有效递归执行。使用 这一命令的用户必须是文件的所属用户,或者超级用户。 hdfs dfs -chown -R hadoop:hadoop /install.log
-
appendToFile
格式: hdfs dfs -appendToFile <localsrc> ... <dst> 作用: 追加一个或者多个文件到hdfs指定文件中.也可以从命令行读取输入. hdfs dfs -appendToFile a.xml b.xml /big.xml
HDFs JAVA API操作
hdfs的URL访问,输入输出
@Test
public void urlHdfs() throws IOException {
// 1. 注册HDFs的url
// 在该处,思考括号内应该放置的对象:URLStreamHandlerFactory fac
// 查看一个类的所有子类以及子类的子类并以层级关系显示
// URLStreamHandlerFactory 实例用于从协议名称构造流协议处理程序。
URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
// 2. 获取hdfs文件的输入流
InputStream inputStream=new URL("hdfs://node01:8020/a.txt").openStream();
// 3. 获取本地文件的输出流
FileOutputStream OutputStream=new FileOutputStream(new File("D:\\hello.txt"));
// 4. 实现文件的拷贝
IOUtils.copy(inputStream, OutputStream);
// 5. 关流
IOUtils.closeQuietly(inputStream);
IOUtils.closeQuietly(OutputStream);
}
获取hdfs文件系统的四种主要方式
@Test
public void getFileSystem4() throws IOException, URISyntaxException {
// 1: 获取指定的文件系统
FileSystem fileSystem=FileSystem.newInstance(new URI("hdfs://node01:8020"),new Configuration());
// 2: 输出
System.out.println(fileSystem);
}
@Test
public void getFileSystem3() throws IOException {
// 1: 创建 Configuration 对象
// Configuration 封装了客户端或者服务器端的配置,设置对应的文件系统类型,使用 FileSystem.get方法获取对应的文件系统对象
//进而可对该文件系统进行操作
Configuration configuration=new Configuration();
// 2: 设置文件系统类型
configuration.set("fs.defaultFS", "hdfs://node01:8020");
// 3: 获取指定的文件系统
FileSystem fileSystem=FileSystem.newInstance(configuration);
// 4: 输出
System.out.println(fileSystem);
}
@Test
public void getFileSystem2() throws IOException, URISyntaxException {
// 1: 获取指定的文件系统
FileSystem fileSystem=FileSystem.get(new URI("hdfs://node01:8020"),new Configuration());
// 2: 输出
System.out.println(fileSystem);
}
@Test
public void getFileSystem1() throws IOException {
// 1: 创建Configuration 对象
Configuration configuration=new Configuration();
// 2: 设置文件系统类型
configuration.set("fs.defaultFS", "hdfs://node01:8020");
// 3: 获取指定的文件系统
FileSystem fileSystem=FileSystem.get(configuration);
// 4: 输出
System.out.println(fileSystem);
}
HDFs文件的遍历
@Test
public void listFiles() throws URISyntaxException, IOException {
// 1. 获取FileSystem 实例
FileSystem fileSystem=FileSystem.get(new URI("hdfs://node01:8020"),new Configuration());
// 2. 调用方法listFiles 获取/目录下所有的文件信息
RemoteIterator<LocatedFileStatus> iterator=fileSystem.listFiles(new Path("/"),true);
// 3. 遍历迭代器
while(iterator.hasNext()){
LocatedFileStatus fileStatus=iterator.next();
System.out.println("路径:"+(fileStatus.getPath())+"---"+fileStatus.getPath().getName());
BlockLocation[] blockLocations=fileStatus.getBlockLocations();
System.out.println("分成多少块:"+blockLocations.length);
}
}
HDFs上创建文件夹
@Test
public void mkdirs() throws Exception{
// 1. 获取FileSystem实例
FileSystem fileSystem=FileSystem.get(new URI("hdfs://node01:8020"),new Configuration());
// 2. 创建文件夹
boolean mkdirs= fileSystem.mkdirs(new Path("/hello/123"));
fileSystem.create(new Path("/hello/123/a.txt"));
System.out.println(mkdirs);
// 3.
fileSystem.close();
}
文件下载1
@Test
public void downloadFile1() throws URISyntaxException, IOException {
// 1. 获取FileSystem
FileSystem fileSystem=FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
// 2. 获取hdfs的输入流
FSDataInputStream inputStream=fileSystem.open(new Path("/a.txt"));
// 3. 获取本地路径的输出流
OutputStream outputStream=new FileOutputStream("D://a.txt");
// 4. 文件的拷贝
IOUtils.copy(inputStream, outputStream);
// 5. 关闭流
IOUtils.closeQuietly(inputStream);
IOUtils.closeQuietly(outputStream);
fileSystem.close();
}
文件下载2
@Test
public void downloadFile2() throws URISyntaxException, IOException {
// 1. 获取FileSystem
FileSystem fileSystem=FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
// 2. 文件的拷贝
fileSystem.copyToLocalFile(new Path("/a.txt"),new Path("D://b.txt"));
// 3. 关闭文件系统
fileSystem.close();
}
文件上传
@Test
public void uploadFile() throws URISyntaxException, IOException {
// 1. 获取FileSystem
FileSystem fileSystem=FileSystem.get(new URI("hdfs://node01:8020"), new Configuration());
// 2. 文件的拷贝
fileSystem.copyFromLocalFile(new Path("D://b.txt"),new Path("/b.txt"));
// 3. 关闭文件系统
fileSystem.close();
}
小文件合并上传
@Test
public void mergeFile() throws URISyntaxException, IOException, InterruptedException {
//Configuration 封装了客户端或者服务器端的配置,设置对应的文件系统类型,使用FileSystem.get方法获取对应的文件系统对象
//进而可对该文件系统进行操作
//1. 获取FileSystem 分布式文件系统
FileSystem fileSystem=FileSystem.get(new URI("hdfs://node01:8020"),new Configuration(),"root");
//2. 获取hdfs大文件的输出流
FSDataOutputStream outputStream=fileSystem.create(new Path("/big.txt"));
//3. 获取本地文件系统
LocalFileSystem localFileSystem=FileSystem.getLocal(new Configuration());
//4. 通过本地文件系统获取文件列表,为一个集合
FileStatus[] fileStatus=localFileSystem.listStatus(new Path("D://input"));
//5. 遍历每个文件,获取每个文件的输入流
for(FileStatus file:fileStatus){
FSDataInputStream inputStream=localFileSystem.open(file.getPath());
//6. 将小文件的数据复制到大文件
IOUtils.copy(inputStream, outputStream);
IOUtils.closeQuietly(inputStream);
}
IOUtils.closeQuietly(outputStream);
localFileSystem.close();
fileSystem.close();
}
谋定而后动,知止而有得