大數據實驗報告【全集】

所用教材↑,配套PPT廈門大學林子雨配套MOOC內容和書裏的內容差不多。

【意味着課上不好好聽,課下你還能看教科書補(╹ڡ╹ )】建議先實驗再聽課或看書。

若對你有幫助的話,記得點贊、關注我哦!實驗中遇到不少困難,故本文較長,請耐心閱覽!

實驗標題:①安裝Hadoop;②HDFS編程(安裝);③HDFS編程;④Mapreduce編程

大數據類開放在線實踐課程(能模擬實驗,推薦):https://www.educoder.net/paths/158

◉ 實驗中用到的Linux命令:

cd /home/hadoop #把/home/hadoop設置爲當前目錄
cd .. #返回上一級目錄
cd ~ #進入到當前Linux系統登錄用戶的主目錄(或主文件夾)。在 Linux 系統中,~代表的是用戶的主文件夾,
#即“/home/用戶名”這個目錄,如果當前登錄用戶名爲 hadoop,則~就代表“/home/hadoop/”這個目錄
ls #查看當前目錄中的文件
ls -l #查看文件和目錄的權限信息
mkdir input #在當前目錄下創建input子目錄
mkdir -p src/main/scala #在當前目錄下,創建多級子目錄src/main/scala
cat /proc/version #查看Linux系統內核版本信息
cat /home/hadoop/word.txt #把/home/hadoop/word.txt這個文件全部內容顯示到屏幕上
cat file1 file2 > file3 #把當前目錄下的file1和file2兩個文件進行合併生成文件file3
head -5 word.txt #把當前目錄下的word.txt文件中的前5行內容顯示到屏幕上
cp /home/hadoop/word.txt /usr/local/ #把/home/hadoop/word.txt文件複製到“/usr/local”目錄下
rm ./word.txt #刪除當前目錄下的word.txt文件
rm –r ./test #刪除當前目錄下的test目錄及其下面的所有文件
rm –r test* #刪除當面目錄下所有以test開頭的目錄和文件

tar -zxf ~/下載/spark-2.1.0.tgz -C /usr/local/ #把spark-2.1.0.tgz這個壓縮文件解壓到/usr/local目錄下
mv spark-2.1.0 spark #把spark-2.1.0目錄重新命名爲spark
chown -R hadoop:hadoop ./spark # hadoop是當前登錄Linux系統的用戶名,把當前目錄下的spark子目錄的所有權限,
#賦予給用戶hadoop
ifconfig #查看本機IP地址信息
exit #退出並關閉Linux終端

◉ Vim編輯器命令:

sudo apt-get install vim
vim word.txt
按Esc退出編輯   i編輯
:x 或 :wq 回車,保存後退出
:q 回車,不保存並退出
:q! 回車,不保存並強制退出

每次重新啓動虛擬機,或者在不同的地方(實驗室或者宿舍)啓動虛擬機,IP地址都可能會發生變化,所以每次登錄Ubuntu系統以後,都需要重新查詢IP地址 = “inet地址”。

◉ virtual box怎麼全屏顯示?

 啓動Linux系統後,在虛擬機窗口的“設備”處選擇“安裝增強功能”,點擊“運行”後會彈出授權窗體,安裝後即可全屏。

一陣子不用虛擬機就忘怎麼操作。

◉ 關於Linux下JDK:

$ which java 查看JDK的安裝路徑/usr/java/jdk/jdk1.8.0_172/

$ rm -rf /usr/java/jdk/jdk1.8.0_172/ 卸載JDK,並如下圖所示,在~/.bashrc文件中把相關JAVA_HOME的配置信息刪除。

$ java -version$ java$ javac 檢查JDK版本,即檢查是否存在JDK

始終無法自如更換JDK版本,網上多半說的是這種方法:https://blog.csdn.net/apple_4872330/article/details/104615894?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-3

我覺得我的方法更簡單 ↓

