Hadoop被公認是一套行業大數據標準開源軟件,在分佈式環境下提供了海量數據的處理能力。幾乎全部主流廠商都圍繞Hadoop開發工具、開源軟件、商業化工具和技術服務。今年大型IT公司,如EMC、Microsoft、Intel、Teradata、Cisco都明顯增長了Hadoop方面的投入。html
hadoop擅長日誌分析,facebook就用Hive來進行日誌分析,2009年時facebook就有非編程人員的30%的人使用HiveQL進行數據分析;淘寶搜索中的自定義篩選也使用的Hive;利用Pig還能夠作高級的數據處理,包括Twitter、LinkedIn 上用於發現您可能認識的人,能夠實現相似Amazon.com的協同過濾的推薦效果。淘寶的商品推薦也是!在Yahoo!的40%的Hadoop做業是用pig運行的,包括垃圾郵件的識別和過濾,還有用戶特徵建模。(2012年8月25新更新,天貓的推薦系統是hive,少許嘗試mahout!)java
1.HDFS: Hadoop Distributed File System 分佈式文件系統node
2.YARN: Yet Another Resource Negotiator 資源管理調度系統git
3.Mapreduce:分佈式運算框架程序員
主從結構github
•主節點, namenodeweb
•從節點,有不少個: datanodespring
namenode負責:sql
•接收用戶操做請求docker
•維護文件系統的目錄結構
•管理文件與block之間關係,block與datanode之間關係
datanode負責:
•存儲文件
•文件被分紅block存儲在磁盤上
•爲保證數據安全,文件會有多個副本
Secondary NameNode負責:
合併fsimage和edits文件來更新NameNode的metedata
擴容能力(Scalable):能可靠地(reliably)存儲和處理千兆字節(PB)數據。
成本低(Economical):能夠經過普通機器組成的服務器羣來分發以及處理數據。這些服務器羣總計可達數千個節點。
高效率(Efficient):經過分發數據,hadoop能夠在數據所在的節點上並行地(parallel)處理它們,這使得處理很是的快速。
可靠性(Reliable):hadoop能自動地維護數據的多份副本,而且在任務失敗後能自動地從新部署(redeploy)計算任務。
namenode是整個文件系統的管理節點。他維護着整個文件系統的文件目錄樹,文件/目錄的元信息和每一個文件對應的數據塊列表。接收用戶的操做請求。
文件包括:
fsimage:元數據鏡像文件。存儲某一時段NameNode內存元數據信息。
edits:操做日誌文件。
fstime:保存最近一次checkpoint的時間。
NameNode始終在內存中保存metedata,用於處理「讀請求」,到有「寫請求」到來時,NameNode首先會寫editlog到磁盤,即向edits文件中寫日誌,成功返回後,纔會修改內存,而且向客戶端返回。
Hadoop會維護一我的fsimage文件,也就是NameNode中metedata的鏡像,可是fsimage不會隨時與NameNode內存中的metedata保持一致,而是每隔一段時間經過合併edits文件來更新內容。Secondary NameNode就是用來合併fsimage和edits文件來更新NameNode的metedata的。
fs.checkpoint.period 指定兩次checkpoint的最大時間間隔,默認3600秒。
fs.checkpoint.size 規定edits文件的最大值,一旦超過這個值則強制checkpoint,無論是否到達最大時間間隔。默認大小是64M。
HA的一個解決方案。但不支持熱備。配置便可。
執行過程:從NameNode上下載元數據信息(fsimage,edits),而後把兩者合併,生成新的fsimage,在本地保存,並將其推送到NameNode,替換舊的fsimage.
默認在安裝在NameNode節點上,但這樣...不安全!
(1)secondary通知namenode切換edits文件;
(2)secondary從namenode得到fsimage和edits(經過http);
(3)secondary將fsimage載入內存,而後開始合併edits;
(4)secondary將新的fsimage發回給namenode;
(5)namenode用新的fsimage替換舊的fsimage;
提供真實文件數據的存儲服務。
文件塊(block):最基本的存儲單位。對於文件內容而言,一個文件的長度大小是size,那麼從文件的0偏移開始,按照固定的大小,順序對文件進行劃分並編號,劃分好的每個塊稱一個Block。HDFS默認Block大小是128MB,以一個256MB文件,共有256/128=2個Block.
dfs.block.size
不一樣於普通文件系統的是,HDFS中,若是一個文件小於一個數據塊的大小,並不佔用整個數據塊存儲空間;
Replication:多複本。默認是三個。
1.初始化FileSystem,而後客戶端(client)用FileSystem的open()函數打開文件
2.FileSystem用RPC調用元數據節點,獲得文件的數據塊信息,對於每個數據塊,元數據節點返回保存數據塊的數據節點的地址。
3.FileSystem返回FSDataInputStream給客戶端,用來讀取數據,客戶端調用stream的read()函數開始讀取數據。
4.DFSInputStream鏈接保存此文件第一個數據塊的最近的數據節點,data從數據節點讀到客戶端(client)
5.當此數據塊讀取完畢時,DFSInputStream關閉和此數據節點的鏈接,而後鏈接此文件下一個數據塊的最近的數據節點。
6.當客戶端讀取完畢數據的時候,調用FSDataInputStream的close函數。
7.在讀取數據的過程當中,若是客戶端在與數據節點通訊出現錯誤,則嘗試鏈接包含此數據塊的下一個數據節點。
8.失敗的數據節點將被記錄,之後再也不鏈接。
1.初始化FileSystem,客戶端調用create()來建立文件
2.FileSystem用RPC調用元數據節點,在文件系統的命名空間中建立一個新的文件,元數據節點首先肯定文件原來不存在,而且客戶端有建立文件的權限,而後建立新文件。
3.FileSystem返回DFSOutputStream,客戶端用於寫數據,客戶端開始寫入數據。
4.DFSOutputStream將數據分紅塊,寫入data queue。data queue由Data Streamer讀取,並通知元數據節點分配數據節點,用來存儲數據塊(每塊默認複製3塊)。分配的數據節點放在一個pipeline裏。Data Streamer將數據塊寫入pipeline中的第一個數據節點。第一個數據節點將數據塊發送給第二個數據節點。第二個數據節點將數據發送給第三個數據節點。
5.DFSOutputStream爲發出去的數據塊保存了ack queue,等待pipeline中的數據節點告知數據已經寫入成功。
6.當客戶端結束寫入數據,則調用stream的close函數。此操做將全部的數據塊寫入pipeline中的數據節點,並等待ack queue返回成功。最後通知元數據節點寫入完畢。
7.若是數據節點在寫入的過程當中失敗,關閉pipeline,將ack queue中的數據塊放入data queue的開始,當前的數據塊在已經寫入的數據節點中被元數據節點賦予新的標示,則錯誤節點重啓後可以察覺其數據塊是過期的,會被刪除。失敗的數據節點從pipeline中移除,另外的數據塊則寫入pipeline中的另外兩個數據節點。元數據節點則被通知此數據塊是複製塊數不足,未來會再建立第三份備份。
hadoop中訪問不了8088 相關內容
在其核心,Hadoop主要有兩個層次,即:
除了上面提到的兩個核心組件,Hadoop的框架還包括如下兩個模塊:
Hadoop Streaming 是一個實用程序,它容許用戶使用任何可執行文件(例如shell實用程序)做爲映射器和/或reducer建立和運行做業。
HDFS遵循主從架構,它具備如下元素。
一、名稱節點 -Namenode
名稱節點是包含GNU/Linux操做系統和軟件名稱節點的普通硬件。它是一個能夠在商品硬件上運行的軟件。具備名稱節點系統做爲主服務器,它執行如下任務:
- 管理文件系統命名空間。
- 規範客戶端對文件的訪問。
- 它也執行文件系統操做,如重命名,關閉和打開的文件和目錄。
二、數據節點 - Datanode
Datanode具備GNU/Linux操做系統和軟件Datanode的普通硬件。對於集羣中的每一個節點(普通硬件/系統),有一個數據節點。這些節點管理數據存儲在它們的系統。
- 數據節點上的文件系統執行的讀寫操做,根據客戶的請求。
- 還根據名稱節點的指令執行操做,如塊的建立,刪除和複製。
三、塊 -block
通常用戶數據存儲在HDFS文件。在一個文件系統中的文件將被劃分爲一個或多個段和/或存儲在我的數據的節點。這些文件段被稱爲塊。換句話說,數據的HDFS能夠讀取或寫入的最小量被稱爲一個塊。缺省的塊大小爲64MB,但它能夠增長按須要在HDFS配置來改變
教程:
- http://www.javashuo.com/article/p-mlyyjuaz-hy.html
- http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html#Example:_WordCount_v2.0
MapReduce計劃分三個階段執行,即映射階段,shuffle階段,並減小階段。
涉及到的角色:
一、客戶端(client):編寫mapreduce程序,配置做業,提交做業,這就是程序員完成的工做;
二、JobTracker:初始化做業,分配做業,與TaskTracker通訊,協調整個做業的執行;
三、TaskTracker:保持與JobTracker的通訊,在分配的數據片斷上執行Map或Reduce任務,TaskTracker和JobTracker的不一樣有個很重要的方面,就是在執行任務時候TaskTracker能夠有n多個,JobTracker則只會有一個(JobTracker只能有一個就和hdfs裏namenode同樣存在單點故障,我會在後面的mapreduce的相關問題裏講到這個問題的)
四、Hdfs:保存做業的數據、配置信息等等,最後的結果也是保存在hdfs上面
map階段:映射或映射器的工做是處理輸入數據。通常輸入數據以存儲在HDFS的文件或目錄的形式,輸入文件被傳遞到映射器功能線路,映射器處理該數據,並建立數據的若干小塊。
reduce階段:這個階段是Shuffle階段和Reduce階段的組合。減速器的工做是處理該來自映射器中的數據。處理以後,它產生一組新的輸出,這將被存儲在HDFS。
在一個MapReduce工做過程當中:
一、由Hadoop發送Map和Reduce任務到集羣的相應服務器
二、框架管理數據傳遞,例如發出任務的全部節點之間的集羣周圍的詳細信息,驗證任務完成,和複製數據
三、大部分的計算髮生在與在本地磁盤上,能夠減小網絡通訊量數據的節點
四、給定的任務完成後,將收集並減小了數據,以一個合適的結果發送回Hadoop服務器
應用程序一般實現Mapper和Reducer接口以提供map和reduce方法:
public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(Object key, Text value, Context context) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } } public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "word count"); job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); }
在idea中遠程調試程序
System.setProperty("hadoop.home.dir", "/Users/kexin/work/app/hadoop/hadoop-2.6.5"); Configuration conf = new Configuration(); String uri = "hdfs://localhost:9000"; Job job = null; try { job = Job.getInstance(conf); } catch (IOException e) { e.printStackTrace(); } job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); job.setReducerClass(IntSumReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileSystem fs = FileSystem.get(URI.create(uri), conf); try { FileInputFormat.addInputPath(job, new Path("hdfs://localhost:9000/test/test.txt")); Path outpath = new Path("hdfs://localhost:9000/project/wordcount/output"); if (fs.exists(outpath)) { fs.delete(outpath, true); } FileOutputFormat.setOutputPath(job, outpath); } catch (IllegalArgumentException | IOException e) { e.printStackTrace(); } try { job.submit(); } catch (ClassNotFoundException | IOException | InterruptedException e) { e.printStackTrace(); }
在idea中本地調試程序
System.setProperty("hadoop.home.dir", "/Users/kexin/work/app/hadoop/hadoop-2.6.5"); Configuration config = new Configuration(); try { FileSystem fs = FileSystem.get(config); Job job = Job.getInstance(config); job.setJarByClass(WordCount.class); job.setJobName("word count"); job.setMapperClass(TokenizerMapper.class); job.setReducerClass(IntSumReducer.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path("/Users/kexin/work/projects/Hadoop/src/main/resources/input")); Path outpath = new Path("/Users/kexin/work/projects/Hadoop/src/main/resources/output"); if (fs.exists(outpath)) { fs.delete(outpath, true); } FileOutputFormat.setOutputPath(job, outpath); boolean f = job.waitForCompletion(true); if (f) { System.out.println("job任務執行成功"); } } catch (Exception e) { e.printStackTrace(); }
映射器將輸入k/v對映射到一組中間k/v對。轉換後的中間記錄不須要與輸入記錄的類型相同。給定的輸入對能夠映射到零個或多個輸出對。經過調用context.write(WritableComparable,Writable)來收集輸出對。
Hadoop MapReduce框架爲做業的InputFormat生成的每一個InputSplit生成一個map任務。
總的來講,映射器實現經過Job.setMapperClass(Class)方法傳遞給做業。而後,框架爲InputSplit中的每一個k/v對調用該任務的map。
映射的數量一般由輸入的總大小驅動,即輸入文件的塊總數。也可使用Configuration.set(MRJobConfig.NUM_MAPS,int)來設置映射數量。
隨後將與給定輸出鍵關聯的全部中間值按框架分組,並傳遞給Reducer以肯定最終輸出。用戶能夠經過Job.setGroupingComparatorClass(Class)指定Comparator來控制分組。
對Mapper輸出進行排序,而後根據Reducer進行分區。分區總數與做業的reduce任務數相同。用戶能夠經過實現自定義分區程序來控制哪些鍵(以及記錄)轉到哪一個Reducer。
用戶能夠選擇經過Job.setCombinerClass(Class)指定組合器來執行中間輸出的本地聚合,好比合並重復的key,這有助於減小從Mapper傳輸到Reducer的數據量。
Reducer有3個主要階段:shuffle,sort和reduce
一、shuffle
Reducer的輸入是映射器的排序輸出。在此階段,框架經過HTTP獲取全部映射器的輸出的相關分區
二、sort
框架在此階段按鍵(由於不一樣的映射器可能輸出相同的鍵)對Reducer輸入進行分組。在獲取map輸出結果時,shuffle和sort階段同時進行。
若是要求對中間密鑰進行分組的等價規則與在減小以前對密鑰進行分組的等價規則不一樣,則能夠經過Job.setSortComparatorClass(Class)指定比較器。因爲Job.setGroupingComparatorClass(Class)可用於控制中間鍵的分組方式,所以能夠結合使用這些鍵來模擬值的二級排序。
三、reduce
在此階段,爲分組輸入中的每一個
hadoop中訪問不了8088 相關內容
下載hadoop docker鏡像
$ docker pull krejcmat/hadoop-master:latest $ docker pull krejcmat/hadoop-slave:latest
構建hadoop docker鏡像
$ git clone https://github.com/krejcmat/hadoop-docker.git $ cd hadoop-docker $ ./build-image.sh hadoop-dnsmasq $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE krejcmat/hadoop-slave latest 81cddf669d42 42 minutes ago 670.9 MB krejcmat/hadoop-master latest ed91c813b86f 42 minutes ago 670.9 MB krejcmat/hadoop-base latest cae006d1c427 50 minutes ago 670.9 MB krejcmat/hadoop-dnsmasq latest 89f0052d964c 53 minutes ago 156.9 MB philcryer/min-wheezy latest 214c501b67fa 14 months ago 50.74 MB
其中,philcryer/min-wheezy, krejcmat/hadoop-dnsmasq, krejcmat/hadoop-base是臨時產生的中間docker鏡像,能夠刪除掉
$ docker rmi c4c4000322cf e148f587cc4f d196b785d987
在git項目的目錄下
$ ./start-container.sh latest 2 start master container... start slave1 container...
檢查集羣成員
$ serf members
master.krejcmat.com 172.17.0.2:7946 alive slave1.krejcmat.com 172.17.0.3:7946 alive
$ cd ~
$ ./configure-members.sh Warning: Permanently added 'slave1.krejcmat.com,172.17.0.3' (ECDSA) to the list of known hosts.slaves .......... $ ./start-hadoop.sh #For stop Hadoop ./stop-hadoop.sh Starting namenodes on [master.krejcmat.com] .......... $ jps 342 NameNode 460 DataNode 1156 Jps 615 SecondaryNameNode 769 ResourceManager 862 NodeManager $ hdfs dfsadmin -report Name: 172.17.0.2:50010 (master.krejcmat.com) Hostname: master.krejcmat.com ..........
經過web瀏覽器訪問http://IP:8088 hadoop集羣頁面
hadoop中訪問不了8088 相關內容
Hadoop是Apache的一款開源框架,使用java語言編寫,能夠經過編寫簡單的程序來實現大規模數據集合的分佈式計算。工做在Hadoop框架上的應用能夠工做在分佈式存儲和計算機集羣計算的環境上面。Hadoop具備高擴展性,其集羣可以從單臺機器擴展到數千臺機器。
Hadoop 採用的是Apache v2協議,Hadoop基於Google發佈的MapReduce論文實現,而且應用了函數式編程的思想。
Hadoop框架包括下述三個個模塊
HDFS, MapReduce, YARN
Hadoop Distributed File System (HDFS) 是Hadoop集羣中最根本的文件系統,它提供了高擴展,高容錯,機架感知數據存儲等特性,能夠很是方便的部署在機器上面。HDFS除過度布式文件系統所通有的特色以外,還有些僅屬本身的特色:
Hadoop集羣中的數據被劃分紅更小的單元(一般被稱爲塊),而且將其分佈式存儲在集羣中,每一個塊有兩個副本,這個兩個副本被存儲在集羣的的一個機架上。這樣數據包含自身便有三個副本,具備極高的可用性和容錯性,若是一個副本丟失,HDFS將會自動的從新複製一份,以確保集羣中一共包含三個數據副本(包含自身)。
HDFS也能夠有多種形式,這個取決於Hadoop版本及所需功能。
HDFS是Leader/Follower架構實現的,每一個集羣都必須包含一個NameNode節點,和一個可選的SecondaryName節點,以及任意數量的DataNodes。
除了管理文件系統命名空間和管理元數據以外,NameNode對clients而言,還扮演着master和brokers的角色(雖然clients是直接與DataNode進行通訊的)。NameNode徹底存在於內存中,但它仍然會將自身狀態寫入磁盤。
HDFS是Hadoop中經典的文件系統,可是Hadoop並不只僅支持HDFS,它還支持其餘的文件系統,好比Local file system, FTP, AWS S3, Azure’s file system, 和OpenStack’s Swift,這些文件系統能夠在使用時根據不一樣URI進行區分。好比:
file: for the local file system
s3: for data stored on Amazon S3
MapReduce是爲可以在集羣上分佈式處理海量數據而量身訂作的框架,MapReduce job能夠分爲三次連續過程。
MapReduce的最大工做單元即是job,每一個job又會被分割成map task或reduce task。最經典的MapReduce job即是統計文檔中單詞出現的頻率,這個過程可使用下圖來描述
YARN (Yet Another Resource Negotiator) 是爲應用執行分配計算資源的一個框架。YARN主要包含下面三個核心組件
Note:
YARN 使用了一些容易讓人誤解的名詞做爲術語,所以應該特別注意。好比在Hadoop ecosystem中,
Container
這個概念,日常咱們聽到Container時,咱們都認爲是與Docker相關。可是這裏倒是指Resource Container (RC),即表示物理資源的集合。一般被抽象的表示,將資源分配給到目標和可分配單元。Application
也是一個熟詞僻義的用法,在YARN中,一個Application
指的是被一併執行的task的集合,YARN中的Application的概念大概相似於MapReduce中的job這個概念。
ResourceManager在YARN中是一個rack-aware master節點,它主要負責管理全部可用資源的集合和運行一些相當重要的服務,其中最重要的即是Scheduler
Scheduler組件是YARN Resourcemanager中向運行時應用分配資源的一個重要組件,它僅僅完成資源調度的功能,並不完成監控應用狀態和進度的功能,所以即便應用執行失敗,它也不會去重啓失敗的應用。
可是在Hadoop 2.7.2開始,YARN開始支持少數調度策略CapacityScheduler,FairScheduler,FIFO Scheduler。默認狀況下由Hadoop來負責決定使用哪一種調度策略,不管使用那種調度策略,Scheduler都會經過Continer來向請求的ApplicationMaster分配資源。
每一個運行在Hadoop上面的應用都會有本身專用的ApplicationMaster實例。每一個實例進會存在於集羣中每一個節點僅屬於本身的單獨Container。每一個Application的ApplicationMaster都會週期性的向ResourceManager發送心跳消息,若是有須要的話,還會去向ResourceManger請求額外的資源,ResourceManager便會爲額外的資源劃分租期(代表該資源已被某NodeManager所持有)
ApplicationMaster會監控每一個application的整個生命週期,從向ResourceManager請求額外的資源到向NodeManager提交請求。
NodeManager能夠認爲是監控每一個節點的Container的代理,會監控每一個Container的整個生命週期,包括Continer的資源使用狀況,與ResourceManager的週期性通訊。
從概念上來講,NodeManager更像是Hadoop早期版本的TaskTrackers,當時Taskrackers主要被用來解決調度map和reduce slots問題,NodeManager有一個動態建立的,任意大小的Resouce Containers(RCs),並不像MR1中的那種slots,RCs能夠被用在map tasks中,reduce tasks中,或者是其餘框架的tasks
爲了更好的描述YARN,這裏給出一個YARN application的執行過程。以下圖所示:
hadoop中訪問不了8088 相關內容
格式:hadoop fs -命令
主要有以下的命令:
命令 | 說明 |
---|---|
hadoop fs -mkdir | 建立HDFS目錄 |
hadoop fs -ls | 列出HDFS目錄 |
hadoop fs -copyFromLocal | 使用-copyFromLocal複製本地文件(local)到HDFS |
hadoop fs -put | 使用-put複製本地(local)文件到HDFS |
hadoop fs -copyToLocal | 將HDFS上的文件複製到本地(local) |
hadoop fs -get | 將HDFS上的文件複製到本地(local) |
hadoop fs -cp | 複製HDFS文件 |
hadoop fs -rm | 刪除HDFS文件 |
hadoop fs -cat | 列出HDFS目錄下的文件的內容 |
注意:由於登陸的用戶爲hduser,因此會顯示/user/hduser下的目錄。
三、查看HDFS完整目錄
由於hadoop fs -ls只能查看一級目錄,因此必須逐級查看:
四、查看全部的HDFS子目錄
HDFS提供了一個方便的選項 -R 能夠遞歸查看目錄
五、一次性建立全部HDFS子目錄
逐級建立很麻煩,可是能夠添加參數-p,來一次性建立多級目錄:
【2、從本地計算機複製文件到HDFS】
一、複製本地文件到HDFS:
二、列出文件內容:
可使用:hadoop fs -cat /user/hduser/test/test1.txt | more 進行分頁顯示
三、若是複製到HDFS的文件已經存在,會報錯,此時可使用-f 參數,強制複製重複文件到HDFS目錄:
四、從本地複製多個文件到HDFS,中間用空格分割便可。
五、從本地複製整個目錄到HDFS:
六、列出HDFS目錄下的全部文件(包括這個目錄下子目錄的文件)
七、使用put複製文件到HDFS,這個參數與copyFromLocal的不一樣之處在於:
-put更寬鬆,能夠把本地或者HDFS上的文件拷貝到HDFS中;而-copyFromLocal則更嚴格限制只能拷貝本地文件到HDFS中。若是本地和HDFS上都存在相同路徑,則-put跟趨於優先取HDFS的源。(不用太深究二者區別,更多用-put)
【3、從HDFS上覆制文件到本地】
一、參數 -copyToLocal
【4、複製與刪除HDFS文件】
一、使用-cp參數,在HDFS上進行復制文件
二、使用-rm參數,刪除HDFS上的文件;添加-R參數,刪除目錄: