Hadoop大數(shù)據(jù)平臺構(gòu)建與應(yīng)用課件項(xiàng)目3就業(yè)崗位數(shù)據(jù)采集和存儲_第1頁
Hadoop大數(shù)據(jù)平臺構(gòu)建與應(yīng)用課件項(xiàng)目3就業(yè)崗位數(shù)據(jù)采集和存儲_第2頁
Hadoop大數(shù)據(jù)平臺構(gòu)建與應(yīng)用課件項(xiàng)目3就業(yè)崗位數(shù)據(jù)采集和存儲_第3頁
Hadoop大數(shù)據(jù)平臺構(gòu)建與應(yīng)用課件項(xiàng)目3就業(yè)崗位數(shù)據(jù)采集和存儲_第4頁
Hadoop大數(shù)據(jù)平臺構(gòu)建與應(yīng)用課件項(xiàng)目3就業(yè)崗位數(shù)據(jù)采集和存儲_第5頁
已閱讀5頁,還剩109頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Hadoop大數(shù)據(jù)平臺構(gòu)建與應(yīng)用Hadoop大數(shù)據(jù)1項(xiàng)目3就業(yè)崗位數(shù)據(jù)采集和存儲項(xiàng)目32任務(wù)3.1使用網(wǎng)絡(luò)爬蟲采集崗位招聘數(shù)據(jù)A任務(wù)3.2采集的數(shù)據(jù)上傳到HDFSB任務(wù)3.3使用Sqoop轉(zhuǎn)換Mysql中的學(xué)生成績數(shù)據(jù)到Hive中C項(xiàng)目描述任務(wù)3.1使用網(wǎng)絡(luò)爬蟲采集崗位招聘數(shù)據(jù)A任務(wù)3.2采集的3任務(wù)3.1使用網(wǎng)絡(luò)爬蟲采集崗位招聘數(shù)據(jù)【知識目標(biāo)】●識記WebMagic的流程架構(gòu)和HDFS的基礎(chǔ)架構(gòu)以及Hive的基本概念和特點(diǎn)?!耦I(lǐng)會網(wǎng)絡(luò)爬蟲的編程實(shí)現(xiàn)的步驟和方法?!炯寄苣繕?biāo)】●學(xué)會使用WebMagic開發(fā)網(wǎng)絡(luò)爬蟲的步驟和方法●學(xué)會HDFS服務(wù)進(jìn)程管理。●學(xué)會HDFS屬性配置管理?!駥W(xué)會HDFS上傳文件的方法?!駥W(xué)會Sqoop上傳文件至Hive中的方法。任務(wù)3.1使用網(wǎng)絡(luò)爬蟲采集崗位招聘數(shù)據(jù)【知識目標(biāo)】4知識準(zhǔn)備webmagic-scriptswebmagic-seleniumwebmagic-saxonwebmagic-samplesWebMagic項(xiàng)目里還有幾個包,這些都是一些實(shí)驗(yàn)性的功能,目的只是提供一些與外圍工具整合的樣例。webmagic-avalon13524WebMagic的是一個無須配置、便于二次開發(fā)的爬蟲框架,它提供簡單靈活的API,只需少量代碼即可實(shí)現(xiàn)一個爬蟲。其架構(gòu)流程如圖3-1所示。3-1WebMagic架構(gòu)圖知識準(zhǔn)備webmagic-scriptswebmagic-s任務(wù)實(shí)施

(1)解析崗位列表頁源代碼崗位信息頁后續(xù)列表分頁圖3-2崗位列表頁結(jié)構(gòu)任務(wù)實(shí)施