實驗一 安裝Hadoop(黑字基本都是廢話,往下拉有推薦鏈接和我踩過的坑

一、實驗目的

   1. 掌握Linux虛擬機安裝方法或者雙操作系統安裝方法。Hadoop在Linux操作系統上運行可以發揮最佳性能,鑑於目前很多讀者可能正在使用Windows操作系統,因此,爲了完成本書的後續實驗,這裏有必要通過本實驗讓讀者掌握在Windows操作系統上搭建Linux虛擬機的方法,以及安裝雙操作系統的方法(同時安裝Windows和Linux系統,電腦開機時,可以選擇登錄哪個系統)。

   2. 掌握Hadoop的僞分佈式安裝方法。很多讀者並不具備集羣環境,需要在一臺機器上模擬一個小的集羣,因此,需要通過本實驗讓讀者掌握在單機上進行Hadoop的僞分佈式安裝方法。

(實驗一就是讓僞分佈式安裝Hadoop,我見有些同學用Win10的Linux子系統(不裝虛擬機和雙系統的方法)來做此實驗,也不失爲一種很好的選擇,推薦這篇博文:手把手教你啓用Win10的Linux子系統(超詳細)https://blog.csdn.net/zhangdongren/article/details/82663977

二、實驗平臺

       操作系統:Windows系統或者Ubuntu(或CentOS7)。

       虛擬機軟件:推薦使用的開源虛擬機軟件爲VirtualBox 。VirtualBox是一款功能強大的免費虛擬機軟件,它不僅具有豐富的特色,而且性能也很優異,簡單易用,可虛擬的系統包括Windows、Mac OS X、Linux、OpenBSD、Solaris、IBM OS2甚至Android 4.0系統等操作系統。讀者可以在Windows系統上安裝VirtualBox軟件,然後在VirtualBox上安裝並且運行Linux操作系統。本次實驗默認的Linux發行版爲Ubuntu14.04。

三、實驗內容和要求

       讀者需要構建起Linux系統環境,並在Linux系統上安裝Hadoop。

       構建Linux系統環境,有兩種方式:(1)在Windows系統上安裝Linux虛擬機;(2)安裝雙操作系統,即在電腦上同時安裝Windows和Linux系統,電腦開機時,可以選擇登錄哪個系統。

       建議電腦比較新或者配置內存4G以上的電腦可以選擇虛擬機安裝,電腦較舊或配置內存小於等於4G的電腦強烈建議選擇雙系統安裝,否則,在配置較低的計算機上運行LInux虛擬機,系統運行速度會非常慢。鑑於目前讀者的計算機硬件配置一般不高,建議採用雙系統安裝。

        建議讀者在完成下列實驗之前,仔細閱讀網絡教程:林子雨老師的blog是我目前看到最簡潔明瞭的,務必看!

      2015年出的教程:http://dblab.xmu.edu.cn/blog/285/ 

      針對3.1.3新版出的教程:http://dblab.xmu.edu.cn/blog/2441-2/

        注意:Hadoop版本不同,操作方式會有些許不同!

3.1 下載相關軟件

        如果讀者正在使用Linux操作系統,可以跳過本步,不需要下載相關軟件。如果讀者正在使用Windows操作系統,並且選擇虛擬機方式安裝Linux系統,請下載VirtualBox虛擬機軟件和Ubuntu14.04鏡像文件。同時到Apache Hadoop官網下載Hadoop2.7.1版本安裝文件。

3.2 安裝Linux系統

        讀者可以選擇下面兩種方式中的一種方式來安裝Linux系統。

3.2.1 虛擬機方式

        如果讀者正在使用Linux操作系統,則不需要了解Windows系統上的Linux虛擬機安裝方法。如果讀者正在使用Windows操作系統,則需要在Windows系統上安裝Linux虛擬機。首先,在Windows系統上安裝虛擬機軟件VirtualBox;然後,在虛擬機軟件VirtualBox上安裝Ubuntu14.04操作系統。

3.2.2 雙系統方式

        在電腦上同時安裝Windows和Linux系統,電腦開機時,可以選擇登錄哪個系統。可以參考“百度經驗”中的安裝指南。

        第一步:製作安裝U盤

        根據下面指南,在一個U盤上製作啓動安裝盤,然後,電腦啓動後,就可以從U盤啓動安裝Ubuntu系統。

        http://jingyan.baidu.com/article/59703552e0a6e18fc007409f.html

        第二步:雙系統安裝

        請根據下面指南完成雙系統安裝:

        http://jingyan.baidu.com/article/dca1fa6fa3b905f1a44052bd.html

3.3 進行Hadoop僞分佈式安裝

        在Linux環境下完成僞分佈式環境的搭建,並運行Hadoop自帶的WordCount實例檢測是否運行正常。


我的配置:Ubuntu18.04.3LST + Hadoop3.1.3 + JDK-Linux-14.0.1

我踩過的坑:namenode格式化後,既沒有Data文件夾,也無法啓動DataNode進程

明明按照林子雨老師的步驟一步步做的o(≧口≦)o 很多同學都沒有遇到我這類問題,是人品的關係嗎。。。

但我的輸出結果如下 ↓

用林子雨老師的方法無效

百度失敗

嘗試Hadoop2.7.7(有些同學就沒問題)不僅沒有DataNode和SecondaryNameNode還報錯 _(:з)∠)_

終於迎來了問題的突破口!

我看了這篇文章,文末解決了我的問題:https://www.cnblogs.com/zhangyinhua/p/7647686.html#_label0

問題解決後的運行結果 ↓

驗證Hadoop是否啓動成功?

以前的版本訪問MapReduce的頁面:http://localhost:50030  HDFS的頁面:http://localhost:50070        

3.x的版本訪問Hadoop Administration:http://localhost:9870

實驗二 HDFS編程

一、實驗目的

      熟悉HDFS操作常用的Java API。

二、實驗平臺

      操作系統:Linux

      Hadoop版本:2.6.0或以上版本

      JDK版本:1.6或以上版本

      Java IDE:Eclipse

三、實驗內容和要求

      在完成以下實驗之前,請認真閱讀“大數據課程學生服務站”的學習指南欄目中的相關內容,具體請參見《大數據技術原理與應用 第三章 Hadoop分佈式文件系統 學習指南》,

      2015年出的教程: http://dblab.xmu.edu.cn/blog/290-2/

      2020年出的教程:http://dblab.xmu.edu.cn/blog/2460-2/

  1. 編寫一個Java程序,打開一個HDFS中的文件,並讀取其中的數據,輸出到標準輸出;
  2. 編寫一個Java程序,新建一個HDFS文件,並向其中寫入你的名字;
  3. 編寫一個Java程序,判斷HDFS上是否存在某個文件?

      要求:在實驗報告中,給出實驗過程的一些必要截圖,並附上源代碼。


裝Ubuntu時警告10G磁盤空間快見底了,我還沒裝什麼軟件吶。。。

我參考了這些文章:

VirtualBox 擴展虛擬硬盤容量 https://blog.csdn.net/ganshuyu/article/details/17954733

注*:我$partprobe會報Warning,在別的博文裏看到:使用partprobe重載分區只能是對不同的硬盤才能及時生效。對於同一塊硬盤,修改過分區信息後,必須重啓系統才能使修改過的分區信息生效。

控制器SATA和IDE是什麼? https://zhidao.baidu.com/question/49756416.html

VBOX UBUNTU虛擬機擴容方案 虛擬分配空間轉換爲實際分配空間 將新開闢的/dev/sda2掛載到用戶下面https://www.freesion.com/article/959318019/

VMware+Ubuntu18.04 磁盤擴容 用GParted工具將/dev/sda1與/dev/sda2合併https://blog.csdn.net/lhl_blog/article/details/86636217

我用了最後一篇的方法,主要是簡單,還有我不知道掛載到用戶下面的/dev/sda2怎麼用(怎麼改軟件默認下載路徑)。

        掛載是指給磁盤分區(包括被虛擬出來的磁盤分區)分配一個盤符。在第三方軟件,如磁盤分區管理軟件、虛擬磁盤軟件中,也附帶有掛載功能。在linux操作系統中,掛載是指將一個設備(通常是存儲設備)掛接到一個已存在的目錄上。我們要訪問存儲設備中的文件,必須將文件所在專的分區掛載到一個已存在的目錄上,然後通過訪問這個目屬錄來訪問存儲設備。

        

        新版Ubuntu自帶“磁盤”工具,和另外下載的GParted功能一樣,所以也可以不下載GParted。

我又踩坑了:沒注意看上半部分教程,搞了半天沒理解/user/hadoop目錄哪來的?5個文件怎麼被執行?所以一定要認真看林子雨老師的教程 ↓

林子雨老師給的示例:在目錄“hdfs://localhost:9000/user/hadoop”下先上傳5個文件file1.txt、file2.txt、file3.txt、file4.abc和file5.abc,要求從該目錄中過濾出所有後綴名不爲“.abc”的文件,對過濾之後的文件進行讀取,並將這些文件的內容合併到文件“hdfs://localhost:9000/user/hadoop/merge.txt”中。

示例結果:

實驗結果:

把 f.txt 先上傳到HDFS的“/user/”目錄下

①只讀取了一行,想全部讀取可以寫個for循環。

②把全部內容改寫成“Hello world”。

③檢查文件是否存在。

實驗三 HBase編程

一、實驗目的

        1. 理解HBase在Hadoop體系結構中的角色;

        2. 熟練使用HBase操作常用的Shell命令;

        3. 熟悉HBase操作常用的Java API。

二、實驗平臺

        操作系統:Linux

        Hadoop版本:2.6.0或以上版本

        HBase版本:1.1.2或以上版本

        JDK版本:1.6或以上版本

        Java IDE:Eclipse

三、實驗內容和要求

我的配置:Ubuntu18.04.3LST + Hadoop3.1.3 + JDK-Linux-14.0.1 + HBase-2.2.5

        2020年出的教程:http://dblab.xmu.edu.cn/blog/2442-2/

        1. 根據上面給出的表格,用Hbase Shell模式設計student學生表格。

            a)設計完後,用scan指令瀏覽表的相關信息,給出截圖。

            b)查詢zhangsan 的Computer成績。給出截圖。

            c)修改lisi的Math成績,改爲95。給出截圖。

        2. 根據上面已經設計出的student,用Hbase API編程。

            a)添加數據:English:45 Math:89 Computer:100

            b)獲取scofield的English成績信息 


