前言
寫這篇文章的目的,主要是為了記錄一下這次作業(yè)歷程,并且筆者了解到很多同志飽受作業(yè)折磨,遂簡單分享一下個人完成作業(yè)的歷程,以下內(nèi)容僅為本人的一些亂七八糟的想法,僅作參考O(∩_∩)O
作業(yè)要求
1、本作業(yè)的鏈接
【完成本次作業(yè)用到的代碼文件,列出網(wǎng)盤鏈接,https://pan.baidu.com/xxx】
2、數(shù)據(jù)來源及概述
【1.列出數(shù)據(jù)的下載鏈接,或者說明數(shù)據(jù)的采集方法。2.概述數(shù)據(jù)的背景與內(nèi)容。3.概述數(shù)據(jù)的 Volume和 Variety?!?/p>
3、數(shù)據(jù)存儲與管理方案
【列出數(shù)據(jù)存儲與管理的設計方案,包括:HBase、MongoDB、MapReduce?!?/p>
4、數(shù)據(jù) 存儲與管理結(jié)果
【1.詳述數(shù)據(jù)存儲與管理的結(jié)果,詳述數(shù)據(jù)的 Veracity 和 Velocity。2.給出必要的截圖,每個圖表都要有相應的文字說明。3.列出遇到的問題和解決辦法,列出沒有解決的問題?!?/p>
5、本作業(yè)的體會
【完成本次作業(yè)的心得體會。】
思路過程
1、本作業(yè)的代碼文件鏈接
本次作業(yè)代碼文件的網(wǎng)盤鏈接如下:
鏈接:數(shù)據(jù)自取
提取碼:6666
2、數(shù)據(jù)來源及概述
本次作業(yè)的原始數(shù)據(jù)是在 kaggle 上找的開源的亞馬遜餐飲評論數(shù)據(jù)集,數(shù)據(jù)集是由幾個學者共同收集的,該數(shù)據(jù)集包含對亞馬遜不同美食的評論。數(shù)據(jù)跨度超過 10 年,包括截至 2012 年 10 月的所有 500000 條評論。評論包括產(chǎn)品、用戶信息、評級和純文本評論,它還包括來自所有其他亞馬遜類別的評論。數(shù)據(jù)集一共包含 568454 條數(shù)據(jù),數(shù)據(jù)量可觀,數(shù)據(jù)大小(Volume)為 287MB。該數(shù)據(jù)集包含 10 個屬性,分別為序號、產(chǎn)品編號、用戶編號、用戶名、認為評價有幫助的用戶數(shù)量、表示評價是否有幫助的用戶數(shù)量、用戶評分、評分時間、評論的概括以及詳細評論內(nèi)容。此外,該數(shù)據(jù)集為純文本類型(Variety),類型單一,原本我打算使用一個圖片數(shù)據(jù)集,但是數(shù)據(jù)質(zhì)量不夠好,比較雜亂,于是我依然采用文本類型的數(shù)據(jù)集完成作業(yè)。
3、數(shù)據(jù)存儲與管理方案
HBase
Hbase是一種分布式存儲的數(shù)據(jù)庫,內(nèi)部架構包含ZooKeeper、Master、HDFS,HBase 采用表來組織數(shù)據(jù),表由行和列組成,列劃分為若干個列族,每個 HBase表都由若干行組成,每個行由行鍵來標識。選用 HBase 存儲并管理數(shù)據(jù),HDFS 有
高容錯、高擴展的特點,而 Hbase 基于 HDFS 實現(xiàn)數(shù)據(jù)的存儲,因此 Hbase 擁有與生俱來的超強的擴展性和吞吐量。同時,由于 HBase 是一個列式數(shù)據(jù)庫,當單張表字段很多的時候,可以將相同的列存在到不同的服務實例上,分散負載壓力。我將數(shù)據(jù)存儲到 HBase 的方案是先將數(shù)據(jù)上傳至 HDFS,以 HDFS 為過渡,再將數(shù)據(jù)上傳至 HBase,因為 HDFS 無法很好地管理數(shù)據(jù),故采用 HBase。在對 HBase進行操作時,Zookeeper 會實時監(jiān)測每個 Region 服務器的狀態(tài),當某個 Region服務器發(fā)生故障時,Zookeeper 會通知 Master。
MongoDB
MongoDB 是NoSQL類型的數(shù)據(jù)庫,保留了關系型數(shù)據(jù)庫即時查詢的能力,保留了索引的能力。這一點汲取了關系型數(shù)據(jù)庫的優(yōu)點。同時,MongoDB 自身提供了副本集能將數(shù)據(jù)分布在多臺機器上實現(xiàn)冗余,目的是可以提供自動故障轉(zhuǎn)移、擴展讀能力,MongoDB 使用分片技術對數(shù)據(jù)進行擴展,能自動分片、自動轉(zhuǎn)移分片里面的數(shù)據(jù)塊,讓每一個服務器里面存儲的數(shù)據(jù)都是一樣的大小。在使用 HBase 上傳數(shù)據(jù)后,我沒有找到比較合適的可視化工具查看數(shù)據(jù)導入情況,而且工具的配置相對比較復雜,反觀 MongoDB,提供了很多成熟的可視化工具,方便用戶管理數(shù)據(jù)。同時,搭建一個分布式的 HBase 集群,需要進行安裝Java、配置 SSH 免密登錄、配置 NTP 時鐘同步、安裝匹配版本的 Hadoop、安裝匹配版本的 Zookeeper、安裝 HBase 等一系列繁瑣操作,而安裝 MongoDB 只需要對安裝包進行解壓,并進行一些必要配置即可。MongoDB 在實際管理數(shù)據(jù)時可以通過創(chuàng)建索引來提高查詢效率,我先將數(shù)據(jù)上傳至 MongoDB,然后在 adminMongo可視化工具對數(shù)據(jù)進行修改或者整理,實現(xiàn)管理數(shù)據(jù)的目的。
MapReduce
MapReduce 是一種編程模型,用于大規(guī)模數(shù)據(jù)集的并行運算,指定一個 Map(映射)函數(shù),用來把一組鍵值對映射成一組新的鍵值對,指定并發(fā)的 Reduce(歸約)函數(shù),用來保證所有映射的鍵值對中的每一個共享相同的鍵組。使用 MapReduce 自動調(diào)度計算節(jié)點來處理相應的數(shù)據(jù)塊,作業(yè)和任務調(diào)度功能主要負責分配和調(diào)度計算節(jié)點(Map 節(jié)點或 Reduce 節(jié)點),同時負責監(jiān)控這些節(jié)點的執(zhí)行狀態(tài),并負責 Map 節(jié)點執(zhí)行的同步控制。同時為了減少數(shù)據(jù)通信開銷,中間結(jié)果數(shù)據(jù)進入Reduce 節(jié)點前會進行一定的合并處理;一個 Reduce 節(jié)點所處理的數(shù)據(jù)可能會來自多個 Map節(jié)點,為了避免 Reduce 計算階段發(fā)生數(shù)據(jù)相關性,Map 節(jié)點輸出的中間結(jié)果需使用一定的策略進行適當?shù)膭澐痔幚?,保證相關性數(shù)據(jù)發(fā)送到同一個 Reduce 節(jié)點。這里我調(diào)用 java 接口,實現(xiàn)將 HDFS 中的數(shù)據(jù)寫入到 HBase 中。
4、數(shù)據(jù)存儲與管理結(jié)果
HBase
首先采用 HBase 進行數(shù)據(jù)的存儲和管理,將數(shù)據(jù)集從本地拖入虛擬機中,首先啟動 localhost,然后逐步啟動 Hadoop 進程和 HBase 進程,先將數(shù)據(jù)傳入 HDFS中,并查看數(shù)據(jù)集是否已經(jīng)上傳至 HDFS。
隨后按照林子雨老師的教程安裝 HBase。
安裝完成后,啟動 HBase,在啟動 HBase Shell 時,一開始出現(xiàn)報錯 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
,于是我進入首 native 目錄,看看目錄下有什么東西,我發(fā)現(xiàn) libhadoop.so
存放在這個目錄下,接著回到 Hadoop 目錄,在 Hadoop 包中搜索發(fā)現(xiàn),java.library.path
被
定義為 JAVA_LIBRARY_PATH
,但是我沒有定義 JAVA_LIBRARY_PATH
。那么問題就好解決了,配置這個環(huán)境變量就行,我進入 bashrc 文件中,輸入配置環(huán)境的命令 export JAVA_LIBRARY_PATH=/usr/local/hadoop/lib/native
,保存后重新啟動 HBase Shell 報錯就消失了。解決了第一個報錯后,我進入 Shell 中,先創(chuàng)建一個表,只有一個列簇info,然后輸入命令 :
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator="," -Dimporttsv.columns="HBASE_ROW_KEY,info:Id,info:ProductId,info:UserId,info:ProfileName,info:HelpfulnessNumerator,info:HelpfulnessDenominator,info:Score,info:Time,info:Summary,info:Text" hbase-csv1 hdfs:///user/hadoop/input/FoodReviews.csv
嘗試將文件上傳至 HBase 中,但是出現(xiàn)報錯,這個問題困擾了我很久,在網(wǎng)上找各種解決方案均沒用,一直以為是語法問題,摳各種細節(jié),后來才發(fā)現(xiàn)上傳命令不能在 Shell 里面輸入,我退出 Shell 之后再重新輸入,成功上傳。
待數(shù)據(jù)上傳完成后,我使用 scan 命令查看剛剛存放數(shù)據(jù)的表,查看的時候一共耗時 564s,速度還算可以(Velocity);數(shù)據(jù)內(nèi)容豐富度是比較高的,準確性好,擁有較高的質(zhì)量 (Veracity)。我的原始數(shù)據(jù)是有 50 萬行的,但是 scan之后只能看到 10 萬行,我猜測這可能是 HBase 查看數(shù)據(jù)的上限?因為傳入 HDFS中的文件大小跟主機中的一樣,應該不存在數(shù)據(jù)損壞或者有部分數(shù)據(jù)未上傳的情況,因此這對我來說是一個疑點。
MongoDB
其次,我使用 MongoDB 進行數(shù)據(jù)的管理,先將 MongoDB 安裝好,這里我采用的是 MongoDB 官網(wǎng)的教程,安裝完成后,啟動 MongoDB 時出了點問題,報錯細節(jié)為 Failed to start mongodb service: Unit mongodb.service not found
,后來我發(fā)現(xiàn)我沒有配置好 MongoDB,于是創(chuàng)建配置文件并追加文本,保存后退出重新啟動 MongoDB 成功。
隨后啟動 MongoDB Shell,創(chuàng)建一個新的數(shù)據(jù)庫,命名為 food,為了能使 show dbs 命令出現(xiàn)剛創(chuàng)建的數(shù)據(jù)庫,我插入一條數(shù)據(jù)并查看,判斷沒問題之后關閉MongoDB Shell,開始將文件導入 MongoDB。
導入數(shù)據(jù)文件時,要注意前提是已經(jīng)啟動 MongoDB,并且不需要進入 MongoDB Shell 執(zhí)行命令,導入成功后顯示如下的界面。前幾次上傳過程會出現(xiàn)報錯Failed: fields cannot be identical: '1' and '1'
,網(wǎng)上找了原因,可能是csv 格式問題,于是將 excel 文件另存為 utf-8 格式的 csv 格式,重新拖入虛擬機并重新上傳,沒用。于是另找原因,這時我想到命令有一個參數(shù)是--headerline
,而我的數(shù)據(jù)集最頂上的屬性行之前被我刪了(為了方便上傳至HBase),我把它補回去,重新上傳,成功了!
將數(shù)據(jù)導入 MongoDB 后,我想使用可視化工具查看導入情況,于是著手安裝mongo-express 和 adminMongo 工具。安裝這兩個工具都需要先下載 node.js,所以我在本地主機下載好 node.js 相應的版本,然后拖入虛擬機,先在/usr/local
路徑下創(chuàng)建 node 文件夾,將 node 文件的所有權限賦給 hadoop 用戶,隨后進入node 目錄下,將 node.js 的壓縮包復制到該目錄下并解壓,之后再配置環(huán)境,通過 node -v
和 npm -v
命令測試 node 是否安裝成功,同時查看對應版本號。
安裝了 node.js 后,安裝 mongo-express,安裝完成并且修改好配置文件后,在火狐瀏覽器打開 http://localhost:8081
,在彈出的對話框中輸入默認的用戶名和密碼 User Name:admin,Password:pass
,點擊 test 進入查看。
然而我個人更喜歡 adminMongo 的界面,因此我又安裝了 adminMongo,安裝完成后將其啟動,并在瀏覽器中輸入 http://0.0.0.0:1234,在彈出的頁面中Connection name
輸入 mongodb
,Connection string
輸入 mongodb://127.0.0.1
,
點擊 Add connection
,最后點擊 connect
進行數(shù)據(jù)查看??梢钥吹?,數(shù)據(jù)完美地展現(xiàn)出來,跟 csv 文件中的一致,內(nèi)容豐富,質(zhì)量高,適合用于數(shù)據(jù)挖掘和數(shù)據(jù)分析(Veracity),但我還未嘗試過,打算后續(xù)用 python 分析一下數(shù)據(jù)。
MapReduce
其實在前面將數(shù)據(jù)傳入 HBase 的時候,已經(jīng)間接地使用了 MapReduce,對數(shù)據(jù)進行一些計算,保證上傳成功。我在 HBase 創(chuàng)建一個新的表,然后將 HDFS 中的文件導入至 HBase 中,這里我使用 Eclipse 進行實現(xiàn),通過調(diào)用 java API,對數(shù)據(jù)進行管理。
(1)新建類用于讀取 HDFS 上的數(shù)據(jù)
package com.xzw.hbase_mr;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapper;
import java.io.IOException;
public class ScanDataMapper extends TableMapper<ImmutableBytesWritable, Put> {
@Override
protected void map(ImmutableBytesWritable key, Result result, Context context) throws IOException,
InterruptedException {
//運行Mapper,查詢數(shù)據(jù)
Put put = new Put(key.get());
for (Cell cell :
result.rawCells()) {
put.addColumn(
CellUtil.cloneFamily(cell),
CellUtil.cloneQualifier(cell),
CellUtil.cloneValue(cell)
);
}
context.write(key, put);
}
}
(2)新建類用于將讀到的數(shù)據(jù)寫入 HBase 表
package com.xzw.hbase_mr;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableReducer;
import org.apache.hadoop.io.NullWritable;
import java.io.IOException;
public class InsertDataReducer extends TableReducer<ImmutableBytesWritable, Put, NullWritable> {
@Override
protected void reduce(ImmutableBytesWritable key, Iterable<Put> values, Context context) throws IOException,
InterruptedException {
//運行Reducer,增加數(shù)據(jù)
for (Put put :
values) {
context.write(NullWritable.get(), put);
}
}
}
(3)新建類用于組裝運行 job 任務
package com.xzw.hbase_mr;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.JobStatus;
import org.apache.hadoop.util.Tool;
public class HBaseMapperReduceTool implements Tool {
public int run(String[] strings) throws Exception {
//作業(yè)
Job job = Job.getInstance();
job.setJarByClass(HBaseMapperReduceTool.class);
//mapper
TableMapReduceUtil.initTableMapperJob(
"xzw:people",
new Scan(),
ScanDataMapper.class,
ImmutableBytesWritable.class,
Put.class,
job
);
//reducer
TableMapReduceUtil.initTableReducerJob(
"xzw:user",
InsertDataReducer.class,
job
);
//執(zhí)行作業(yè)
boolean b = job.waitForCompletion(true);
return b ? JobStatus.State.SUCCEEDED.getValue(): JobStatus.State.FAILED.getValue();
}
public void setConf(Configuration configuration) {
}
public Configuration getConf() {
return null;
}
}
(4)新建類用于啟動程序文章來源:http://www.zghlxwxcb.cn/news/detail-467979.html
package com.xzw.hbase_mr;
import org.apache.hadoop.util.ToolRunner;
public class T2TApplication {
public static void main(String[] args) throws Exception {
ToolRunner.run(new HBaseMapperReduceTool(), args);
}
}
五 、 本作業(yè)的體會
完成了第二次的大數(shù)據(jù)處理作業(yè)后,我感慨萬千。這次作業(yè)耗費了我?guī)缀跻恢艿臅r間,完成作業(yè)前,我沒想到它的繁瑣程度會這么大??赡苁沁€不熟悉 Linux 系統(tǒng),我在使用虛擬機的時候頻頻報錯,上傳數(shù)據(jù)總是不能非常順利,這非??简災托暮鸵懔?,因此我認為磨練意志是本次作業(yè)的一大收獲。此外,通過完成此次作業(yè),我對虛擬機的各種操作和命令更加熟悉了,之前還經(jīng)常需要查看命令怎么寫、怎么用,現(xiàn)在已經(jīng)熟練到直接在終端敲就行了,我慢慢感悟到了 Linux 的魅力,雖然說操作上還是不太適應,但我感受到了這個系統(tǒng)的自由度,以及它的強大性。希望通過不斷與數(shù)據(jù)打交道,我能有朝一日真正駕馭它。文章來源地址http://www.zghlxwxcb.cn/news/detail-467979.html
到了這里,關于大數(shù)據(jù)處理技術作業(yè)——使用HBase&MongoDB&MapReduce進行數(shù)據(jù)存儲和管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!