前言: 在公司用到了hadoop,於是想搭建一個hadoop環境.從慕課網上找了門 Hadoop基礎知識與電商網站日誌數據分析課學了下,這是筆記,供本人複習之用.
目錄
3.4 start與stop與hadoop-daemons.sh的關係
第一章 環境介紹
服務器版本centos7.3 在阿里雲上買的,網絡1M,單核,硬盤40GB,內存2G.
Hadoop:hadoop-2.6.0-cdh5.15.1
下載地址:http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.15.1.tar.gz
Hadoop說明:http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.15.1/
裝hadoop環境需要先配ssh與安裝jdk.
jdk:1.8
第二章 Hadoop的安裝
2.1 jdk安裝
https://blog.csdn.net/q610376681/article/details/83902538
最終java安裝目錄
2.2 配置ssh登陸
提醒:因爲本人也是第一次配,可能有一些冗餘操作,具體還是根據自己情況來,下面步驟只作爲參考.
附上幾個常用的操作文件命令:
清空文件內容:cat /dev/null > file_name
查找文件內的內容: 在命令行下輸入“/關鍵字”
重啓ssh服務:service sshd restart
2.2.1 配置讓服務器能自己登陸自己
即ssh localhost能夠成功.
可參考:https://blog.csdn.net/dongdong9223/article/details/81288378
值得注意的是,出現are you sure 的時候要輸入yes,不是直接回車.
2.2.2 讓本地能通過ssh遠程連接阿里雲服務器
1. 添加安全組規則:
2. 利用阿里雲生成密鑰對:
https://help.aliyun.com/document_detail/51793.html?spm=5176.2020520101.205.d51793.38cb4df5MgXi9M
3. 將密鑰對放在ssh中,並在ssh規則中添加對應密鑰:
https://blog.csdn.net/mier9042/article/details/82908774
我自己的環境:
my_computer2.pem阿里雲生成的密鑰
將密鑰添加到ssh中
在~/.ssh/下配置config(這裏沒嘗試之前的github還能否連上,網上說可能要在改點別的配置,因爲網上教程一堆,就沒寫,有問題再搜就行.HostName是ip,Host是我的遠程主機設置host名.
連接,注意連接的時候要加上用戶名如root
2.3 hadoop的安裝
1. 下載並解壓到指定目錄
解壓後hadoop文件夾下目錄說明:
2.將java配置寫入/etc/hadoop/hadoop-env.sh,如果環境變量裏配置了java_home,下圖這樣即可.
3. 配置默認的文件系統,切換到etc/hadoop/core-site.xml文件上,下面配置寫入.
這裏hadoop000要在host裏進行配置
vi /etc/hosts
特別特別特別注意地址不能寫127.0.0.1和雲服務器的外網ip,這樣都會導致導致等會兒不能在外網操作hadoop,要填寫雲服務器的內網地址.
4. 配置副本系數.現在是單機,所以是1.切換到etc/hadoop/hdfs-site.xml文件上,下面配置寫入.
5.修改臨時文件夾位置,此參數不改可能不影響使用,但是機器重啓以後可能有問題.此目錄下存放hdfs將文件切成的塊,重啓時tmp目錄會被清空,容易造成數據丟失.
所以我們將文件放在:
6. 配置dataNode,hadoop的結構是主從結構,一個nameNode帶幾個dataNode,所以我們要配置dataNode,打開/etc/hadoop中的slaves,修改其中的localhost爲hadoop000,效果是一樣的,但是有利於我們後期修改爲多節點.
第三章 啓動停止hadoop
3.1 格式化文件系統
注意:第一次執行的時候一定要格式化文件系統,不要重複執行
將hadoop配置到環境變量中以方便使用
source /etc/profile 使其生效.
格式化文件系統
hdfs namenode -format
如下顯示說明格式化成功.
3.2 啓動集羣
切換到sbin中啓動下圖所示文件並啓動
啓動記錄:
3.2.1 通過進程開啓
驗證,當出現下圖所示(除jps)即爲成功,數字可以不一樣,那是pid.
如果發現哪個進程不存在,去logs文件夾中找其中log文件.
3.2.2 通過網站驗證開啓
訪問ip:50070也可以校驗是否成功,如果連接不上,考慮防火牆的問題,我這裏用的是阿里雲,打開下面的防火牆,即訪問成功.
3.3 停止集羣
在sbin目錄下輸入如下命令停止
./stop-dfs.sh
3.4 start與stop與hadoop-daemons.sh的關係
第四章 HDFS 命令行操作
輸入hadoop,會出現提示
看到fs是對文件系統進行操作,輸入hadoop fs,看到一堆對文件的操作.將嘗試較爲常用的.
首先查看hdfs中現存的文件
hadoop fs -ls /
發現空空如野,因爲剛創建.
具體的命令實踐:https://www.jianshu.com/p/ba8e047a2216
第五章 hadoop文件的存儲機制
當我們將大於block的文件放入hdfs中去時,其會被拆成多個塊.比如我們將jdk放入hdfs中.
因爲一個block是128M,我們的jdk是182M,可以看到jdk被分成了兩塊存儲到hdfs中.大小加起來剛好爲182M.
我們去之前配置的/app/tmp下找,經過很多級目錄可以找到這兩個塊.
並且cat之後也可以進行使用(這是視頻上的塊,我嫌麻煩沒自己敲).
第七章 API編程開發HDFS
建立maven項目.
在本地中配置hosts地址如下,我本地是windows,路徑爲C盤 - > Windows - > System32 - > drivers-> etc - > hosts文件
7.1 配置maven庫
<!--有些包要到這個庫去下-->
<repositories>
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
</repository>
</repositories>
<!--引入的包-->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.0-cdh5.15.1</version>
</dependency>
7.2 遠程操作阿里雲中的hadoop
列舉了幾個常用的,其它的api可以網上搜搜,大同小異.
public class HDFSApp {
public static final String HDFS_PATH = "hdfs://59.110.164.62:8020";
FileSystem fileSystem = null;
Configuration configuration = null;
@Before
public void setUp() throws URISyntaxException, IOException, InterruptedException {
System.out.println("---setUp---");
configuration = new Configuration();
//設置true表示讓它返回的是host名字,而不是地址,如果不設置
//會返回內網地址導致失敗.
configuration.set("dfs.client.use.datanode.hostname", "true");
fileSystem = FileSystem.get(new URI(HDFS_PATH),configuration,"root");
}
/**
* 創建hdfs文件夾
*
* @param
* @return
**/
@Test
public void mkdir() throws IOException {
fileSystem.mkdirs(new Path("/hdfsapi/test"));
}
/**
* 從hadoop中下載文件
*
* @param
* @return
**/
@Test
public void text() throws IOException {
FSDataInputStream in = fileSystem.open(new Path("/README.txt"));
System.out.println("成功獲取輸入流");
IOUtils.copyBytes(in,System.out,1024);
}
/**
* 向hadoop中上傳文件.
*
* @param
* @return
**/
@Test
public void create() throws IOException {
FSDataOutputStream out = fileSystem.create(new Path("/hdfsapi/test/a.txt"));
out.writeUTF("hello zhangchen");
out.flush();
out.close();
}
/**
* 關閉連接
*
* @param
* @return
**/
@After
public void tearDown(){
configuration = null;
fileSystem = null;
System.out.println("---tearDown---");
}
}
7.2.1 上傳文件副本數爲3
同時值得注意的是我們上傳的文件副本數爲3,和我們在本地配置的1的副本數不一樣,因爲它上傳時讀取的是默認配置,可以在dependency下的hdfs依賴中的xml文件中找到.
可以看到副本數爲3