1.下載3.1.3的hadoop 列表
cd /Users/caolei/Desktop/big-data/tools
wget https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.1.3/hadoop-3.1.3.tar.gz
- 解壓
tar -zxvf hadoop-3.1.3.tar.gz
mv hadoop-3.1.3.tar.gz ../
3.啟動hadoop. 需要安裝好JDK.
cd hadoop-3.1.3
bin/hadoop
- 獨立運行:直接調用hadoop傳入要處理的文件運算并輸出.
mkdir input
cp etc/hadoop/*.xml input
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+'
cat output/*
至此完畢.直接提交一個java包,和輸入輸出參數.完成運算.
5.偽分布式運行:后臺運行hadoop進程并通過提交作業(yè)來完成運算.
6.需要修改兩個配置
vi etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
vi etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
7.需要設置ssh不需要密碼就可以登錄,因為集群模式下應該是通過ssh來服務器間通訊的.
先來檢查一下
ssh localhost
如果成功就可以直接跳過了.如果不成功. 設置本地ssh可以免密碼登錄本地服務器.
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
- 初始化并啟動hdfs.啟動后可以在http://localhost:9870/查看到hdfs的webui
bin/hdfs namenode -format
sbin/start-dfs.sh
9.創(chuàng)建hdfs文件夾用來輸入和輸出
$ bin/hdfs dfs -mkdir /user
$ bin/hdfs dfs -mkdir /user/<username>
10.復制需要測試的數據到input文件夾
$ bin/hdfs dfs -mkdir input
$ bin/hdfs dfs -put etc/hadoop/*.xml input
11.提交任務
$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar grep input output 'dfs[a-z.]+'
12.獲取結果
$ bin/hdfs dfs -get output output
$ cat output/*
或者直接查看hdfs上的內容
$ bin/hdfs dfs -cat output/*
13.關閉hdfs
sbin/stop-dfs.sh
14.單節(jié)點的YARN模式
15.修改兩處配置, 需要啟動hdfs并創(chuàng)建文件夾.
etc/hadoop/mapred-site.xml:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>
</configuration>
etc/hadoop/yarn-site.xml:
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
16.啟動yarn集群.可以在http://localhost:8088/查看webui
$ sbin/start-yarn.sh
17.運行任務
18.關閉集群
sbin/stop-yarn.sh
- 未完. 創(chuàng)建自己的hadoop jar任務并提交.yarn集群創(chuàng)建和管理.
- 例子: WordCount v1.0
//導入ioexception
import java.io.IOException;
//分詞
import java.util.StringTokenizer;
//hadoopconfig
import org.apache.hadoop.conf.Configuration;
//fs 路徑
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;
public class WordCount {
//分詞靜態(tài)函數
public static class TokenizerMapper
extends Mapper<Object, Text, Text, IntWritable>{
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
//靜態(tài)函數map
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.
context.write(word, one);
}
}
}
//靜態(tài)類 繼承Reducer類型為文本,可寫整數...
public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
//保存結果的變量
private IntWritable result = new IntWritable();
//關鍵函數匿名函數.key 值 內容類型.
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
//sum
int sum = 0;
//遍歷值 每個值為val 累加.
for (IntWritable val : values) {
sum += val.get();
}
//結果字段寫上sum
result.set(sum);
//內容寫 key,值
context.write(key, result);
}
}
//Main函數.從這里執(zhí)行.
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
//創(chuàng)建一個實例名稱
Job job = Job.getInstance(conf, "word count");
//根據當前類來設置需要的Jar
job.setJarByClass(WordCount.class);
//使用分詞器映射
job.setMapperClass(TokenizerMapper.class);
//使用整數相加來進行歸并
job.setCombinerClass(IntSumReducer.class);
//再次使用整數相加來進行聚合
job.setReducerClass(IntSumReducer.class);
//設置輸出Key
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);
}
}
基本能看懂,就是寫了一個map函數一個reducer函數.
對每一行做處理,先分詞,再對每一行進行計數.我靠那時候寫的很痛苦啊.相當于嵌套兩個java函數進去對每行數據進行映射.對映射結果進行運算.對比使用spark scral DF sql 會好寫很多..但是如果原始文件是純文本,對列進行操作會更復制.難怪只是基礎,構建上層的spark之類工具進行轉意.會有什么好處么.深入之后再說吧.
需要設置幾個環(huán)境變量
//Java_Home java安裝的目錄
export JAVA_HOME=/usr/java/default
//Path增加Java的執(zhí)行命令
export PATH=${JAVA_HOME}/bin:${PATH}
//增加編譯時HADOOP_CLASSPATH 需要的類庫.
export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar
編譯
//執(zhí)行hadoop 編譯當前文件夾下的java類.同時使用com.sun.tools.javac.Main 為命名空間.
$ bin/hadoop com.sun.tools.javac.Main WordCount.java
//使用jar打包 成wc.jar 將當前文件夾下編譯出來的類.
$ jar cf wc.jar WordCount*.class
在hdfs上創(chuàng)建輸入和輸出文件夾
/user/joe/wordcount/input - input directory in HDFS
/user/joe/wordcount/output - output directory in HDFS
../bin/hadoop fs -mkdir /user/charlie/input
../bin/hadoop fs -mkdir /user/charlie/output
創(chuàng)建一些測試文本
$ bin/hadoop fs -ls /user/joe/wordcount/input/
/user/joe/wordcount/input/file01
/user/joe/wordcount/input/file02
$ bin/hadoop fs -cat /user/joe/wordcount/input/file01
Hello World Bye World
$ bin/hadoop fs -cat /user/joe/wordcount/input/file02
Hello Hadoop Goodbye Hadoop
運行應用:
$ bin/hadoop jar wc.jar WordCount /user/joe/wordcount/input /user/joe/wordcount/output
查看輸出:
$ bin/hadoop fs -cat /user/joe/wordcount/output/part-r-00000
Bye 1
Goodbye 1
Hadoop 2
Hello 2
World 2
當前執(zhí)行好像環(huán)境變量中存在之前設置的路徑.所以需要重新設置.
先來看看基本的 映射-聚合 任務怎么寫.以及使用IDEA怎么快速寫這種任務. 再往后就直接可以條到Spark中玩了.畢竟速度快很多.再再然后就是可以跑到Zeppline中玩.畢竟更更方便.
使用IDEA進行Hadoop Job編寫.
可以參考這個做一遍. 主要是Maven和 IDEA.以及Java的打包運行之類,習慣一遍就好了.
http://www.reibang.com/p/f55142420985