文章目錄
Hadoop基礎
(一)概述
Hadoop是一個由Apache基金會所開發的分佈式系統基礎架構。用戶可以在不瞭解分佈式底層細節的情況下,開發分佈式程序。充分利用集羣進行高速運算和存儲。Hadoop實現了一個分佈式文件系統(Hadoop Distributed File System),簡稱HDFS。Hadoop的框架最核心的設計就是:HDFS和MapReduce,HDFS爲海量的數據提供了存儲,MapReduce爲海量的數據提供了計算。
Hadoop的發行版除了有Apache hadoop外還有Cloudera版本(CDH),Hortonworks(HDP),DKhadoop等都提供了自己的商業版本。
(二)搭建Hadoop
1. 前提環境
- 必須安裝Java環境:我們在linux上先卸載openjdk,下載安裝jdk1.8.rpm包;
- 如果要使用可選的啓動和停止腳本,則必須安裝ssh且sshd必須正在運行以使用管理遠程Hadoop守護程序的Hadoop腳本。
2. 下載安裝
- 下載地址:Hadoop官網
- 解壓安裝:
tar zxf hadoop-3.2.1.tar.gz
這裏做一個軟連接便於操作ln -s hadoop-3.2.1 hadoop
,進入hadoop目錄:
- 配置hadoop的JAVA_HOME:
查看本地jdk1.8的路徑:rpm -ql jdk1.8 | less
,複製路徑
進入hadoop的vim hadoop-env.sh
編輯裏:
- 啓動hadoop,爲了方便查看,我們將hadoop的bin目錄路徑直接加載到
.bash_profile
配置文件中,再執行source .bash_profile
使它生效:
現在就可以在任何位置直接通過hadoop
命令,查看hadoop!
(三)Hadoop的獨立操作
查找並顯示給定正則表達式的每個匹配項,輸出被寫入給定的輸出目錄。
$ mkdir input 創建一個輸入目錄
$ cp hadoop/etc/hadoop/*.xml input 拷貝hadoop目錄下的.xml文件
$ hadoop jar hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'
(四)Hadoop的僞分佈式
即在一臺機器上實現集羣。
1. 編寫配置
vim /etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
vim /etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name> dfs.replication </name>
<value> 1 </value>
</property>
</configuration>
2. 設置無密碼SSH
ssh-keygen
生成公密鑰對
在.ssh目錄下會生成兩個文件:id_rsa 、id_rsa.pub
ssh-copy-id localhost
將公鑰拷貝至localhost實現免密登錄!
3. 啓動分佈式文件系統
- 在終端操作
- 格式化文件系統:
hdfs namenode -format
- 啓動NameNode守護程序和DataNode守護程序:
sbin/start-dfs.sh
- 查看服務的端口號:
netstat -antlp
,默認9870爲分佈式文件系統的web接口 - 訪問9870端口:
- 設置作業所需的HDFS目錄
$ hdfs dfs -mkdir /user
$ hdfs dfs -mkdir /user/chs
- 將輸入文件複製到分佈式文件系統中
在ssh登錄狀態下操作,hdfs dfs -put input
但此時權限受控:直接在web頁面進行圖形化操作是不被允許的!
注意:此時在機器上操作已經被連接到分佈式文件系統中,和本地沒有關係了!不會在本地生成output文件!
例如:再次執行$ hadoop jar hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'
查看網頁:
直接查看文件:hdfs dfs -cat output/*
將輸出文件從分佈式文件系統複製到本地文件系統並檢查它們:hdfs dfs -get output
查看:
完成後,使用以下命令停止守護進程:sbin/stop-dfs.sh
- 授權後在分佈式文件系統web頁面操作
配置文件:vim /etc/hadoop/hdfs-site.xml
<configuration>
<property>
<name> dfs.permissions </name>
<value>false</value>
</property>
</configuration>
重啓分佈式,發現權限已經設置成功!可以在網頁上直接操作:可以直接刪除
(五)示例: WordCount v1.0
1. 解壓安裝IDEA
tar zxf ideaIU-2019.3.4.tar.gz -C /opt/
運行腳本:/opt/idea-IU-193.6911.18/bin/idea.sh
爲了防止下次無法正常打開 IDEA: 設置一下環境變量:vim ~/.bashrc
添加如下內容: export DISPLAY=:0.0 退出之後,執行,source ~/.bashrc
;
2. 創建maven項目
導入相關的依賴和jar包:
3. 測試代碼
import java.io.IOException;
import java.util.StringTokenizer;
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;
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();
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);
}
}
(1)在idea項目生成output文件
在idea項目中編寫一個.txt測試文件,並指定輸出:
運行程序:生成output目錄,可以查看統計的次數:
(2)在分佈式文件系統管理生成output文件
首先上傳新建的.txt文件到分佈式文件系統:hdfs dfs -put test.txt
,再在項目的resources目錄中導入hadoop的配置文件:hdfs-site.xml
和 core-site.xml
:
下載分佈文件系統output文件到本地 hdfs dfs -get output
,查看結果:
//下篇再見…謝謝