在下面的地址下載字節須要的版本,若是是windows下建議先下載hadoop windows工具包看一下如今支持哪些版本,而後選擇對應的hadoop版本。html
hadoop下載 hadoop windows工具包java
下載完以後解壓:node
hadoop windows工具包可選版本
hadoop windows工具包bin目錄
hadoop根目錄
hadoop bin目錄
使用hadoop工具包的bin目錄覆蓋hadoop的bin目錄,注意對應版本,通常大版本對上基本就沒有問題。覆蓋以前最好先備份。linux
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/G:/datacenter/data30/tmp</value> </property> </configuration>
主要配置的是hdfs這個文件系統的訪問接口和臨時目錄。git
<configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/G:/datacenter/data30/namenode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>/G:/datacenter/data30/datanode</value> </property> </configuration>
配置hdfs系統的namenode目錄和datanode目錄。github
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> </configuration>
這裏的yarn不是打包工具,而是一個資源調度器,YARN只提供運算資源的調度,用戶程序向YARN申請資源,YARN就負責分配資源。web
YARN中的主管角色叫ResourceManager,YARN中具體提供運算資源的角色叫NodeManager。apache
把winutil的bin目錄拷貝到hadoop的bin目錄下,直接執行替換操做,建議替換以前先備份。而後把hadoop.dll動態連接文件拷貝一份到C:\Windows\System32目錄下。windows
若是配置的JAVA_HOME中在C:\Program Files目錄下,要修改一下hadoop-env.cmd:網絡
set JAVA_HOME=%JAVA_HOME%
set JAVA_HOME=C:\PROGRA~1\Java\jdk1.8.0_191
用下面一個的替換上面一個,PROGRA~1代替的是Program Files,由於Program Files包含空格。
替換完成以後先配置一下環境變量,假設已經配置了JAVA的環境變量,就只須要配置HADOOP_HOME,指向hadoop的解壓目錄就能夠了,而後path中加上hadoop的bin和sbin目錄。
記得前面建立的目錄,如今要先格式化hadoop:
hadoop namenode -format hdfs namenode -format
上面2個命令任意一個,推薦下面一個,格式化成功以後,前面配置的namenode目錄下會出現一個current文件夾。
如今就能夠執行腳本:
start-all.cmd
固然也能夠前後執行:
start-hdfs.xml start-yarn.xml
start-hdfs.xml啓動的是namenode和datanode,start-yarn.xml啓動的是resourcemanager和nodemanager。
啓動好以後執行一下jps命令,可能看到下面的內容:
JobTracker SecondaryNameNode NodeManager ResourceManager NameNode DataNode
由於是單機,不是集羣因此可能只有下面4個:
NodeManager ResourceManager NameNode DataNode
能夠訪問: http://localhost:50070 來查看hdfs的web界面。
hadoop3.0開始訪問: http://localhost:9870
也能夠經過下面的配置修改(core-site.xml):
<property> <name>dfs.namenode.http-address</name> <value>127.0.0.1:50070</value> </property>
能夠訪問: http://localhost:8088 來查看yarn的web界面,爲了先用起來這裏先不詳細介紹,後面會補充一點內容。
hadoop fs -rm -r /dir #刪除 hadoop fs -ls -R /dir #列表 hadoop fs -mkdir /dir #建立目錄 hadoop fs -put in.txt /tmp #上傳 hadoop fs -get /tmp/in.txt out.txt #下載
咱們能夠看到hadoop fs命令和操做linux的命令基本一致,上面須要注意一點的就是文件上傳和下載了。上傳文件指定的目錄必定要存在。
例如,上面的上傳命令就會把當前目錄下的in.txt文件上傳到hdfs的/tmp目錄下,使用列表命令就能夠看到hdfs有一個/tmp/in.txt文件。
下載命令也同樣,指定hdfs的路徑,後一個是本地的路徑。
這裏使用maven地方方式,先添加依賴:
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>${hadoop.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-core</artifactId> <version>${hadoop.version}</version> </dependency>
這裏的${hadoop.version}選擇對應hadoop的版本就能夠了。
下面是一個hdfs操做的簡單示例:
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import org.apache.hadoop.io.IOUtils; import org.junit.Test; import java.io.FileInputStream; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; public class HDFSUtilTest { private static final String PATH = "hdfs://localhost:9000/"; private static final String DIR = "/dir"; private static final String FILE = "/dir/hello2"; public static final String IN = "G:\\tmp\\in2.txt"; /** * 刪除文件夾 hadoop fs -rmr /dir * @throws IOException */ @Test public void remove() throws IOException, URISyntaxException { FileSystem fileSystem = getFileSystem(); Path path = new Path(DIR); fileSystem.delete(path, true); } /** * 瀏覽文件夾 hadoop fs -lsr path * @throws IOException * @throws URISyntaxException */ @Test public void list() throws IOException, URISyntaxException { FileSystem fileSystem = getFileSystem(); Path root = new Path("/"); FileStatus[] listStatus = fileSystem.listStatus(root); for (FileStatus fileStatus : listStatus) { String isDir = fileStatus.isDirectory() ? "文件夾" : "文件"; String permission = fileStatus.getPermission().toString(); int replication = fileStatus.getReplication(); long len = fileStatus.getLen(); String path = fileStatus.getPath().toString(); System.out.println(isDir + "\t" + permission + "\t" + replication + "\t" + len + "\t" + path); } } /** * 下載文件 hadoop fs -get src des * @throws IOException * @throws URISyntaxException */ @Test public void getData() throws IOException, URISyntaxException { FileSystem fileSystem = getFileSystem(); // String file = "/out/_SUCCESS"; String file = "/out/part-r-00000"; Path path = new Path(file); FSDataInputStream inputStream = fileSystem.open(path); IOUtils.copyBytes(inputStream, System.out, 1024, true); } /** * 上傳文件 hadoop fs -put src des * @throws IOException * @throws URISyntaxException */ @Test public void putData() throws IOException, URISyntaxException { FileSystem fileSystem = getFileSystem(); Path path = new Path(FILE); FSDataOutputStream out = fileSystem.create(path); FileInputStream in = new FileInputStream(IN); IOUtils.copyBytes(in, out, 1024, true); } /** * 建立文件夾 hadoop fs -mkdir /dir * @throws IOException * @throws URISyntaxException */ @Test public void mkDir() throws IOException, URISyntaxException { FileSystem fileSystem = getFileSystem(); Path path = new Path(DIR); fileSystem.mkdirs(path); } private static FileSystem getFileSystem() throws IOException, URISyntaxException { URI uri = new URI(PATH); Configuration conf = new Configuration(); FileSystem fileSystem = FileSystem.get(uri, conf); return fileSystem; } }
下面是一個經典的hadoop mapreduce入門級示例。
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.GenericOptionsParser; import java.io.IOException; import java.util.StringTokenizer; public class WordCount { public static class TokenizerMapper extends Mapper<Object, Text,Text, IntWritable>{ private final static IntWritable one = new IntWritable(1); private Text word = new Text(); @Override public void map(Object key, Text value, Context context) throws IOException, InterruptedException { StringTokenizer stringTokenizer = new StringTokenizer(value.toString()); while (stringTokenizer.hasMoreTokens()){ word.set(stringTokenizer.nextToken()); context.write(word,one); } } } public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> { private IntWritable result = new IntWritable(); @Override public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for(IntWritable num : values){ sum += num.get(); } result.set(sum); context.write(key,result); } } public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { Configuration configuration = new Configuration(); configuration.set("fs.default.name", "hdfs://localhost:9000"); String[] remainingArgs = new GenericOptionsParser(configuration, args).getRemainingArgs(); if(remainingArgs.length < 2){ System.out.println("args error"); System.exit(2); } Job job = Job.getInstance(configuration, "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(remainingArgs[0])); FileOutputFormat.setOutputPath(job, new Path(remainingArgs[1])); System.exit(job.waitForCompletion(true) ? 0:1); } }
導包的時候會發現有mapreduce包和mapred包,暫時尚未了解這2個包有什麼區別。
main接收2個參數,第一個參數是要處理文件的目錄,第二個是處理結果的輸出目錄。
就是把第一個參數指定的目錄下的文件使用TokenizerMapper這個類的map方法,就是使用StringTokenizer分詞,而後使用IntSumReducer的reduce方法執行了一個彙總操做。
注意:這個mapreduce操做都在hdfs上進行的,因此能夠先經過命令將要分析的文件上傳到hdfs上。
另外指定目錄的時候是否是以/開頭的很重要,若是不是以/開頭就會在前面拼接上系統屬性user.dir的值。例如,指定的路徑是"in/data.txt",實際上會轉換爲/home/username/in/data.txt這個路徑,若是是"/in/data.txt",那麼就是路徑自己。
Scheduler是調度器,根據應用程序的資源需求進行資源分配,不參與應用程序具體的執行和監控等工做資源分配的單位就是Container,調度器是一個可插拔的組件,用戶能夠根據本身的需求實 現本身的調度器。YARN 自己爲咱們提供了多種直接可用的調度器,好比 FIFO,Fair Scheduler 和Capacity Scheduler等。
ResourceManager 是基於應用程序對集羣資源的需求進行調度的 YARN 集羣主控節點,負責 協調和管理整個集羣(全部 NodeManager)的資源,響應用戶提交的不一樣類型應用程序的 解析,調度,監控等工做。ResourceManager 會爲每個 Application 啓動一個 MRAppMaster,而且MRAppMaster分散在各個NodeManager節點。
ResourceManager的職責:
NodeManager是YARN集羣當中真正資源的提供者,是真正執行應用程序的容器的提供者, 監控應用程序的資源使用狀況,並經過心跳向集羣資源調度器 ResourceManager 進行彙報以更新本身的健康狀態。同時其也會監督Container的生命週期管理,監控每一個 Container 的資源使用狀況,追蹤節點健康情況,管理日 志和不一樣應用程序用到的附屬服務。
NodeManager的職責:
MRAppMaster 對應一個應用程序,職責是:向資源調度器申請執行任務的資源容器,運行 任務,監控整個任務的執行,跟蹤整個任務的狀態,處理任務失敗以異常狀況
Container 容器是一個抽象出來的邏輯資源單位。容器是由 ResourceManager Scheduler 服務 動態分配的資源構成,它包括了該節點上的必定量 CPU,內存,磁盤,網絡等信息,MapReduce 程序的全部 Task 都是在一個容器裏執行完成的,容器的大小是能夠動態調整的
應用程序管理器 ASM 負責管理整個系統中全部應用程序,包括應用程序提交、與調度器協 商資源以啓動 MRAppMaster、監控MRAppMaster運行狀態並在失敗時從新啓動它等。