高 巖
河南理工大學計算機科學與技術學院數據科學系 河南 焦作 454003
大數據編程相關的課程主要包括:HDFS,MapReduce,YARN,Spark,Storm,Hive,HBase等內容[1]。所涉及的大量的計算機基礎知識包括:Linux系統原理,計算機組成原理,網絡組成,數據庫原理,面向對象程序設計等內容。對于上課學生的基礎都提出了極高的要求,往往存在一邊上課,一邊“填空”的情況。另一方面,為了改變“老師講,學生聽;教師問,學生答,動手練”的教學模式,我國的高校正在大量壓縮理論教學時長,轉而可以將更多精力放在實踐過程中。面向對象程序課程中JAVA、PYTHON語言在大數據編程方面也存在大量的應用[2]。因此,教學過程中的需要按照大數據的要求進行相應的調整,并大量壓縮課時。
JAVA程序設計相關課程是計算機專業的基礎課程之一,也是重要的核心課程[3]。一般而言,這門的主要教學目標有三:1、熟練掌握JAVA語言的基本語法,能夠較為深入理解面向對象程序設計機制,可以熟練掌握類的設計;2、掌握JAVA標準版的API使用方法,掌握常用系統類、異常處理相關類、容器集合類、輸入輸出類、多線程類;3、能過圖形用戶界面介紹頁面布局、事件響應等知識為后續網絡前端設計提供基礎;在網絡編程方面,介紹SOCKET的概念,進一步深化IO流及多線程的相關知識,為后續的服務池管理提供前期模型,能過相關的項目的練習培養良好編程習慣,并讓學生具備編寫一定規模簡易程序的能力,為后續軟件工程、web編程的相關課程打下基礎。
對于普通計算機專業而言,繼續學習數據庫相關技術、JDBC、Servlet、Ajax、Spring MVC、HTML5等相關課程,讓學生具有較為完整的web網站全棧開發能力,其學生重點發展方向為網站前、后臺系統整合能力。
Hadoop兩大核心就是HDFS(Hadoop Distributed File System)分布式文件系統和 MapReduce(并行計算框架)[5]。
HDFS系統可以通過其中核心元祖類FileSystem的不同的HDFS實現子類實例化對象實現接入。這些實現子類包含:Apache Hadoop,Aliyun OSS,Amazon S3,Azure Blob Storage,Azure Data Lake Storage,OpenStack Swift,Tencent COS這些Hadoop兼容的文件系統完成。HDFS要求具體的實現文件系統滿足(部分滿足)LINUX文件系統的POSIX標準[6]。
MapReduce是非常容易上手的一個軟件框架,它主要是利用其并行計算能力在由數千個廉價計算結點組成的高可靠計算集群之上進行TB級海量數據的運算。一個MapReduce的Job可以分為兩大部分:Map和Reduce。在數據輸入端,Map Redce分將數據集的分割成相互獨立小份,再將每一小份送至完全并行的Map任務當中。從輸出端來看,這個框架可以將這個Job中Map的輸出進行排序,而后轉化為后續的Reduce任務的輸入,最后進行輸出。通常來說,整個Job的輸入與輸出是存儲的文件系統中的文件。Map Reduce這個框架的核心即是Job內任務的編排、監視及任務失敗后的重啟。整個Hadoop框架是由JAVA實現的,因此,使用面向對象程序語言JAVA的程序在Map Reduce框架中運行有著天然親合性[7]。
HDFS文件系統是一個類似于UNIX實現的文件系統。對于HDFS文件系統的文件、文件夾對象,使用PATH對象進行封裝。其中對于路徑的描述是與常用的WINDOWS中對于文件系統的描述存在著差異,如層次文件系統以“/”根目錄開始且不能重命名、不被覆蓋,無盤符概念;更加嚴格的權限檢查,也就是說一個調用者若沒有相應許可,其程序操作將會拒絕而失敗,且同時拋出一個異常對象;通常需要使用URI地址,即統一資源標志符Universal Resource Inde,在某一規則下能把一個資源獨一無二地標識出來。我們所熟知的統一資源定位符URL是其子集;有些文件系統如Azure blob存儲文件中不能使用嵌入字符“.”等。在有了HDFS聯結對象(FileSystem對象)及HDFS文件管理對象(PATH對象)之后,使用FileSystem對象的Open方法產生一個FSDataInputStream實例,這里的org.apache.hadoop.fs.FSDataInputStream是java.io.DataInputStream及java.io.InputStream的子類;或使用create、append等方法產生一個FSDataOutput-Stream實例,這里org.apache.hadoop.fs.FSDataOutputStream是java.io.DataOutputStream與java.io.OutputStream的子類。只有找到這個接口,才能將HDFS文件系統的讀寫IO代碼接入HDFS文件系統當中。這一個過程與JDBC及Socket編程方法十分類似,里面涉及大量對象序列化、反序列化、對象之間的比較、對象HashCode設定、IO處理流、節點流相關的知識。
另一方面,MapReduce的框架唯一可以進行操作的是一些Key-Value對,也就是說,從框架的角度來看,整個Job的輸入是若干Key-Value對的集合,其輸出也是若干Key-Value對的集合。不同的Job使用不同的數據類型,但整個運算框架是一致的。第一、MapReduce的框架中,JAVA中的基礎數據類型及包裝類類型不同的是:Map Reduce中用于Key-Value的數據類型類必須是被框架進行串行化處理的,具體來說就是要實現Writable接口,對于用于Key數據類型類必須實現WritableComparable接口以配合框架完成排序工作。在Hadoop中主要的數據類型包括了:BooleanWritable:布爾型數值、ByteWritable:單字節整型值、DoubleWritable:雙精度浮點數、floatWritable:單精度浮點數、IntWritable:整型值、LongWritable:長整型值、Text:使用UTF8格式存儲的文本、NullWritable:當<key,value>中的key或value為空時使用,分別對應JAVA 程序中的Boolean,Byte,Double,Float,Integer,Long,String和 null用來處理MapReduce框架中傳遞的數據。第二、在MapReduce框架中大量使用泛型接口、泛型類和泛型方法,但在基礎語法中僅僅在容器類中出現。但是在實際的編程過程中,我們需要引導學生自己去使用泛型簡化開發程序,且提高代碼質量。第三、在Rreduce方法輸入Key-Value中Value是一個包含同一類型的list,但對于Key則沒有這個要求。這個框架可以重用reduce輸入的Key與Value對象,因此,這個應用可以克隆希望可以拷貝的對象。綜上可見,MapReduce的框架當中對于抽象類、接口、包裝類對象、容器類,泛型、迭代器有了廣泛地使用。
通常來說,JAVA程序設計相關課程中的主講內容多為:面向對象編程設計思相、類、接口、常用類、異常類、IO、容器類、多線程、網絡編程與圖形界面等內容。對于Hadoop這樣的集群管理并行計算系統,使用JAVA編程是一種可行的選擇,但在教學過程中還需要強調對象序列化、反序列化、對象之間的比較、對象HashCode設定、IO處理流、節點流相關的知識、于抽象類、接口、包裝類對象、容器類,泛型、迭代器等內容。若時間有限的情況下,可適當刪減多線程、網絡編程與圖形界面等部分的內容。