(1)解析崗位列表頁源代碼崗位信息頁后續(xù)列表分頁圖6這是在WebMagic框架中的PageProcessor組件中定制實(shí)現(xiàn)的,首先要做的是設(shè)置抓取的基本配置,包括編碼、抓取間隔、重試次數(shù),代碼如下:privateSitesite=Site.me().setRetryTimes(3).setSleepTime(10).setCharset("gbk");這里選擇重試次數(shù)為3次,抓取間隔為10毫秒,編碼根據(jù)為51job網(wǎng)頁源代碼可以查看得到,如下所示:<html><head><metahttp-equiv="X-UA-Compatible"content="IE=edge,chrome=1"><metahttp-equiv="Content-Type"content="text/html;charset=gbk"><linkrel="icon"href="/favicon.ico"type="image/x-icon"/><title>【云計(jì)算招聘,求職】-前程無憂</title>該招聘網(wǎng)站的編碼為gbk。這是在WebMagic框架中的PageProcessor組件7接下來,判斷當(dāng)前分析的頁面是否為崗位列表頁。不難發(fā)現(xiàn),列表頁的URL中都含有字符段,可以通過簡單的if語句判斷:if(page.getUrl().toString().contains(""))下面分析崗位信息頁鏈接的HTML源代碼,并用Xpath語法解析出,添加至抓取隊(duì)列。檢查某個鏈接源代碼的方法,在崗位列表中右擊一項(xiàng),在彈出的下拉菜單中選擇“Inspect”命令,如圖3-3所示。圖3-3選擇Inspect命令接下來,判斷當(dāng)前分析的頁面是否為崗位列表頁。不難發(fā)現(xiàn),列表頁8右擊并選擇檢查(Inspect)后,出現(xiàn)了該鏈接的HTML源碼,如圖3-4所示。圖3-4查看HTML源代碼右擊并選擇檢查(Inspect)后,出現(xiàn)了該鏈接的HTML源9可以發(fā)現(xiàn),所需要的URL地址是一個<p>標(biāo)簽下的唯一的超鏈接,該標(biāo)簽的class名為t1。同理,這個崗位列表頁下的所有崗位信息頁的URL都有著相同的格式。因此可以使用Xpath全部識別,并添加至抓取隊(duì)列,代碼實(shí)現(xiàn)如下:select=page.getHtml().xpath("http://p[@class='t1']");urls=select.links().all();page.addTargetRequests(urls);添加后續(xù)分頁的鏈接也是如上一樣的方法,在此省去分析HTML源碼的截圖,直接貼上代碼:select=page.getHtml().xpath("http://div[@class='dw_page']");urls=select.links().all();可以發(fā)現(xiàn),所需要的URL地址是一個<p>標(biāo)簽下的唯一的超鏈接10這里需要注意的是,要防止添加空白搜索結(jié)果頁的鏈接,不然將會把整個51job的崗位全都抓取下來。盡管按照定制的抓取邏輯,這種意外不會出現(xiàn),但還是添加了踢出隊(duì)列的保護(hù)機(jī)制,代碼如下:Iterator<String>it=urls.iterator(); while(it.hasNext()){ Stringx=it.next(); if(x.equals("/list/000000,000000,0000,00,9,99,%2520,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=")){ it.remove(); } } page.addTargetRequests(urls);這里需要注意的是,要防止添加空白搜索結(jié)果頁的鏈接,不然將會把11(2)解析崗位信息頁源代碼如圖3-5所示,需要抓取崗位信息頁上用紅框標(biāo)注出來的信息。方法與上一步中的類似,也是通過分析HTML源碼,再利用Xpath語法或者正則表達(dá)式去定位相關(guān)內(nèi)容.(2)解析崗位信息頁源代碼12具體的代碼如下:elseif(page.getUrl().toString().startsWith("/")){page.putField("url",page.getUrl().toString()); //崗位名稱page.putField("job",page.getHtml().xpath("http://div[@class='cn']/h1/text()").toString()); //發(fā)布日期page.putField("createtime",page.getHtml().regex("<emclass=\"i4\"></em>([^<]+)</span>").toString()); //崗位描述 page.putField("content",page.getHtml().xpath("http://div[@class='bmsgjob_msginbox']/html()").toString()); //其他可選項(xiàng) page.putField("salary",page.getHtml().xpath("http://div[@class='cn']/strong/text()").toString());具體的代碼如下:13page.putField("location",page.getHtml().xpath("http://span[@class='lname']/text()").toString()); page.putField("company",page.getHtml().xpath("http://p[@class='cname']/a/text()").toString()); page.putField("experience",page.getHtml().regex("<emclass=\"i1\"></em>([^<]+)</span>").toString()); page.putField("education",page.getHtml().regex("<emclass=\"i2\"></em>([^<]+)</span>").toString()); page.putField("number",page.getHtml().regex("<emclass=\"i3\"></em>([^<]+)</span>").toString());}page.putField("location",page14(3)根據(jù)條件保存抓取到的信息這里根據(jù)條件篩選崗位信息,比如已經(jīng)列出了一些培訓(xùn)機(jī)構(gòu)的“公司黑名單”,保存在了Dictionary類中的Blacklist靜態(tài)String數(shù)組中,那么可以用簡單的if語句來判斷:Booleanchoose=true;//判斷是否為培訓(xùn)公司發(fā)布的“垃圾”招聘信息 for(Stringi:Dictionary.Blacklist){ if(((String)resultItems.get("company")).contains(i)){ choose=false; } }對于發(fā)布日期,僅需要保留當(dāng)天發(fā)布的招聘信息,判斷代碼如下://判斷是否為當(dāng)天發(fā)布的招聘信息 if(!((String)resultItems.get("createtime")).contains(Today_Date)){ choose=false; }(3)根據(jù)條件保存抓取到的信息15其中Today_Date是一個靜態(tài)final型字符串:publicstaticfinalStringToday_Date=timeTostrMD(newDate());timeToStrMD是一個自定義獲取當(dāng)天月份和日期并返回諸如“05-05”形式字符串的方法。代碼如下:publicstaticStringtimeTostrMD(Datedate){ StringstrDate=""; if(date!=null){ SimpleDateFormatformat=newSimpleDateFormat("MM-dd"); strDate=format.format(date); } returnstrDate; }其中Today_Date是一個靜態(tài)final型字符串:16在篩選完之后,便可以將抓取內(nèi)容選擇性地保存至本地的某個文件中,這里定制的保存格式為一個崗位保存一行,每行中的信息用制表符\t分隔,最后保存在一個以日期命名的文本文件中,代碼如下:try{ //定義存儲路徑,以每天為一個文件存儲 Stringpath=this.path+PATH_SEPERATOR+timeTostrYMD(newDate())+".txt"; Filefile=getFile(path); Stringstr=resultItems.get("url") +"\t" +resultItems.get("job") +"\t" +resultItems.get("location") +"\t" +resultItems.get("company")

在篩選完之后,便可以將抓取內(nèi)容選擇性地保存至本地的某個文件中17+"\t"+resultItems.get("salary")+"\t"+resultItems.get("experience")+"\t"+resultItems.get("education")+"\t"+resultItems.get("number")+"\t"+resultItems.get("createtime")+"\t"+"\r\n"; FileUtils.writeStringToFile(file,str,"utf-8",true); }catch(IOExceptione){ logger.warn("writefileerror",e); }+"\t"18(4)運(yùn)行代碼程序WebMagic的核心組件為PageProcessor與Pipeline,通過上述步驟的講解,讀者應(yīng)該可以定制這兩個組件了,而調(diào)用這兩個核心組件是通過Spider類,簡單的代碼如下:Spider.create(newCrawlJob()) .addUrl(URL_START) .addPipeline(newPipelineJob()).thread(5).run();由于要將Java程序?qū)С鰹閖ar文件,并且需要實(shí)現(xiàn)無參傳遞(使用默認(rèn)保存路徑)和有參傳遞(使用指定保存路徑)兩種形式,因此使用main方法的代碼如下:publicstaticvoidmain(String[]args)throwsException{ StringURL_START=(4)運(yùn)行代碼程序19

"/list/000000%252C00,000000,0000,00,9,99,%25E4%25BA%2591%25E8%25AE%25A1%25E7%25AE%2597,2,1.html?lang=c°reefrom=99&stype=1&workyear=99&cotype=99&jobterm=99&companysize=99&radius=-1&address=&lonlat=&postchannel=&list_type=&ord_field=&curr_page=&dibiaoid=0&landmark=&welfare=";if(args.length==0){ Spider.create(newCrawlJob()) .addUrl(URL_START) .addPipeline(newPipelineJob()).thread(5).run(); }else{ Spider.create(newCrawlJob()) .addUrl(URL_START) .addPipeline(newPipelineJob(args[0])).thread(5).run(); }} "/list20任務(wù)3.2采集的數(shù)據(jù)上傳到HDFS任務(wù)描述1.借助學(xué)習(xí)論壇、網(wǎng)絡(luò)視頻等網(wǎng)絡(luò)資源和各種圖書資源,學(xué)習(xí)HDFS文件系統(tǒng)的使用方法。2.將利用WebMagic爬取工具爬取的招聘崗位信息上傳到HDFS文件系統(tǒng)中。任務(wù)目標(biāo)1.熟悉HDFS工作原理。2.學(xué)會文件系統(tǒng)的屬性配置方法。3.學(xué)會通過多種方式上傳文件至HDFS文件系統(tǒng)的方法。任務(wù)3.2采集的數(shù)據(jù)上傳到HDFS任務(wù)描述21知識準(zhǔn)備

在HDFS體系結(jié)構(gòu)采用Master/Slave的主從架構(gòu),如圖3-6所示,其中Master節(jié)點(diǎn)運(yùn)行NameNode進(jìn)程,Slave節(jié)點(diǎn)運(yùn)行DataNode進(jìn)程。圖3-6HDFS體系結(jié)構(gòu)知識準(zhǔn)備