命令'vim'可在'usr/bin/vi/處找到 由於/usr/bin不在PATH環境變量中,故無法找到該命令。

命令'lesspipe'可在以下位置找到... 由於/bin:/usr/bin不在PATH環境變量中,故無法找到該命令。

解決方法:檢查 ~/.bashrc 文件,路徑是否寫對。

一定要記得關HBase和Hadoop,不然再次打開時就會報錯!

在HBase shell中出現error: KeeperErrorCode = NoNode for /hbase/master

參考:https://blog.csdn.net/shijinxin3907837/article/details/101544390

解決方法:在沒有重要文件得情況下,刪除tmp文件夾,重新初始化

實驗代碼:

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
 
public class hbase_insert {

      //三個靜態成員對象
	  public static Configuration configuration;//管理HBase的配置信息
      public static Connection connection;//管理HBase的連接
      public static Admin admin;  //管理HBase數據庫的表信息
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		 configuration  = HBaseConfiguration.create();//使用默認的HBase配置文件創建configuration          configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase");//連接hbase
         try{
             connection = ConnectionFactory.createConnection(configuration);
             admin = connection.getAdmin();
         }catch (IOException e){
             e.printStackTrace();
         }
         try {//插入的信息
			insertRow("student","scofield","score","English","45");
			insertRow("student","scofield","score","Math","89");
			insertRow("student","scofield","score","Computer","100");
		} catch (IOException e) {//異常處理
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
         close();
	}
	 public static void insertRow(String tableName,String rowKey,String colFamily,
			 String col,String val) throws IOException {
         Table table = connection.getTable(TableName.valueOf(tableName));
         Put put = new Put(rowKey.getBytes());
         put.addColumn(colFamily.getBytes(), col.getBytes(), val.getBytes());
         table.put(put);
         table.close();
     }
      //關閉連接
	  public static void close(){
            try{
                if(admin != null){
                    admin.close();
                }
                if(null != connection){
                    connection.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
     }
}

實驗結果:

參考:大數據——四種數據庫(MySQL,HBase,MongoDB,Redis)操作實例總結https://blog.csdn.net/weixin_43042683/article/details/106230370

先開Hadoop→HBase(最不方便的是中途你最好不要寫錯一個字,不然很容易報錯)→先關HBase→Hadoop

① 用Hbase Shell模式設計student學生表格,用scan指令瀏覽表的相關信息

②查詢 zhangsan 的Computer成績

③修改 lisi 的Math成績,改爲95

④用Hbase API編程,添加數據:English:45 Math:89 Computer:100

⑤獲取 scofield 的English成績信息

實驗四 MapReduce編程

一、實驗目的

        1. 理解Hadoop中MapReduce模塊的處理邏輯

        2. 熟悉MapReduce編程

二、實驗平臺

        操作系統:Linux

        工具:Eclipse或者Intellij Idea等Java IDE

三、實驗內容和要求

      2020年出的教程:http://dblab.xmu.edu.cn/blog/2481-2/

        1. 在電腦上新建文件夾input,並input文件夾中創建三個文本文件:file1.txt,file2.txt,file3.txt

            三個文本文件的內容分別是:

            file1.txt: hello dblab world

            file2.txt: hello dblab hadoop

            file3.txt: hello mapreduce

        2. 啓動hadoop僞分佈式,將input文件夾上傳到HDFS上

        3. 編寫mapreduce程序,實現單詞出現次數統計。統計結果保存到hdfs的output文件夾。

        4. 獲取統計結果(給出截圖或相關結果數據)


實驗代碼:

import java.io.IOException;
import java.util.Iterator;
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;
import org.apache.hadoop.util.GenericOptionsParser;

public class WordCount {
    public WordCount() {
    }
     public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        String[] otherArgs = (new GenericOptionsParser(conf, args)).getRemainingArgs();
        if(otherArgs.length < 2) {
            System.err.println("Usage: wordcount <in> [<in>...] <out>");
            System.exit(2);
        }
        Job job = Job.getInstance(conf, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(WordCount.TokenizerMapper.class);
        job.setCombinerClass(WordCount.IntSumReducer.class);
        job.setReducerClass(WordCount.IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class); 
        for(int i = 0; i < otherArgs.length - 1; ++i) {
            FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
        }
        FileOutputFormat.setOutputPath(job, new Path(otherArgs[otherArgs.length - 1]));
        System.exit(job.waitForCompletion(true)?0:1);
    }
    public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable> {
        private static final IntWritable one = new IntWritable(1);
        private Text word = new Text();
        public TokenizerMapper() {
        }
        public void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString()); 
            while(itr.hasMoreTokens()) {
                this.word.set(itr.nextToken());
                context.write(this.word, one);
            }
        }
    }
public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable();
        public IntSumReducer() {
        }
        public void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
            int sum = 0;
            IntWritable val;
            for(Iterator i$ = values.iterator(); i$.hasNext(); sum += val.get()) {
                val = (IntWritable)i$.next();
            }
            this.result.set(sum);
            context.write(key, this.result);
        }
    }
}

實驗結果:

①編寫mapreduce程序,實現單詞出現次數統計。

②在電腦上新建文件夾input,並input文件夾中創建三個文本文件:file1.txt,file2.txt,file3.txt,啓動hadoop僞分佈式,將input文件夾上傳到HDFS上

③統計結果保存到hdfs的output文件夾。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章