hadoop version //查看版本
hadoop fs -appendToFile src(Linux中的文件) dest(hdfs目錄下的文件) //追加
hadoop fs -cat file(hdfs目錄下的文件) //查看文件內(nèi)容
Hadoop fs -tail file(hdfs目錄下的文件) //查看文件末尾1kb的數(shù)據(jù)
hadoop fs -checksum file(hdfs目錄下的文件) //校驗(yàn)當(dāng)前文件是否正確
hadoop fs -copyFromLocal src dest //從本地復(fù)制文件到HDFS
hadoop fs -copyToLocal dest src //從hdfs復(fù)制文件到本地
hadoop fs -count path //對目錄內(nèi)容做計(jì)數(shù)
hadoop fs -find path //查看某個(gè)hdfs目錄中是否相應(yīng)的文件
hadoop fs -getmerge src dest //合并下載
hadoop fs -ls path //列表
hadoop fs -put file(本地) dest(hdfs) //將本地文件上傳到hdfs
hadoop fs -setrep num file //設(shè)置hdfs系統(tǒng)中的某個(gè)文件的副本數(shù)(只能是hdfs中已上傳的文件)
hadoop fs -setrep -R num file //設(shè)置hdfs系統(tǒng)中的目錄下的所有文件的副本數(shù)
hadoop fs -text 壓縮文件 //查看hdfs中的壓縮文件
hadoop fs -truncate dir //清空hdfs目錄
hdfs getconf -confkey [key](配置文件的name) //查看相應(yīng)的配置的value
??Configuration類的介紹:
?Configuration類是加載hadoop中的相應(yīng)的配置文件
創(chuàng)新互聯(lián)是一家以網(wǎng)站建設(shè)公司、網(wǎng)頁設(shè)計(jì)、品牌設(shè)計(jì)、軟件運(yùn)維、成都網(wǎng)站推廣、小程序App開發(fā)等移動(dòng)開發(fā)為一體互聯(lián)網(wǎng)公司。已累計(jì)為成都隧道混凝土攪拌車等眾行業(yè)中小客戶提供優(yōu)質(zhì)的互聯(lián)網(wǎng)建站和軟件開發(fā)服務(wù)。
Configuration conf=new Configuration(true);
如果在這里沒有在source folder中放入相應(yīng)的配置文件:
core-site.xml、hdfs-site.xml、yarn-site.xml、mapreduce-site.xml…
那么Configuration類會(huì)自動(dòng)的加載jar包中的配置文件:
hadoop-hdfs-2.7.6.jar/hdfs-default.xml
只有在sourcefolder中放入相應(yīng)的配置時(shí),才能夠加載相應(yīng)的配置,但是配置文件的名稱必須是site 或者default的文件,才能夠正確加載
??使用相應(yīng)的方法加載配置文件:
Configuration conf=new Configuration();
conf.addResource(""); //這例實(shí)參的內(nèi)容為配置文件的權(quán)限定名稱
??FileSystem類的介紹:
獲取FileSystem對象:
//以這種方式獲取的fs對象是本地的文件系統(tǒng)的對象,如果在windows下就是windows的對象
Configuration conf=new Configuration();
FileSystem fs=FileSystem.get(conf);
//能加載自己集群的文件系統(tǒng)對象
conf.set("fs.defaultFS", "hdfs://hadoop01:9000");
解決編程時(shí)的權(quán)限問題:
由于hdfs文件系統(tǒng)是基于用戶的,在Windows下eclipse中操作hdfs默認(rèn)的用戶是Windows的用戶,在操作hdfs文件系統(tǒng)時(shí)沒有權(quán)限的,所以在做讀寫操作時(shí),可能會(huì)報(bào)出:
解決方案:
(1)在運(yùn)行時(shí)使用run configuration,配置相應(yīng)的參數(shù):-DHADOOP_USER_NAME=hadoop(指定運(yùn)行用戶)
(2)在代碼中指定用戶:FileSystem.get(newURI("hdfs://hadoop01:9000"),conf,"hadoop");
(3)在代碼中指定jvm運(yùn)行時(shí)使用的用戶System.setProperty("HADOOP_USER_NAME", "hadoop"); 這里需要使用run configuration運(yùn)行
(4)在Windows中添加一個(gè)hadoop用戶,不建議使用
如果以上方式仍然出現(xiàn)問題,那么就需要在window的path中配置一個(gè)環(huán)境變量:
DHADOOP_USER_NAME = hadoop 即可。
public class HDFSApp {
//文件系統(tǒng)
FileSystem fileSystem = null;
//配置類
Configuration configuration = null;
@Before
public void setup() {
configuration = new Configuration();
configuration.set("fs.defautlFS", "hdfs://zzy:9000");
configuration.addResource("core-site.xml");
configuration.addResource("hdfs-site.xml");
try {
fileSystem = FileSystem.get(configuration);
} catch (IOException e) {
e.printStackTrace();
}
}
//創(chuàng)建目錄
@Test
public void mkdir() {
try {
System.setProperty("HADOOP_USER_NAME", "hadoop");
boolean isMkdirs = fileSystem.mkdirs(new Path("/user/hadoop/test"));
if (isMkdirs) {
System.out.println("創(chuàng)建成功??!");
} else {
System.out.println("創(chuàng)建失?。?!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
//刪除目錄
@Test
public void deletedir() {
System.setProperty("HADOOP_USER_NAME", "hadoop");
try {
fileSystem.delete(new Path("/每日任務(wù).txt"), true);
} catch (IOException e) {
e.printStackTrace();
}
}
//將本地文件copy到hdfs中
@Test
public void CopyFromeLocal() {
System.setProperty("HADOOP_USER_NAME", "hadoop");
Path src=new Path("C:\\Users\\aura-bd\\Desktop\\每日任務(wù).txt");
Path dest=new Path("/");
try {
fileSystem.copyFromLocalFile(src,dest);
} catch (IOException e) {
e.printStackTrace();
}
}
//將hdfs文件copy到本地
@Test public void CopyToLocal(){
System.setProperty("HADOOP_USER_NAME", "hadoop");
Path src=new Path("C:\\Users\\aura-bd\\Desktop\\");
Path dest=new Path("/user/hive/warehouse/test.db/pokes/data.txt");
try {
fileSystem.copyToLocalFile(dest,src);
} catch (IOException e) {
e.printStackTrace();
}
}
//顯示目錄下的文件夾信息
@Test
public void FSListFile(){
try {
RemoteIterator filelist = fileSystem.listFiles(new Path("/user/hive/warehouse/test.db"), true);
while(filelist.hasNext()){
LocatedFileStatus fileStatus = filelist.next();
System.out.println(fileStatus.getPath());
System.out.println(fileStatus.getGroup());
System.out.println(fileStatus.getPath().getName());
System.out.println(fileStatus.getReplication());
BlockLocation[] blockLocations = fileStatus.getBlockLocations();
for(BlockLocation block :blockLocations){
System.out.println(block.getHosts().toString());
System.out.println(block.getNames());
System.out.println(block.getOffset());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
//顯示文件夾以及文件信息
@Test
public void ListFiles(){
try {
FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/"));
for(FileStatus file:fileStatuses){
if(file.isDirectory()){
System.out.println("directory:"+file.getPath().getName());
}else{
System.out.println("file:"+file.getPath().getName());
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
//下載文件
@Test
public void DownLoadFileToLocal(){
System.setProperty("HADOOP_USER_NAME", "hadoop");
try {
FSDataInputStream open = fileSystem.open(new
Path("/user/hive/warehouse/test.db/pokes/data.txt"));
OutputStream out=new FileOutputStream(new File("D:\\data.txt"));
IOUtils.copyBytes(open,out,1024);
} catch (IOException e) {
e.printStackTrace();
}
}
//上傳文件
@Test
public void upLoadFileToLocal(){
System.setProperty("HADOOP_USER_NAME", "hadoop");
try {
FSDataOutputStream fsDataOutputStream = fileSystem.create(new Path("/a.txt"));
InputStream in=new FileInputStream("D:\\data.txt");
IOUtils.copyBytes(in,fsDataOutputStream,4096);
} catch (IOException e) {
e.printStackTrace();
}
}
}
在hadoop中MR編程計(jì)算框架中,都是計(jì)算向數(shù)據(jù)移動(dòng),那么如何獲取一個(gè)文件的所有block信息,指定block塊進(jìn)行數(shù)據(jù)讀取的呢?
代碼實(shí)現(xiàn):
public class RamdomRead {
private static Configuration conf;
private static FileSystem fs;
static {
conf=new Configuration(true);
conf.set("fs.defalutFS","hdfs://zzy:9000");
conf.addResource("core-site.xml");
conf.addResource("hdfs-site.xml");
try {
fs=FileSystem.get(conf);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
System.setProperty("HADOOP_USER_NAME","hadoop");
Path file=new Path("/data/2018-8-8/access.log");
FSDataInputStream open = fs.open(file);
//拿到文件信息
try {
FileStatus[] fileStatuses = fs.listStatus(file);
// 獲取這個(gè)文件的所有 block 的信息
BlockLocation[] fileBlockLocations = fs.getFileBlockLocations(fileStatuses[0], 0L, fileStatuses[0].getLen());
// 第一個(gè) block 的長度
BlockLocation fileBlockLocation = fileBlockLocations[0];
//第一個(gè)塊的長度
long length = fileBlockLocation.getLength();
//第一個(gè) block 的起始偏移量
long offset = fileBlockLocation.getOffset();
//讀取數(shù)據(jù)
byte flush[]=new byte[4096];
FileOutputStream os = new FileOutputStream(new File("d:/block0"));
while(open.read(offset,flush,0,4096)!=-1){
os.write(flush);
offset+=4096;
if(offset>length){
return ;
}
}
os.flush();
os.close();
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}