在HDFS體系結(jié)構(gòu)采用Master/Slave的主22磁盤有一個BlockSize的概念,它是磁盤讀/寫數(shù)據(jù)的最小單位。文件系統(tǒng)的塊一般為幾千字節(jié)(byte),磁盤塊一般為512字節(jié)(byte)。HDFS也有Block的概念,但它的塊是一個很大的單元,是文件存儲處理的邏輯單元。默認(rèn)是64MB。像硬盤中的文件系統(tǒng)一樣,在HDFS中的文件將會按塊大小進(jìn)行分解,并作為獨(dú)立的單元進(jìn)行存儲。但和硬盤中的文件系統(tǒng)不一樣的是,存儲在塊中的一個比塊小的文件并不會占據(jù)一個塊大小的物理空間(HDFS中一個塊只存儲一個文件的內(nèi)容)。HDFS作為一個分布式文件系統(tǒng),是設(shè)計(jì)用來處理大文件的,使用抽象的塊會帶來很多好處。一個好處是可以存儲任意大的文件,而又不會受到網(wǎng)絡(luò)中任一單個節(jié)點(diǎn)磁盤大小的限制。另外一個好處是使用抽象塊作為操作的單元可簡化存儲子系統(tǒng),不僅如此,塊更有利于分布式文件系統(tǒng)中復(fù)制容錯的實(shí)現(xiàn)。在HDFS中為了處理節(jié)點(diǎn)故障,默認(rèn)將文件塊副本數(shù)設(shè)定為3份,分別存儲在集群的不同節(jié)點(diǎn)上。當(dāng)一個塊損壞時(shí),系統(tǒng)會通過NameNode獲取元數(shù)據(jù)信息,在另外的機(jī)器上讀取一個副本并進(jìn)行存儲,這個過程對用戶來說都是透明的。當(dāng)然,這里的文件塊副本冗余可以通過文件進(jìn)行配置,在HDFS中,可以通過終端命令直接獲得文件和塊信息,比如以下命令可以列出文件系統(tǒng)中組成各個文件的塊:hadoopfsck/-files-blocks磁盤有一個BlockSize的概念,它是磁盤讀/寫數(shù)據(jù)的最23任務(wù)實(shí)施(1)服務(wù)進(jìn)程管理hadoop-daemon.sh腳本是啟動和停止Hadoop后臺程序,--config參數(shù)指定啟動程序時(shí)用到的配置文件目錄。大括號中的namenode和datenode是需要啟動的進(jìn)程,兩者擇其一。命令如下:#/usr/hdp/current/hadoop-client/sbin/hadoop-daemon.sh--config/usr/hdp/current/hadoop-client/confstop{namenode/datenode}#/usr/hdp/current/hadoop-client/sbin/hadoop-daemon.sh--config/usr/hdp/current/hadoop-client/confstart{namenode/datenode}任務(wù)實(shí)施(1)服務(wù)進(jìn)程管理hadoop-daemon.sh腳(2)HDFS屬性配置core-site.xml設(shè)置Hadoop默認(rèn)文件系統(tǒng)。<property><name>fs.defaultFS</name><value>hdfs://master:8020</value></property>設(shè)置緩存的大小,這個參數(shù)要設(shè)置為系統(tǒng)頁面大小的倍數(shù),以byte為單位。<property><name>io.file.buffer.size</name><value>131072</value></property>設(shè)置HDFS的NameNode的格式化信息存儲路徑。<property><name>hadoop.tmp.dir</name><value>file:/home/hadoop/tmp</value><description>Abaseforothertemporarydirectories.</description></property>(2)HDFS屬性配置core-site.xml設(shè)置Had(2)HDFS屬性配置hdfs-site.xml設(shè)置本地文件系統(tǒng)DFSNameNode存放NameTtable的路徑。<property><name>.dir</name><value>file:///usr/hadoop/dfs/name</value></property>設(shè)置本地文件系統(tǒng)DFSDataNode存放數(shù)據(jù)Block的目錄。<property><name>dfs.datanode.data.dir</name><value>file:///usr/hadoop/dfs/data</value></property>設(shè)置HDFS文件系統(tǒng)Block的復(fù)制份數(shù)。設(shè)置為的3時(shí),HDFS就會按照設(shè)置將文件系統(tǒng)塊復(fù)制為3份。如果采用的是偽分布配置,這里參數(shù)應(yīng)設(shè)置為1,否則在單獨(dú)一個數(shù)據(jù)節(jié)點(diǎn)上運(yùn)行時(shí),HDFS無法將塊復(fù)制到3個數(shù)據(jù)節(jié)點(diǎn)上,所以會持續(xù)警告塊的副本不夠。<property><name>dfs.replication</name><value>3</value></property>(2)HDFS屬性配置hdfs-site.xml設(shè)置本地文件(2)HDFS屬性配置安全模式NameNode啟動后會進(jìn)入一個稱為安全模式的特殊狀態(tài)。處于安全模式下的文件系統(tǒng)只可讀不可寫。NameNode從所有的DataNode上接收心跳信號和塊狀態(tài)報(bào)告。當(dāng)在進(jìn)行系統(tǒng)維護(hù)或者集群維護(hù)時(shí),不希望用戶再去操作HDFS文件系統(tǒng)中的文件,這時(shí)候需要手動將NameNode設(shè)置成安全模式的狀態(tài)。該操作需要HDFS管理用戶來進(jìn)行實(shí)現(xiàn),即hdfs用戶。進(jìn)入安全模式的命令如下:$hadoopdfsadmin-safemodeenter$hadoopdfsadmin-safemodeget執(zhí)行結(jié)果如下:SafemodeisON(2)HDFS屬性配置安全模式NameNode啟動后會進(jìn)入一(2)HDFS屬性配置文件安全下面簡單介紹Hadoop是采用哪種機(jī)制來確保NameNode的安全的。第一種是備份NameNode上持久化存儲的元數(shù)據(jù)文件,然后將其轉(zhuǎn)儲到其他文件系統(tǒng)中,這種轉(zhuǎn)儲是同步的、原子的操作。第二種是系統(tǒng)中同步運(yùn)行一個SecondaryNameNode(二級NameNode)。(2)HDFS屬性配置文件安全下面簡單介紹Hadoop是采用(2)HDFS屬性配置可靠性管理為了保證HDFS文件系統(tǒng)的可靠性,可以采取以下策略:●冗余副本策略。第一種是通過Web界面,進(jìn)入到HDFS配置中修改Blockreplication的參數(shù)值。如圖3-8所示。圖3-8修改Blockreplication的參數(shù)值(2)HDFS屬性配置可靠性管理為了保證HDFS文件系統(tǒng)的可(2)HDFS屬性配置可靠性管理第二種方式是在Shell命令行模式下,修改hdfs-site.xml配置文件,將dfs.replication的值設(shè)置為5,然后重啟NameNode和DataNode進(jìn)程。#vi/etc/hadoop/-3796/0/hdfs-site.xml<property><name>dfs.replication</name><value>5</value></property>(2)HDFS屬性配置可靠性管理第二種方式是在Shell命令(2)HDFS屬性配置可靠性管理●回收站策略。設(shè)置HDFS文件系統(tǒng)回收站中的文件徹底刪除的時(shí)間間隔為7天。進(jìn)入到HDFS配置中修改erval的值為10,080(分鐘)。如圖3-9所示。注意:當(dāng)該值為0時(shí),表示禁用回收站的功能。圖3-9修改erval的值(2)HDFS屬性配置可靠性管理●回收站策略。圖3-9修(2)HDFS屬性配置可靠性管理●快照管理策略為HDFS文件系統(tǒng)中/1daoyun目錄創(chuàng)建快照,首先需要設(shè)置該目錄可進(jìn)行快照功能,然后再進(jìn)行創(chuàng)建快照。[root@master~]#hadoopfs-ls/1daoyunFound5items-rw-r--r--3roothdfs462017-06-2207:15/1daoyun/bigdata.txt首先允許/1daoyun目錄以及子目錄可創(chuàng)建快照。[root@master~]#hadoopdfsadmin-allowSnapshot/1daoyunDEPRECATED:Useofthisscripttoexecutehdfscommandisdeprecated.Insteadusethehdfscommandforit.Allowingsnaphoton/1daoyunsucceeded(2)HDFS屬性配置可靠性管理●快照管理策略創(chuàng)建快照。[root@master~]#hadoopfs-createSnapshot/1daoyuns0Createdsnapshot/1daoyun/.snapshot/s0創(chuàng)建完成后,創(chuàng)建一個恢復(fù)文件夾,使用cp命令可以恢復(fù)快照,如下:[root@master~]#hadoopfs-ls/1daoyun/.snapshotFound1itemsdrwxrwxrwx-roothdfs02017-06-2207:17/1daoyun/.snapshot/s0[root@master~]#hadoopfs-mkdir/1daoyun/recover[root@master~]#hadoopfs-cp/1daoyun/.snapshot/s0/bigdata.txt/1daoyun/recover[root@master~]#hadoopfs-ls/1daoyun/recoverFound1items-rw-r--r--roothdfs462017-06-2207:22/1daoyun/recover/bigdata.txt創(chuàng)建快照。33(3)Shell上傳采集數(shù)據(jù)至HDFS利用命令行上傳采集的數(shù)據(jù)到/user/PC/dict_in目錄。$hadoopfs–put/data/Webmagic/*/user/PC/dict_in(4)配置案例開發(fā)環(huán)境①運(yùn)行這個案例前,需要對大數(shù)據(jù)開發(fā)環(huán)境進(jìn)行配置,首先,需要在用于開發(fā)的PC機(jī)上安裝Hadoop2.7.0,為了方便,解壓hadoop-2.7.0.zip資源包。另外還需要將hadoop-2.7.0/bin目錄下的hadoop.dll文件拷貝到系統(tǒng)路徑C:\Windows\System32下。(3)Shell上傳采集數(shù)據(jù)至HDFS利用命令行上傳采集的數(shù)替換拷貝完成后,將Hadoop安裝目錄添加到系統(tǒng)環(huán)境變量中,首先在用戶變量中添加HADOOP_HOME變量,如圖3-10所示。圖3-10編輯HADOOP_HOME變量替換拷貝完成后,將Hadoop安裝目錄添加到系統(tǒng)環(huán)境變量中,②隨后在系統(tǒng)變量的Path中添加Hadoop的bin目錄路徑,如圖3-11所示。圖3-11編輯Path變量②隨后在系統(tǒng)變量的Path中添加Hadoop的bin目錄路徑③添加完成后,需要配置Eclipse,將Eclipse的Hadoop插件hadoop-eclipse-kepler-plugin-2.2.0.jar文件拷貝到Eclipse的Plugin目錄下,如圖3-12所示。圖3-12Eclipse的Plugin目錄③添加完成后,需要配置Eclipse,將Eclipse的Ha37④插件拷貝完成后,啟動Eclipse,配置Hadoop插件。在主菜單欄中選擇“Window→Preferences→HadoopMap/Reduce”命令,在“Hadoopinstallationdiretory”的文本框中輸入hadoop-2.7.0的目錄路徑,最后單擊“OK”按鈕。如圖3-13所示。圖3-13配置Hadoop安裝路徑④插件拷貝完成后,啟動Eclipse,配置Hadoop插件38⑤在Eclipse中能看到DFSLocations,如圖3-14所示。圖3-14DFSLocations目錄⑤在Eclipse中能看到DFSLocations,如圖39編輯HDFS的訪問地址以及端口,如圖3-15所示,編輯DFSMaster下對應(yīng)的Host以及Port文本框,這樣Eclipse就能看到HDFS所對應(yīng)的文件。如圖3-15所示。圖3-15編輯HDFS的訪問地址與端口編輯HDFS的訪問地址以及端口,如圖3-15所示,編輯DFS40⑥編寫程序上傳數(shù)據(jù)。導(dǎo)入項(xiàng)目工程bigdatademo-hdfs,在HdfsClient類中定義fs.defaultFS。定義HDFS的配置信息:conf=newConfiguration();onf=newConfconf.set("fs.defaultFS","hdfs://0:8020");實(shí)現(xiàn)上傳文件upload的方法:/***上傳文件*@paramlocalfile:本地的文件路徑*@paramremotefile:上傳到hdfs上的文件路徑*@throwsException*/⑥編寫程序上傳數(shù)據(jù)。41publicvoidupload(Stringlocalfile,Stringremotefile)throwsException{InputStreamin=newBufferedInputStream(newFileInputStream(localfile));OutputStreamout=fs.create(newPath(remotefile),newProgressable(){@Overridepublicvoidprogress(){} });IOUtils.copyBytes(in,out,4096,true);}publicvoidupload(Stringloca42啟動主函數(shù),遍歷/data/Webmagic目錄下的文件,把文件上傳到HDFS的/user/PC/dict_in目錄。publicstaticvoidmain(String[]args)throwsException{HdfsClienthdfsDB=newHdfsClient();Filefile=newFile("/data/Webmagic");if(file.exists()){File[]files=file.listFiles();for(Filefile2:files){if(!file2.isDirectory()){hdfsDB.upload(file2.getAbsolutePath(),"/user/PC/dict_in/"+file2.getName());}} }}啟動主函數(shù),遍歷/data/Webmagic目錄下的文件,把43啟動主函數(shù),遍歷/data/Webmagic目錄下的文件,把文件上傳到HDFS的/user/PC/dict_in目錄。publicstaticvoidmain(String[]args)throwsException{HdfsClienthdfsDB=newHdfsClient();Filefile=newFile("/data/Webmagic");if(file.exists()){File[]files=file.listFiles();for(Filefile2:files){if(!file2.isDirectory()){hdfsDB.upload(file2.getAbsolutePath(),"/user/PC/dict_in/"+file2.getName());}} }}啟動主函數(shù),遍歷/data/Webmagic目錄下的文件,把44任務(wù)3.3使用Sqoop轉(zhuǎn)換MySQL中的學(xué)生成績數(shù)據(jù)到Hive中任務(wù)目標(biāo)1.熟悉Sqoop工具的使用方法。2.學(xué)會利用Navicat導(dǎo)入文件并創(chuàng)建表格的方法。3.學(xué)會利用Sqoop工具將MySQL表格導(dǎo)入Hive中的方法。任務(wù)3.3使用Sqoop轉(zhuǎn)換MySQL中的學(xué)生成績數(shù)據(jù)到Hi45任務(wù)實(shí)施

(1)配置MySQL數(shù)據(jù)庫

在Navicat中導(dǎo)入文件并創(chuàng)建表格。打開Navicat并連接上本地?cái)?shù)據(jù)庫,如圖3-16所示。圖3-16利用Navicat連接本地?cái)?shù)據(jù)庫任務(wù)實(shí)施

(1)配置MySQL數(shù)據(jù)庫

在Navicat中導(dǎo)入46在數(shù)據(jù)庫recomm中導(dǎo)入文件。在連接列表中選擇recomm數(shù)據(jù)庫,在快捷工具欄下,單擊“導(dǎo)入導(dǎo)出”按鈕,如圖3-17所示。圖3-17在數(shù)據(jù)庫recomm中導(dǎo)入文件在數(shù)據(jù)庫recomm中導(dǎo)入文件。在連接列表中選擇recomm47②在彈出的窗口中選擇文件格式,這里為txt文件。在導(dǎo)入類型中選中“文字文件(*.txt)”單選按鈕,最后單擊“下一步>”按鈕,如圖3-18所示。圖3-18選擇文件格式②在彈出的窗口中選擇文件格式,這里為txt文件。在導(dǎo)入類型中48③單擊“導(dǎo)入從:”文本框旁“…”按鈕,選擇文件保存的路徑。單擊“∨”按鈕,在“編碼”下拉菜單中選擇“65001(UTF-8)”菜單命令,單擊“下一步>”按鈕。如圖3-19所示。圖3-19設(shè)置編碼格式③單擊“導(dǎo)入從:”文本框旁“…”按鈕,選擇文件保存的路徑。49④根據(jù)文件保存形式選擇分隔符。選中“欄位定界符”下“逗號(,)”單選按鈕,然后單擊“下一步>”按鈕,如圖3-20所示。圖3-20配置分隔符④根據(jù)文件保存形式選擇分隔符。選中“欄位定界符”下“逗號(,50⑤默認(rèn)情況下會將導(dǎo)入文本文檔的第一行作為字段名稱,這里設(shè)置從文本文檔的第二行開始導(dǎo)入,導(dǎo)入到數(shù)據(jù)數(shù)據(jù)庫第一欄中。單擊“下一步>”按鈕,如圖3-21所示。圖3-21導(dǎo)入數(shù)據(jù)配置⑤默認(rèn)情況下會將導(dǎo)入文本文檔的第一行作為字段名稱,這里設(shè)置從51⑥最后多次單擊“下一步>”按鈕,使用默認(rèn)配置,直到最后單擊“開始”按鈕,完成導(dǎo)入配置,如圖3-22所示。圖3-22完成導(dǎo)入操作⑥最后多次單擊“下一步>”按鈕,使用默認(rèn)配置,直到最后單擊“52可以看到,該數(shù)據(jù)庫下生成了名為gradstu的表格,打開后如圖3-23所示。圖3-22完成導(dǎo)入操作可以看到,該數(shù)據(jù)庫下生成了名為gradstu的表格,打開后如53(2)利用Sqoop將MySQL導(dǎo)入Hive中

①在Linux虛擬機(jī)上進(jìn)入Hive,查看現(xiàn)有哪些表格。如圖3-24所示。圖3-24查看Hive中的表(2)利用Sqoop將MySQL導(dǎo)入Hive中

①在Linu54圖3-25查看導(dǎo)入結(jié)果②退出Hive,并使用sqoop命令行代碼進(jìn)行數(shù)據(jù)庫導(dǎo)入,代碼如下:

sqoopimport--connectjdbc:mysql://34:3306/recomm--usernameroot-P–tablegradstu--hive-import-m1

上圖中的34即為數(shù)據(jù)庫的IP地址,3306為端口,用戶名為root,-P為手動輸入密碼。注意:如果數(shù)據(jù)庫安裝在了本地Windows系統(tǒng)中,需要關(guān)閉防火墻,才能使遠(yuǎn)程Linux虛擬機(jī)與本地Windows系統(tǒng)相互ping通。運(yùn)行成功后再進(jìn)入Hive,查看所有表格。圖3-25查看導(dǎo)入結(jié)果②退出Hive,并使用sqoop命令55圖3-26查詢表中數(shù)據(jù)可以看到,已經(jīng)有了gradstu這個表格,現(xiàn)在查看這個表格內(nèi)容,運(yùn)行如下代碼:hive>select*fromgradstu;發(fā)現(xiàn)表格已經(jīng)導(dǎo)入,至此功能完成!如圖3-26所示。圖3-26查詢表中數(shù)據(jù)可以看到,已經(jīng)有了gradstu這個56通過本項(xiàng)目,主要學(xué)習(xí)了數(shù)據(jù)采集的功能,其中分為網(wǎng)絡(luò)爬蟲與數(shù)據(jù)傳輸兩部分。網(wǎng)絡(luò)爬蟲選用了WebMagic爬蟲框架,其基于Java開發(fā)的特點(diǎn)與學(xué)情分析系統(tǒng)開發(fā)環(huán)境(JavaEE)相吻合,同時(shí)通過網(wǎng)絡(luò)爬蟲的開發(fā),幫助使用者熟悉HTML的基本結(jié)構(gòu)以及解析網(wǎng)頁內(nèi)容的方法。在數(shù)據(jù)傳輸部分,主要實(shí)現(xiàn)了本地文件系統(tǒng)與HDFS文件系統(tǒng)的連接,以及MySQL數(shù)據(jù)庫與Hive數(shù)據(jù)倉庫的數(shù)據(jù)傳輸。項(xiàng)目小結(jié)項(xiàng)目小結(jié)57Hadoop大數(shù)據(jù)平臺構(gòu)建與應(yīng)用Hadoop大數(shù)據(jù)58項(xiàng)目3就業(yè)崗位數(shù)據(jù)采集和存儲項(xiàng)目359任務(wù)3.1使用網(wǎng)絡(luò)爬蟲采集崗位招聘數(shù)據(jù)A任務(wù)3.2采集的數(shù)據(jù)上傳到HDFSB任務(wù)3.3使用Sqoop轉(zhuǎn)換Mysql中的學(xué)生成績數(shù)據(jù)到Hive中C項(xiàng)目描述任務(wù)3.1使用網(wǎng)絡(luò)爬蟲采集崗位招聘數(shù)據(jù)A任務(wù)3.2采集的60任務(wù)3.1使用網(wǎng)絡(luò)爬蟲采集崗位招聘數(shù)據(jù)【知識目標(biāo)】●識記WebMagic的流程架構(gòu)和HDFS的基礎(chǔ)架構(gòu)以及Hive的基本概念和特點(diǎn)?!耦I(lǐng)會網(wǎng)絡(luò)爬蟲的編程實(shí)現(xiàn)的步驟和方法?!炯寄苣繕?biāo)】●學(xué)會使用WebMagic開發(fā)網(wǎng)絡(luò)爬蟲的步驟和方法●學(xué)會HDFS服務(wù)進(jìn)程管理?!駥W(xué)會HDFS屬性配置管理。●學(xué)會HDFS上傳文件的方法?!駥W(xué)會Sqoop上傳文件至Hive中的方法。任務(wù)3.1使用網(wǎng)絡(luò)爬蟲采集崗位招聘數(shù)據(jù)【知識目標(biāo)】61知識準(zhǔn)備webmagic-scriptswebmagic-seleniumwebmagic-saxonwebmagic-samplesWebMagic項(xiàng)目里還有幾個包,這些都是一些實(shí)驗(yàn)性的功能,目的只是提供一些與外圍工具整合的樣例。webmagic-avalon13524WebMagic的是一個無須配置、便于二次開發(fā)的爬蟲框架,它提供簡單靈活的API,只需少量代碼即可實(shí)現(xiàn)一個爬蟲。其架構(gòu)流程如圖3-1所示。3-1WebMagic架構(gòu)圖知識準(zhǔn)備webmagic-scriptswebmagic-s任務(wù)實(shí)施

