指令:
在HDFS上创建文件夹:
hdfs dfs -mkdir /bigdata
上传本地文件到HDFS:
hdfs dfs -put /root/data/xxx.txt /bigdata
使用java -jar 实现文件上传/下载:
java -jar /root/data/xxx.jar /opt/xxxxxx.txt
使用hdfs -jar 实现文件上传/下载:
hdfs -jar /root/data/xxx.jar /opt/xxxxxx.txt
使用yarn -jar 实现文件上传/下载:
yarn -jar /root/data/xxx.jar /opt/xxxxxx.txt
操作
将Hadoop环境配置到Windows。
创建Maven项目,使用Java编写HDFS的API
package com.cssl.bigdata6;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class HdfsJavaAPI {
public static void main(String[] args) {
try {
//new HdfsJavaAPI().getFileFromHDFS();
//java -jar HdfsJavaAPI /addr/xxx.txt
new HdfsJavaAPI().getFileFromHDFS(args[0]);
} catch (IOException e) {
e.printStackTrace();
}
}
//上传到hdfs
public void putFileFromLocal() throws IOException {
Configuration hdfs_conf = new Configuration();
hdfs_conf.set("fs.default.name","hdfs://huangyongchang:8020");
hdfs_conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fs = null;
FileInputStream fis = null;
FSDataOutputStream fos = null;
try {
// 1、获取文件操作类
fs = FileSystem.get(hdfs_conf);
//2、读入本地数据进内存
fis = new FileInputStream("D:\\song.txt");
//3、写出内存数据至hdfs
fos = fs.create(new Path("/abc.txt"));
//4、输入流对接输出流
IOUtils.copyBytes(fis,fos,1024 * 8);
} catch (IOException e) {
e.printStackTrace();
}finally {
fos.close();
fis.close();
fs.close();
}
}
//从hdfs下载到本地
public void getFileFromHDFS(String target_local) throws IOException {
Configuration hdfs_conf = new Configuration();
hdfs_conf.set("fs.default.name","hdfs://huangyongchang:8020");
hdfs_conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fs = null;
FileOutputStream fos = null;
FSDataInputStream fis = null;
try {
// 1、获取文件操作类
fs = FileSystem.get(hdfs_conf);
//2、读入HDFS数据进内存
fis = fs.open(new Path("/abc.txt"));
//3、写出内存数据至本地
fos = new FileOutputStream(target_local);
//4、输入流对接输出流
IOUtils.copyBytes(fis,fos,1024 * 8);
} catch (IOException e) {
e.printStackTrace();
}finally {
fos.close();
fis.close();
fs.close();
}
}
}
Java API运用工具类
package com.cssl.bigdata6;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import java.io.IOException;
public class HdfsJavaHighApi {
public static void main(String[] args) {
try {
HdfsJavaHighApi.putFileFromLocal(args[0],args[1]);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void putFileFromLocal(String source_path,String target_path) throws IOException {
Configuration hdfs_conf = new Configuration();
hdfs_conf.set("fs.default.name","hdfs://huangyongchang:8020");
hdfs_conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
FileSystem fs = null;
try {
// 1、获取文件操作类
fs = FileSystem.get(hdfs_conf);
//从本地上传到hdfs
fs.copyFromLocalFile(new Path(source_path),new Path(target_path));
//fs.copyFromLocalFile(new Path("D:\\M\\music\\English music\\Chris Medina - What Are Words.flac"),new Path("/English.flac"));
//从hdfs下载到本地
//fs.copyToLocalFile(new Path("/English.flac"),new Path("D:/a.flac"));
} catch (IOException e) {
e.printStackTrace();
}finally {
fs.close();
}
}
}
HDFS角色
NameNode(NN):元数据节点。管理文件系统的Namespace/元数据。一个HDFS集群只能有一个Active的NN。
DataNode(DN):数据节点。数据存储节点,保存和检索Block。一个集群可以有多个数据节点。
Secondary NameNode(SNN):从元数据节点。合并NameNode的edit logs到fsimage文件中。辅助NN将内存中元数据信息持久化。
HDFS副本机制:
Block数据块:HDFS最基本的存储单元。默认块大小:128M(2.x)。
副本机制:作用(避免数据丢失),副本数默认为3,存放机制(一个在本地机架节点,一个在同一机架不同节点,一个在不同机架的节点)。
HDFS高可用
HDFS读文件过程
读是并发读,client同时读取所有需要的DataNode上的数据块,然后再自己合并。
HDFS写文件过程
写不是并发写,而是client先找最近的DataNode(不一定是要写入进的那个DataNode),这个DataNode再找离它最近的,依次传递直至找到要写入的节点,完成这一个数据块的写入后,client再写入下一个数据块(寻找第二个要写入的DataNode),直至写入整个文件。
评论