(1)解析崗位列表頁源代碼崗位信息頁后續(xù)列表分頁圖3-2崗位列表頁結(jié)構(gòu)任務(wù)實(shí)施

(1)解析崗位列表頁源代碼崗位信息頁后續(xù)列表分頁圖63這是在WebMagic框架中的PageProcessor組件中定制實(shí)現(xiàn)的,首先要做的是設(shè)置抓取的基本配置,包括編碼、抓取間隔、重試次數(shù),代碼如下:privateSitesite=Site.me().setRetryTimes(3).setSleepTime(10).setCharset("gbk");這里選擇重試次數(shù)為3次,抓取間隔為10毫秒,編碼根據(jù)為51job網(wǎng)頁源代碼可以查看得到,如下所示:<html><head><metahttp-equiv="X-UA-Compatible"content="IE=edge,chrome=1"><metahttp-equiv="Content-Type"content="text/html;charset=gbk"><linkrel="icon"href="/favicon.ico"type="image/x-icon"/><title>【云計(jì)算招聘,求職】-前程無憂</title>該招聘網(wǎng)站的編碼為gbk。這是在WebMagic框架中的PageProcessor組件64接下來,判斷當(dāng)前分析的頁面是否為崗位列表頁。不難發(fā)現(xiàn),列表頁的URL中都含有字符段,可以通過簡單的if語句判斷:if(page.getUrl().toString().contains(""))下面分析崗位信息頁鏈接的HTML源代碼,并用Xpath語法解析出,添加至抓取隊(duì)列。檢查某個鏈接源代碼的方法,在崗位列表中右擊一項(xiàng),在彈出的下拉菜單中選擇“Inspect”命令,如圖3-3所示。圖3-3選擇Inspect命令接下來,判斷當(dāng)前分析的頁面是否為崗位列表頁。不難發(fā)現(xiàn),列表頁65右擊并選擇檢查(Inspect)后,出現(xiàn)了該鏈接的HTML源碼,如圖3-4所示。圖3-4查看HTML源代碼右擊并選擇檢查(Inspect)后,出現(xiàn)了該鏈接的HTML源66可以發(fā)現(xiàn),所需要的URL地址是一個<p>標(biāo)簽下的唯一的超鏈接,該標(biāo)簽的class名為t1。同理,這個崗位列表頁下的所有崗位信息頁的URL都有著相同的格式。因此可以使用Xpath全部識別,并添加至抓取隊(duì)列,代碼實(shí)現(xiàn)如下:select=page.getHtml().xpath("http://p[@class='t1']");urls=select.links().all();page.addTargetRequests(urls);添加后續(xù)分頁的鏈接也是如上一樣的方法,在此省去分析HTML源碼的截圖,直接貼上代碼:select=page.getHtml().xpath("http://div[@class='dw_page']");urls=select.links().all();可以發(fā)現(xiàn),所需要的URL地址是一個<p>標(biāo)簽下的唯一的超鏈接67這里需要注意的是,要防止添加空白搜索結(jié)果頁的鏈接,不然將會把整個51job的崗位全都抓取下來。盡管按照定制的抓取邏輯,這種意外不會出現(xiàn),但還是添加了踢出隊(duì)列的保護(hù)機(jī)制,代碼如下:Iterator<String>it=urls.iterator(); while(it.hasNext()){ Stringx=it.next(); if(x.equals("/list/000000,000000,0000,00,9,99,%2520,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=")){ it.remove(); } } page.addTargetRequests(urls);這里需要注意的是,要防止添加空白搜索結(jié)果頁的鏈接,不然將會把68(2)解析崗位信息頁源代碼如圖3-5所示,需要抓取崗位信息頁上用紅框標(biāo)注出來的信息。方法與上一步中的類似,也是通過分析HTML源碼,再利用Xpath語法或者正則表達(dá)式去定位相關(guān)內(nèi)容.(2)解析崗位信息頁源代碼69具體的代碼如下:elseif(page.getUrl().toString().startsWith("/")){page.putField("url",page.getUrl().toString()); //崗位名稱page.putField("job",page.getHtml().xpath("http://div[@class='cn']/h1/text()").toString()); //發(fā)布日期page.putField("createtime",page.getHtml().regex("<emclass=\"i4\"></em>([^<]+)</span>").toString()); //崗位描述 page.putField("content",page.getHtml().xpath("http://div[@class='bmsgjob_msginbox']/html()").toString()); //其他可選項(xiàng) page.putField("salary",page.getHtml().xpath("http://div[@class='cn']/strong/text()").toString());具體的代碼如下:70page.putField("location",page.getHtml().xpath("http://span[@class='lname']/text()").toString()); page.putField("company",page.getHtml().xpath("http://p[@class='cname']/a/text()").toString()); page.putField("experience",page.getHtml().regex("<emclass=\"i1\"></em>([^<]+)</span>").toString()); page.putField("education",page.getHtml().regex("<emclass=\"i2\"></em>([^<]+)</span>").toString()); page.putField("number",page.getHtml().regex("<emclass=\"i3\"></em>([^<]+)</span>").toString());}page.putField("location",page71(3)根據(jù)條件保存抓取到的信息這里根據(jù)條件篩選崗位信息,比如已經(jīng)列出了一些培訓(xùn)機(jī)構(gòu)的“公司黑名單”,保存在了Dictionary類中的Blacklist靜態(tài)String數(shù)組中,那么可以用簡單的if語句來判斷:Booleanchoose=true;//判斷是否為培訓(xùn)公司發(fā)布的“垃圾”招聘信息 for(Stringi:Dictionary.Blacklist){ if(((String)resultItems.get("company")).contains(i)){ choose=false; } }對于發(fā)布日期,僅需要保留當(dāng)天發(fā)布的招聘信息,判斷代碼如下://判斷是否為當(dāng)天發(fā)布的招聘信息 if(!((String)resultItems.get("createtime")).contains(Today_Date)){ choose=false; }(3)根據(jù)條件保存抓取到的信息72其中Today_Date是一個靜態(tài)final型字符串:publicstaticfinalStringToday_Date=timeTostrMD(newDate());timeToStrMD是一個自定義獲取當(dāng)天月份和日期并返回諸如“05-05”形式字符串的方法。代碼如下:publicstaticStringtimeTostrMD(Datedate){ StringstrDate=""; if(date!=null){ SimpleDateFormatformat=newSimpleDateFormat("MM-dd"); strDate=format.format(date); } returnstrDate; }其中Today_Date是一個靜態(tài)final型字符串:73在篩選完之后,便可以將抓取內(nèi)容選擇性地保存至本地的某個文件中,這里定制的保存格式為一個崗位保存一行,每行中的信息用制表符\t分隔,最后保存在一個以日期命名的文本文件中,代碼如下:try{ //定義存儲路徑,以每天為一個文件存儲 Stringpath=this.path+PATH_SEPERATOR+timeTostrYMD(newDate())+".txt"; Filefile=getFile(path); Stringstr=resultItems.get("url") +"\t" +resultItems.get("job") +"\t" +resultItems.get("location") +"\t" +resultItems.get("company")

在篩選完之后,便可以將抓取內(nèi)容選擇性地保存至本地的某個文件中74+"\t"+resultItems.get("salary")+"\t"+resultItems.get("experience")+"\t"+resultItems.get("education")+"\t"+resultItems.get("number")+"\t"+resultItems.get("createtime")+"\t"+"\r\n"; FileUtils.writeStringToFile(file,str,"utf-8",true); }catch(IOExceptione){ logger.warn("writefileerror",e); }+"\t"75(4)運(yùn)行代碼程序WebMagic的核心組件為PageProcessor與Pipeline,通過上述步驟的講解,讀者應(yīng)該可以定制這兩個組件了,而調(diào)用這兩個核心組件是通過Spider類,簡單的代碼如下:Spider.create(newCrawlJob()) .addUrl(URL_START) .addPipeline(newPipelineJob()).thread(5).run();由于要將Java程序?qū)С鰹閖ar文件,并且需要實(shí)現(xiàn)無參傳遞(使用默認(rèn)保存路徑)和有參傳遞(使用指定保存路徑)兩種形式,因此使用main方法的代碼如下:publicstaticvoidmain(String[]args)throwsException{ StringURL_START=(4)運(yùn)行代碼程序76

"/list/000000%252C00,000000,0000,00,9,99,%25E4%25BA%2591%25E8%25AE%25A1%25E7%25AE%2597,2,1.html?lang=c°reefrom=99&stype=1&workyear=99&cotype=99&jobterm=99&companysize=99&radius=-1&address=&lonlat=&postchannel=&list_type=&ord_field=&curr_page=&dibiaoid=0&landmark=&welfare=";if(args.length==0){ Spider.create(newCrawlJob()) .addUrl(URL_START) .addPipeline(newPipelineJob()).thread(5).run(); }else{ Spider.create(newCrawlJob()) .addUrl(URL_START) .addPipeline(newPipelineJob(args[0])).thread(5).run(); }} "/list77任務(wù)3.2采集的數(shù)據(jù)上傳到HDFS任務(wù)描述1.借助學(xué)習(xí)論壇、網(wǎng)絡(luò)視頻等網(wǎng)絡(luò)資源和各種圖書資源,學(xué)習(xí)HDFS文件系統(tǒng)的使用方法。2.將利用WebMagic爬取工具爬取的招聘崗位信息上傳到HDFS文件系統(tǒng)中。任務(wù)目標(biāo)1.熟悉HDFS工作原理。2.學(xué)會文件系統(tǒng)的屬性配置方法。3.學(xué)會通過多種方式上傳文件至HDFS文件系統(tǒng)的方法。任務(wù)3.2采集的數(shù)據(jù)上傳到HDFS任務(wù)描述78知識準(zhǔn)備

在HDFS體系結(jié)構(gòu)采用Master/Slave的主從架構(gòu),如圖3-6所示,其中Master節(jié)點(diǎn)運(yùn)行NameNode進(jìn)程,Slave節(jié)點(diǎn)運(yùn)行DataNode進(jìn)程。圖3-6HDFS體系結(jié)構(gòu)知識準(zhǔn)備

在HDFS體系結(jié)構(gòu)采用Master/Slave的主79磁盤有一個BlockSize的概念,它是磁盤讀/寫數(shù)據(jù)的最小單位。文件系統(tǒng)的塊一般為幾千字節(jié)(byte),磁盤塊一般為512字節(jié)(byte)。HDFS也有Block的概念,但它的塊是一個很大的單元,是文件存儲處理的邏輯單元。默認(rèn)是64MB。像硬盤中的文件系統(tǒng)一樣,在HDFS中的文件將會按塊大小進(jìn)行分解,并作為獨(dú)立的單元進(jìn)行存儲。但和硬盤中的文件系統(tǒng)不一樣的是,存儲在塊中的一個比塊小的文件并不會占據(jù)一個塊大小的物理空間(HDFS中一個塊只存儲一個文件的內(nèi)容)。HDFS作為一個分布式文件系統(tǒng),是設(shè)計(jì)用來處理大文件的,使用抽象的塊會帶來很多好處。一個好處是可以存儲任意大的文件,而又不會受到網(wǎng)絡(luò)中任一單個節(jié)點(diǎn)磁盤大小的限制。另外一個好處是使用抽象塊作為操作的單元可簡化存儲子系統(tǒng),不僅如此,塊更有利于分布式文件系統(tǒng)中復(fù)制容錯的實(shí)現(xiàn)。在HDFS中為了處理節(jié)點(diǎn)故障,默認(rèn)將文件塊副本數(shù)設(shè)定為3份,分別存儲在集群的不同節(jié)點(diǎn)上。當(dāng)一個塊損壞時(shí),系統(tǒng)會通過NameNode獲取元數(shù)據(jù)信息,在另外的機(jī)器上讀取一個副本并進(jìn)行存儲,這個過程對用戶來說都是透明的。當(dāng)然,這里的文件塊副本冗余可以通過文件進(jìn)行配置,在HDFS中,可以通過終端命令直接獲得文件和塊信息,比如以下命令可以列出文件系統(tǒng)中組成各個文件的塊:hadoopfsck/-files-blocks磁盤有一個BlockSize的概念,它是磁盤讀/寫數(shù)據(jù)的最80任務(wù)實(shí)施(1)服務(wù)進(jìn)程管理hadoop-daemon.sh腳本是啟動和停止Hadoop后臺程序,--config參數(shù)指定啟動程序時(shí)用到的配置文件目錄。大括號中的namenode和datenode是需要啟動的進(jìn)程,兩者擇其一。命令如下:#/usr/hdp/current/hadoop-client/sbin/hadoop-daemon.sh--config/usr/hdp/current/hadoop-client/confstop{namenode/datenode}#/usr/hdp/current/hadoop-client/sbin/hadoop-daemon.sh--config/usr/hdp/current/hadoop-client/confstart{namenode/datenode}任務(wù)實(shí)施(1)服務(wù)進(jìn)程管理hadoop-daemon.sh腳(2)HDFS屬性配置core-site.xml設(shè)置Hadoop默認(rèn)文件系統(tǒng)。<property><name>fs.defaultFS</name><value>hdfs://master:8020</value></property>設(shè)置緩存的大小,這個參數(shù)要設(shè)置為系統(tǒng)頁面大小的倍數(shù),以byte為單位。<property><name>io.file.buffer.size</name><value>131072</value></property>設(shè)置HDFS的NameNode的格式化信息存儲路徑。<property><name>hadoop.tmp.dir</name><value>file:/home/hadoop/tmp</value><description>Abaseforothertemporarydirectories.</description></property>(2)HDFS屬性配置core-site.xml設(shè)置Had(2)HDFS屬性配置hdfs-site.xml設(shè)置本地文件系統(tǒng)DFSNameNode存放NameTtable的路徑。<property><name>.dir</name><value>file:///usr/hadoop/dfs/name</value></property>設(shè)置本地文件系統(tǒng)DFSDataNode存放數(shù)據(jù)Block的目錄。<property><name>dfs.datanode.data.dir</name><value>file:///usr/hadoop/dfs/data</value></property>設(shè)置HDFS文件系統(tǒng)Block的復(fù)制份數(shù)。設(shè)置為的3時(shí),HDFS就會按照設(shè)置將文件系統(tǒng)塊復(fù)制為3份。如果采用的是偽分布配置,這里參數(shù)應(yīng)設(shè)置為1,否則在單獨(dú)一個數(shù)據(jù)節(jié)點(diǎn)上運(yùn)行時(shí),HDFS無法將塊復(fù)制到3個數(shù)據(jù)節(jié)點(diǎn)上,所以會持續(xù)警告塊的副本不夠。<property><name>dfs.replication</name><value>3</value></property>(2)HDFS屬性配置hdfs-site.xml設(shè)置本地文件(2)HDFS屬性配置安全模式NameNode啟動后會進(jìn)入一個稱為安全模式的特殊狀態(tài)。處于安全模式下的文件系統(tǒng)只可讀不可寫。NameNode從所有的DataNode上接收心跳信號和塊狀態(tài)報(bào)告。當(dāng)在進(jìn)行系統(tǒng)維護(hù)或者集群維護(hù)時(shí),不希望用戶再去操作HDFS文件系統(tǒng)中的文件,這時(shí)候需要手動將NameNode設(shè)置成安全模式的狀態(tài)。該操作需要HDFS管理用戶來進(jìn)行實(shí)現(xiàn),即hdfs用戶。進(jìn)入安全模式的命令如下:$hadoopdfsadmin-safemodeenter$hadoopdfsadmin-safemodeget執(zhí)行結(jié)果如下:SafemodeisON(2)HDFS屬性配置安全模式NameNode啟動后會進(jìn)入一(2)HDFS屬性配置文件安全下面簡單介紹Hadoop是采用哪種機(jī)制來確保NameNode的安全的。第一種是備份NameNode上持久化存儲的元數(shù)據(jù)文件,然后將其轉(zhuǎn)儲到其他文件系統(tǒng)中,這種轉(zhuǎn)儲是同步的、原子的操作。第二種是系統(tǒng)中同步運(yùn)行一個SecondaryNameNode(二級NameNode)。(2)HDFS屬性配置文件安全下面簡單介紹Hadoop是采用(2)HDFS屬性配置可靠性管理為了保證HDFS文件系統(tǒng)的可靠性,可以采取以下策略:●冗余副本策略。第一種是通過Web界面,進(jìn)入到HDFS配置中修改Blockreplication的參數(shù)值。如圖3-8所示。圖3-8修改Blockreplication的參數(shù)值(2)HDFS屬性配置可靠性管理為了保證HDFS文件系統(tǒng)的可(2)HDFS屬性配置可靠性管理第二種方式是在Shell命令行模式下,修改hdfs-site.xml配置文件,將dfs.replication的值設(shè)置為5,然后重啟NameNode和DataNode進(jìn)程。#vi/etc/hadoop/-3796/0/hdfs-site.xml<property><name>dfs.replication</name><value>5</value></property>(2)HDFS屬性配置可靠性管理第二種方式是在Shell命令(2)HDFS屬性配置可靠性管理●回收站策略。設(shè)置HDFS文件系統(tǒng)回收站中的文件徹底刪除的時(shí)間間隔為7天。進(jìn)入到HDFS配置中修改erval的值為10,080(分鐘)。如圖3-9所示。注意:當(dāng)該值為0時(shí),表示禁用回收站的功能。圖3-9修改erval的值(2)HDFS屬性配置可靠性管理●回收站策略。圖3-9修(2)HDFS屬性配置可靠性管理●快照管理策略為HDFS文件系統(tǒng)中/1daoyun目錄創(chuàng)建快照,首先需要設(shè)置該目錄可進(jìn)行快照功能,然后再進(jìn)行創(chuàng)建快照。[root@master~]#hadoopfs-ls/1daoyunFound5items-rw-r--r--3roothdfs462017-06-2207:15/1daoyun/bigdata.txt首先允許/1daoyun目錄以及子目錄可創(chuàng)建快照。[root@master~]#hadoopdfsadmin-allowSnapshot/1daoyunDEPRECATED:Useofthisscripttoexecutehdfscommandisdeprecated.Insteadusethehdfscommandforit.Allowingsnaphoton/1daoyunsucceeded(2)HDFS屬性配置可靠性管理●快照管理策略創(chuàng)建快照。[root@master~]#hadoopfs-createSnapshot/1daoyuns0Createdsnapshot/1daoyun/.snapshot/s0創(chuàng)建完成后,創(chuàng)建一個恢復(fù)文件夾,使用cp命令可以恢復(fù)快照,如下:[root@master~]#hadoopfs-ls/1daoyun/.snapshotFound1itemsdrwxrwxrwx-roothdfs02017-06-2207:17/1daoyun/.snapshot/s0[root@master~]#hadoopfs-mkdir/1daoyun/recover[root@master~]#hadoopfs-cp/1daoyun/.snapshot/s0/bigdata.txt/1daoyun/recover[root@master~]#hadoopfs-ls/1daoyun/recoverFound1items-rw-r--r--roothdfs462017-06-2207:22/1daoyun/recover/bigdata.txt創(chuàng)建快照。90(3)Shell上傳采集數(shù)據(jù)至HDFS利用命令行上傳采集的數(shù)據(jù)到/user/PC/dict_in目錄。$hadoopfs–put/data/Webmagic/*/user/PC/dict_in(4)配置案例開發(fā)環(huán)境①運(yùn)行這個案例前,需要對大數(shù)據(jù)開發(fā)環(huán)境進(jìn)行配置,首先,需要在用于開發(fā)的PC機(jī)上安裝Hadoop2.7.0,為了方便,解壓hadoop-2.7.0.zip資源包。另外還需要將hadoop-2.7.0/bin目錄下的hadoop.dll文件拷貝到系統(tǒng)路徑C:\Windows\System32下。(3)Shell上傳采集數(shù)據(jù)至HDFS利用命令行上傳采集的數(shù)替換拷貝完成后,將Hadoop安裝目錄添加到系統(tǒng)環(huán)境變量中,首先在用戶變量中添加HADOOP_HOME變量,如圖3-10所示。圖3-10編輯HADOOP_HOME變量替換拷貝完成后,將Hadoop安裝目錄添加到系統(tǒng)環(huán)境變量中,②隨后在系統(tǒng)變量的Path中添加Hadoop的bin目錄路徑,如圖3-11所示。圖3-11編輯Path變量②隨后在系統(tǒng)變量的Path中添加Hadoop的bin目錄路徑③添加完成后,需要配置Eclipse,將Eclipse的Hadoop插件hadoop-eclipse-kepler-plugin-2.2.0.jar文件拷貝到Eclipse的Plugin目錄下,如圖3-12所示。圖3-12Eclipse的Plugin目錄③添加完成后,需要配置Eclipse,將Eclipse的Ha94④插件拷貝完成后,啟動Eclipse,配置Hadoop插件。在主菜單欄中選擇“Window→Preferences→HadoopMap/Reduce”命令,在“Hadoopinstallationdiretory”的文本框中輸入hadoop-2.7.0的目錄路徑,最后單擊“OK”按鈕。如圖3-13所示。圖3-13配置Hadoop安裝路徑④插件拷

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論