版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Hadoop大數(shù)據(jù)平臺(tái)構(gòu)建與應(yīng)用Hadoop大數(shù)據(jù)1項(xiàng)目3就業(yè)崗位數(shù)據(jù)采集和存儲(chǔ)項(xiàng)目32任務(wù)3.1使用網(wǎng)絡(luò)爬蟲(chóng)采集崗位招聘數(shù)據(jù)A任務(wù)3.2采集的數(shù)據(jù)上傳到HDFSB任務(wù)3.3使用Sqoop轉(zhuǎn)換Mysql中的學(xué)生成績(jī)數(shù)據(jù)到Hive中C項(xiàng)目描述任務(wù)3.1使用網(wǎng)絡(luò)爬蟲(chóng)采集崗位招聘數(shù)據(jù)A任務(wù)3.2采集的3任務(wù)3.1使用網(wǎng)絡(luò)爬蟲(chóng)采集崗位招聘數(shù)據(jù)【知識(shí)目標(biāo)】●識(shí)記WebMagic的流程架構(gòu)和HDFS的基礎(chǔ)架構(gòu)以及Hive的基本概念和特點(diǎn)?!耦I(lǐng)會(huì)網(wǎng)絡(luò)爬蟲(chóng)的編程實(shí)現(xiàn)的步驟和方法?!炯寄苣繕?biāo)】●學(xué)會(huì)使用WebMagic開(kāi)發(fā)網(wǎng)絡(luò)爬蟲(chóng)的步驟和方法●學(xué)會(huì)HDFS服務(wù)進(jìn)程管理?!駥W(xué)會(huì)HDFS屬性配置管理。●學(xué)會(huì)HDFS上傳文件的方法。●學(xué)會(huì)Sqoop上傳文件至Hive中的方法。任務(wù)3.1使用網(wǎng)絡(luò)爬蟲(chóng)采集崗位招聘數(shù)據(jù)【知識(shí)目標(biāo)】4知識(shí)準(zhǔn)備webmagic-scriptswebmagic-seleniumwebmagic-saxonwebmagic-samplesWebMagic項(xiàng)目里還有幾個(gè)包,這些都是一些實(shí)驗(yàn)性的功能,目的只是提供一些與外圍工具整合的樣例。webmagic-avalon13524WebMagic的是一個(gè)無(wú)須配置、便于二次開(kāi)發(fā)的爬蟲(chóng)框架,它提供簡(jiǎn)單靈活的API,只需少量代碼即可實(shí)現(xiàn)一個(gè)爬蟲(chóng)。其架構(gòu)流程如圖3-1所示。3-1WebMagic架構(gòu)圖知識(shí)準(zhǔn)備webmagic-scriptswebmagic-s任務(wù)實(shí)施
(1)解析崗位列表頁(yè)源代碼崗位信息頁(yè)后續(xù)列表分頁(yè)圖3-2崗位列表頁(yè)結(jié)構(gòu)任務(wù)實(shí)施
(1)解析崗位列表頁(yè)源代碼崗位信息頁(yè)后續(xù)列表分頁(yè)圖6這是在WebMagic框架中的PageProcessor組件中定制實(shí)現(xiàn)的,首先要做的是設(shè)置抓取的基本配置,包括編碼、抓取間隔、重試次數(shù),代碼如下:privateSitesite=Site.me().setRetryTimes(3).setSleepTime(10).setCharset("gbk");這里選擇重試次數(shù)為3次,抓取間隔為10毫秒,編碼根據(jù)為51job網(wǎng)頁(yè)源代碼可以查看得到,如下所示:<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ì)算招聘,求職】-前程無(wú)憂(yōu)</title>該招聘網(wǎng)站的編碼為gbk。這是在WebMagic框架中的PageProcessor組件7接下來(lái),判斷當(dāng)前分析的頁(yè)面是否為崗位列表頁(yè)。不難發(fā)現(xiàn),列表頁(yè)的URL中都含有字符段,可以通過(guò)簡(jiǎn)單的if語(yǔ)句判斷:if(page.getUrl().toString().contains(""))下面分析崗位信息頁(yè)鏈接的HTML源代碼,并用Xpath語(yǔ)法解析出,添加至抓取隊(duì)列。檢查某個(gè)鏈接源代碼的方法,在崗位列表中右擊一項(xiàng),在彈出的下拉菜單中選擇“Inspect”命令,如圖3-3所示。圖3-3選擇Inspect命令接下來(lái),判斷當(dāng)前分析的頁(yè)面是否為崗位列表頁(yè)。不難發(fā)現(xiàn),列表頁(yè)8右擊并選擇檢查(Inspect)后,出現(xiàn)了該鏈接的HTML源碼,如圖3-4所示。圖3-4查看HTML源代碼右擊并選擇檢查(Inspect)后,出現(xiàn)了該鏈接的HTML源9可以發(fā)現(xiàn),所需要的URL地址是一個(gè)<p>標(biāo)簽下的唯一的超鏈接,該標(biāo)簽的class名為t1。同理,這個(gè)崗位列表頁(yè)下的所有崗位信息頁(yè)的URL都有著相同的格式。因此可以使用Xpath全部識(shí)別,并添加至抓取隊(duì)列,代碼實(shí)現(xiàn)如下:select=page.getHtml().xpath("http://p[@class='t1']");urls=select.links().all();page.addTargetRequests(urls);添加后續(xù)分頁(yè)的鏈接也是如上一樣的方法,在此省去分析HTML源碼的截圖,直接貼上代碼:select=page.getHtml().xpath("http://div[@class='dw_page']");urls=select.links().all();可以發(fā)現(xiàn),所需要的URL地址是一個(gè)<p>標(biāo)簽下的唯一的超鏈接10這里需要注意的是,要防止添加空白搜索結(jié)果頁(yè)的鏈接,不然將會(huì)把整個(gè)51job的崗位全都抓取下來(lái)。盡管按照定制的抓取邏輯,這種意外不會(huì)出現(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é)果頁(yè)的鏈接,不然將會(huì)把11(2)解析崗位信息頁(yè)源代碼如圖3-5所示,需要抓取崗位信息頁(yè)上用紅框標(biāo)注出來(lái)的信息。方法與上一步中的類(lèi)似,也是通過(guò)分析HTML源碼,再利用Xpath語(yǔ)法或者正則表達(dá)式去定位相關(guān)內(nèi)容.(2)解析崗位信息頁(yè)源代碼12具體的代碼如下:elseif(page.getUrl().toString().startsWith("/")){page.putField("url",page.getUrl().toString()); //崗位名稱(chēng)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類(lèi)中的Blacklist靜態(tài)String數(shù)組中,那么可以用簡(jiǎn)單的if語(yǔ)句來(lái)判斷:Booleanchoose=true;//判斷是否為培訓(xùn)公司發(fā)布的“垃圾”招聘信息 for(Stringi:Dictionary.Blacklist){ if(((String)resultItems.get("company")).contains(i)){ choose=false; } }對(duì)于發(fā)布日期,僅需要保留當(dāng)天發(fā)布的招聘信息,判斷代碼如下://判斷是否為當(dāng)天發(fā)布的招聘信息 if(!((String)resultItems.get("createtime")).contains(Today_Date)){ choose=false; }(3)根據(jù)條件保存抓取到的信息15其中Today_Date是一個(gè)靜態(tài)final型字符串:publicstaticfinalStringToday_Date=timeTostrMD(newDate());timeToStrMD是一個(gè)自定義獲取當(dāng)天月份和日期并返回諸如“05-05”形式字符串的方法。代碼如下:publicstaticStringtimeTostrMD(Datedate){ StringstrDate=""; if(date!=null){ SimpleDateFormatformat=newSimpleDateFormat("MM-dd"); strDate=format.format(date); } returnstrDate; }其中Today_Date是一個(gè)靜態(tài)final型字符串:16在篩選完之后,便可以將抓取內(nèi)容選擇性地保存至本地的某個(gè)文件中,這里定制的保存格式為一個(gè)崗位保存一行,每行中的信息用制表符\t分隔,最后保存在一個(gè)以日期命名的文本文件中,代碼如下:try{ //定義存儲(chǔ)路徑,以每天為一個(gè)文件存儲(chǔ) 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)容選擇性地保存至本地的某個(gè)文件中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,通過(guò)上述步驟的講解,讀者應(yīng)該可以定制這兩個(gè)組件了,而調(diào)用這兩個(gè)核心組件是通過(guò)Spider類(lèi),簡(jiǎn)單的代碼如下:Spider.create(newCrawlJob()) .addUrl(URL_START) .addPipeline(newPipelineJob()).thread(5).run();由于要將Java程序?qū)С鰹閖ar文件,并且需要實(shí)現(xiàn)無(wú)參傳遞(使用默認(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ò)資源和各種圖書(shū)資源,學(xué)習(xí)HDFS文件系統(tǒng)的使用方法。2.將利用WebMagic爬取工具爬取的招聘崗位信息上傳到HDFS文件系統(tǒng)中。任務(wù)目標(biāo)1.熟悉HDFS工作原理。2.學(xué)會(huì)文件系統(tǒng)的屬性配置方法。3.學(xué)會(huì)通過(guò)多種方式上傳文件至HDFS文件系統(tǒng)的方法。任務(wù)3.2采集的數(shù)據(jù)上傳到HDFS任務(wù)描述21知識(shí)準(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)知識(shí)準(zhǔn)備
在HDFS體系結(jié)構(gòu)采用Master/Slave的主22磁盤(pán)有一個(gè)BlockSize的概念,它是磁盤(pán)讀/寫(xiě)數(shù)據(jù)的最小單位。文件系統(tǒng)的塊一般為幾千字節(jié)(byte),磁盤(pán)塊一般為512字節(jié)(byte)。HDFS也有Block的概念,但它的塊是一個(gè)很大的單元,是文件存儲(chǔ)處理的邏輯單元。默認(rèn)是64MB。像硬盤(pán)中的文件系統(tǒng)一樣,在HDFS中的文件將會(huì)按塊大小進(jìn)行分解,并作為獨(dú)立的單元進(jìn)行存儲(chǔ)。但和硬盤(pán)中的文件系統(tǒng)不一樣的是,存儲(chǔ)在塊中的一個(gè)比塊小的文件并不會(huì)占據(jù)一個(gè)塊大小的物理空間(HDFS中一個(gè)塊只存儲(chǔ)一個(gè)文件的內(nèi)容)。HDFS作為一個(gè)分布式文件系統(tǒng),是設(shè)計(jì)用來(lái)處理大文件的,使用抽象的塊會(huì)帶來(lái)很多好處。一個(gè)好處是可以存儲(chǔ)任意大的文件,而又不會(huì)受到網(wǎng)絡(luò)中任一單個(gè)節(jié)點(diǎn)磁盤(pán)大小的限制。另外一個(gè)好處是使用抽象塊作為操作的單元可簡(jiǎn)化存儲(chǔ)子系統(tǒng),不僅如此,塊更有利于分布式文件系統(tǒng)中復(fù)制容錯(cuò)的實(shí)現(xiàn)。在HDFS中為了處理節(jié)點(diǎn)故障,默認(rèn)將文件塊副本數(shù)設(shè)定為3份,分別存儲(chǔ)在集群的不同節(jié)點(diǎn)上。當(dāng)一個(gè)塊損壞時(shí),系統(tǒng)會(huì)通過(guò)NameNode獲取元數(shù)據(jù)信息,在另外的機(jī)器上讀取一個(gè)副本并進(jìn)行存儲(chǔ),這個(gè)過(guò)程對(duì)用戶(hù)來(lái)說(shuō)都是透明的。當(dāng)然,這里的文件塊副本冗余可以通過(guò)文件進(jìn)行配置,在HDFS中,可以通過(guò)終端命令直接獲得文件和塊信息,比如以下命令可以列出文件系統(tǒng)中組成各個(gè)文件的塊:hadoopfsck/-files-blocks磁盤(pán)有一個(gè)BlockSize的概念,它是磁盤(pán)讀/寫(xiě)數(shù)據(jù)的最23任務(wù)實(shí)施(1)服務(wù)進(jìn)程管理hadoop-daemon.sh腳本是啟動(dòng)和停止Hadoop后臺(tái)程序,--config參數(shù)指定啟動(dòng)程序時(shí)用到的配置文件目錄。大括號(hào)中的namenode和datenode是需要啟動(dòng)的進(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è)置緩存的大小,這個(gè)參數(shù)要設(shè)置為系統(tǒng)頁(yè)面大小的倍數(shù),以byte為單位。<property><name>io.file.buffer.size</name><value>131072</value></property>設(shè)置HDFS的NameNode的格式化信息存儲(chǔ)路徑。<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就會(huì)按照設(shè)置將文件系統(tǒng)塊復(fù)制為3份。如果采用的是偽分布配置,這里參數(shù)應(yīng)設(shè)置為1,否則在單獨(dú)一個(gè)數(shù)據(jù)節(jié)點(diǎn)上運(yùn)行時(shí),HDFS無(wú)法將塊復(fù)制到3個(gè)數(shù)據(jù)節(jié)點(diǎn)上,所以會(huì)持續(xù)警告塊的副本不夠。<property><name>dfs.replication</name><value>3</value></property>(2)HDFS屬性配置hdfs-site.xml設(shè)置本地文件(2)HDFS屬性配置安全模式NameNode啟動(dòng)后會(huì)進(jìn)入一個(gè)稱(chēng)為安全模式的特殊狀態(tài)。處于安全模式下的文件系統(tǒng)只可讀不可寫(xiě)。NameNode從所有的DataNode上接收心跳信號(hào)和塊狀態(tài)報(bào)告。當(dāng)在進(jìn)行系統(tǒng)維護(hù)或者集群維護(hù)時(shí),不希望用戶(hù)再去操作HDFS文件系統(tǒng)中的文件,這時(shí)候需要手動(dòng)將NameNode設(shè)置成安全模式的狀態(tài)。該操作需要HDFS管理用戶(hù)來(lái)進(jìn)行實(shí)現(xiàn),即hdfs用戶(hù)。進(jìn)入安全模式的命令如下:$hadoopdfsadmin-safemodeenter$hadoopdfsadmin-safemodeget執(zhí)行結(jié)果如下:SafemodeisON(2)HDFS屬性配置安全模式NameNode啟動(dòng)后會(huì)進(jìn)入一(2)HDFS屬性配置文件安全下面簡(jiǎn)單介紹Hadoop是采用哪種機(jī)制來(lái)確保NameNode的安全的。第一種是備份NameNode上持久化存儲(chǔ)的元數(shù)據(jù)文件,然后將其轉(zhuǎn)儲(chǔ)到其他文件系統(tǒng)中,這種轉(zhuǎn)儲(chǔ)是同步的、原子的操作。第二種是系統(tǒng)中同步運(yùn)行一個(gè)SecondaryNameNode(二級(jí)NameNode)。(2)HDFS屬性配置文件安全下面簡(jiǎn)單介紹Hadoop是采用(2)HDFS屬性配置可靠性管理為了保證HDFS文件系統(tǒng)的可靠性,可以采取以下策略:●冗余副本策略。第一種是通過(guò)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)建一個(gè)恢復(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)配置案例開(kāi)發(fā)環(huán)境①運(yùn)行這個(gè)案例前,需要對(duì)大數(shù)據(jù)開(kāi)發(fā)環(huán)境進(jìn)行配置,首先,需要在用于開(kāi)發(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)境變量中,首先在用戶(hù)變量中添加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④插件拷貝完成后,啟動(dòng)Eclipse,配置Hadoop插件。在主菜單欄中選擇“Window→Preferences→HadoopMap/Reduce”命令,在“Hadoopinstallationdiretory”的文本框中輸入hadoop-2.7.0的目錄路徑,最后單擊“OK”按鈕。如圖3-13所示。圖3-13配置Hadoop安裝路徑④插件拷貝完成后,啟動(dòng)Eclipse,配置Hadoop插件38⑤在Eclipse中能看到DFSLocations,如圖3-14所示。圖3-14DFSLocations目錄⑤在Eclipse中能看到DFSLocations,如圖39編輯HDFS的訪(fǎng)問(wèn)地址以及端口,如圖3-15所示,編輯DFSMaster下對(duì)應(yīng)的Host以及Port文本框,這樣Eclipse就能看到HDFS所對(duì)應(yīng)的文件。如圖3-15所示。圖3-15編輯HDFS的訪(fǎng)問(wèn)地址與端口編輯HDFS的訪(fǎng)問(wèn)地址以及端口,如圖3-15所示,編輯DFS40⑥編寫(xiě)程序上傳數(shù)據(jù)。導(dǎo)入項(xiàng)目工程bigdatademo-hdfs,在HdfsClient類(lèi)中定義fs.defaultFS。定義HDFS的配置信息:conf=newConfiguration();onf=newConfconf.set("fs.defaultFS","hdfs://0:8020");實(shí)現(xiàn)上傳文件upload的方法:/***上傳文件*@paramlocalfile:本地的文件路徑*@paramremotefile:上傳到hdfs上的文件路徑*@throwsException*/⑥編寫(xiě)程序上傳數(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啟動(dòng)主函數(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());}} }}啟動(dòng)主函數(shù),遍歷/data/Webmagic目錄下的文件,把43啟動(dòng)主函數(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());}} }}啟動(dòng)主函數(shù),遍歷/data/Webmagic目錄下的文件,把44任務(wù)3.3使用Sqoop轉(zhuǎn)換MySQL中的學(xué)生成績(jī)數(shù)據(jù)到Hive中任務(wù)目標(biāo)1.熟悉Sqoop工具的使用方法。2.學(xué)會(huì)利用Navicat導(dǎo)入文件并創(chuàng)建表格的方法。3.學(xué)會(huì)利用Sqoop工具將MySQL表格導(dǎo)入Hive中的方法。任務(wù)3.3使用Sqoop轉(zhuǎn)換MySQL中的學(xué)生成績(jī)數(shù)據(jù)到Hi45任務(wù)實(shí)施
(1)配置MySQL數(shù)據(jù)庫(kù)
在Navicat中導(dǎo)入文件并創(chuàng)建表格。打開(kāi)Navicat并連接上本地?cái)?shù)據(jù)庫(kù),如圖3-16所示。圖3-16利用Navicat連接本地?cái)?shù)據(jù)庫(kù)任務(wù)實(shí)施
(1)配置MySQL數(shù)據(jù)庫(kù)
在Navicat中導(dǎo)入46在數(shù)據(jù)庫(kù)recomm中導(dǎo)入文件。在連接列表中選擇recomm數(shù)據(jù)庫(kù),在快捷工具欄下,單擊“導(dǎo)入導(dǎo)出”按鈕,如圖3-17所示。圖3-17在數(shù)據(jù)庫(kù)recomm中導(dǎo)入文件在數(shù)據(jù)庫(kù)recomm中導(dǎo)入文件。在連接列表中選擇recomm47②在彈出的窗口中選擇文件格式,這里為txt文件。在導(dǎo)入類(lèi)型中選中“文字文件(*.txt)”單選按鈕,最后單擊“下一步>”按鈕,如圖3-18所示。圖3-18選擇文件格式②在彈出的窗口中選擇文件格式,這里為txt文件。在導(dǎo)入類(lèi)型中48③單擊“導(dǎo)入從:”文本框旁“…”按鈕,選擇文件保存的路徑。單擊“∨”按鈕,在“編碼”下拉菜單中選擇“65001(UTF-8)”菜單命令,單擊“下一步>”按鈕。如圖3-19所示。圖3-19設(shè)置編碼格式③單擊“導(dǎo)入從:”文本框旁“…”按鈕,選擇文件保存的路徑。49④根據(jù)文件保存形式選擇分隔符。選中“欄位定界符”下“逗號(hào)(,)”單選按鈕,然后單擊“下一步>”按鈕,如圖3-20所示。圖3-20配置分隔符④根據(jù)文件保存形式選擇分隔符。選中“欄位定界符”下“逗號(hào)(,50⑤默認(rèn)情況下會(huì)將導(dǎo)入文本文檔的第一行作為字段名稱(chēng),這里設(shè)置從文本文檔的第二行開(kāi)始導(dǎo)入,導(dǎo)入到數(shù)據(jù)數(shù)據(jù)庫(kù)第一欄中。單擊“下一步>”按鈕,如圖3-21所示。圖3-21導(dǎo)入數(shù)據(jù)配置⑤默認(rèn)情況下會(huì)將導(dǎo)入文本文檔的第一行作為字段名稱(chēng),這里設(shè)置從51⑥最后多次單擊“下一步>”按鈕,使用默認(rèn)配置,直到最后單擊“開(kāi)始”按鈕,完成導(dǎo)入配置,如圖3-22所示。圖3-22完成導(dǎo)入操作⑥最后多次單擊“下一步>”按鈕,使用默認(rèn)配置,直到最后單擊“52可以看到,該數(shù)據(jù)庫(kù)下生成了名為gradstu的表格,打開(kāi)后如圖3-23所示。圖3-22完成導(dǎo)入操作可以看到,該數(shù)據(jù)庫(kù)下生成了名為gradstu的表格,打開(kāi)后如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ù)庫(kù)導(dǎo)入,代碼如下:
sqoopimport--connectjdbc:mysql://34:3306/recomm--usernameroot-P–tablegradstu--hive-import-m1
上圖中的34即為數(shù)據(jù)庫(kù)的IP地址,3306為端口,用戶(hù)名為root,-P為手動(dòng)輸入密碼。注意:如果數(shù)據(jù)庫(kù)安裝在了本地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查詢(xún)表中數(shù)據(jù)可以看到,已經(jīng)有了gradstu這個(gè)表格,現(xiàn)在查看這個(gè)表格內(nèi)容,運(yùn)行如下代碼:hive>select*fromgradstu;發(fā)現(xiàn)表格已經(jīng)導(dǎo)入,至此功能完成!如圖3-26所示。圖3-26查詢(xún)表中數(shù)據(jù)可以看到,已經(jīng)有了gradstu這個(gè)56通過(guò)本項(xiàng)目,主要學(xué)習(xí)了數(shù)據(jù)采集的功能,其中分為網(wǎng)絡(luò)爬蟲(chóng)與數(shù)據(jù)傳輸兩部分。網(wǎng)絡(luò)爬蟲(chóng)選用了WebMagic爬蟲(chóng)框架,其基于Java開(kāi)發(fā)的特點(diǎn)與學(xué)情分析系統(tǒng)開(kāi)發(fā)環(huán)境(JavaEE)相吻合,同時(shí)通過(guò)網(wǎng)絡(luò)爬蟲(chóng)的開(kāi)發(fā),幫助使用者熟悉HTML的基本結(jié)構(gòu)以及解析網(wǎng)頁(yè)內(nèi)容的方法。在數(shù)據(jù)傳輸部分,主要實(shí)現(xiàn)了本地文件系統(tǒng)與HDFS文件系統(tǒng)的連接,以及MySQL數(shù)據(jù)庫(kù)與Hive數(shù)據(jù)倉(cāng)庫(kù)的數(shù)據(jù)傳輸。項(xiàng)目小結(jié)項(xiàng)目小結(jié)57Hadoop大數(shù)據(jù)平臺(tái)構(gòu)建與應(yīng)用Hadoop大數(shù)據(jù)58項(xiàng)目3就業(yè)崗位數(shù)據(jù)采集和存儲(chǔ)項(xiàng)目359任務(wù)3.1使用網(wǎng)絡(luò)爬蟲(chóng)采集崗位招聘數(shù)據(jù)A任務(wù)3.2采集的數(shù)據(jù)上傳到HDFSB任務(wù)3.3使用Sqoop轉(zhuǎn)換Mysql中的學(xué)生成績(jī)數(shù)據(jù)到Hive中C項(xiàng)目描述任務(wù)3.1使用網(wǎng)絡(luò)爬蟲(chóng)采集崗位招聘數(shù)據(jù)A任務(wù)3.2采集的60任務(wù)3.1使用網(wǎng)絡(luò)爬蟲(chóng)采集崗位招聘數(shù)據(jù)【知識(shí)目標(biāo)】●識(shí)記WebMagic的流程架構(gòu)和HDFS的基礎(chǔ)架構(gòu)以及Hive的基本概念和特點(diǎn)。●領(lǐng)會(huì)網(wǎng)絡(luò)爬蟲(chóng)的編程實(shí)現(xiàn)的步驟和方法?!炯寄苣繕?biāo)】●學(xué)會(huì)使用WebMagic開(kāi)發(fā)網(wǎng)絡(luò)爬蟲(chóng)的步驟和方法●學(xué)會(huì)HDFS服務(wù)進(jìn)程管理。●學(xué)會(huì)HDFS屬性配置管理?!駥W(xué)會(huì)HDFS上傳文件的方法?!駥W(xué)會(huì)Sqoop上傳文件至Hive中的方法。任務(wù)3.1使用網(wǎng)絡(luò)爬蟲(chóng)采集崗位招聘數(shù)據(jù)【知識(shí)目標(biāo)】61知識(shí)準(zhǔn)備webmagic-scriptswebmagic-seleniumwebmagic-saxonwebmagic-samplesWebMagic項(xiàng)目里還有幾個(gè)包,這些都是一些實(shí)驗(yàn)性的功能,目的只是提供一些與外圍工具整合的樣例。webmagic-avalon13524WebMagic的是一個(gè)無(wú)須配置、便于二次開(kāi)發(fā)的爬蟲(chóng)框架,它提供簡(jiǎn)單靈活的API,只需少量代碼即可實(shí)現(xiàn)一個(gè)爬蟲(chóng)。其架構(gòu)流程如圖3-1所示。3-1WebMagic架構(gòu)圖知識(shí)準(zhǔn)備webmagic-scriptswebmagic-s任務(wù)實(shí)施
(1)解析崗位列表頁(yè)源代碼崗位信息頁(yè)后續(xù)列表分頁(yè)圖3-2崗位列表頁(yè)結(jié)構(gòu)任務(wù)實(shí)施
(1)解析崗位列表頁(yè)源代碼崗位信息頁(yè)后續(xù)列表分頁(yè)圖63這是在WebMagic框架中的PageProcessor組件中定制實(shí)現(xiàn)的,首先要做的是設(shè)置抓取的基本配置,包括編碼、抓取間隔、重試次數(shù),代碼如下:privateSitesite=Site.me().setRetryTimes(3).setSleepTime(10).setCharset("gbk");這里選擇重試次數(shù)為3次,抓取間隔為10毫秒,編碼根據(jù)為51job網(wǎng)頁(yè)源代碼可以查看得到,如下所示:<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ì)算招聘,求職】-前程無(wú)憂(yōu)</title>該招聘網(wǎng)站的編碼為gbk。這是在WebMagic框架中的PageProcessor組件64接下來(lái),判斷當(dāng)前分析的頁(yè)面是否為崗位列表頁(yè)。不難發(fā)現(xiàn),列表頁(yè)的URL中都含有字符段,可以通過(guò)簡(jiǎn)單的if語(yǔ)句判斷:if(page.getUrl().toString().contains(""))下面分析崗位信息頁(yè)鏈接的HTML源代碼,并用Xpath語(yǔ)法解析出,添加至抓取隊(duì)列。檢查某個(gè)鏈接源代碼的方法,在崗位列表中右擊一項(xiàng),在彈出的下拉菜單中選擇“Inspect”命令,如圖3-3所示。圖3-3選擇Inspect命令接下來(lái),判斷當(dāng)前分析的頁(yè)面是否為崗位列表頁(yè)。不難發(fā)現(xiàn),列表頁(yè)65右擊并選擇檢查(Inspect)后,出現(xiàn)了該鏈接的HTML源碼,如圖3-4所示。圖3-4查看HTML源代碼右擊并選擇檢查(Inspect)后,出現(xiàn)了該鏈接的HTML源66可以發(fā)現(xiàn),所需要的URL地址是一個(gè)<p>標(biāo)簽下的唯一的超鏈接,該標(biāo)簽的class名為t1。同理,這個(gè)崗位列表頁(yè)下的所有崗位信息頁(yè)的URL都有著相同的格式。因此可以使用Xpath全部識(shí)別,并添加至抓取隊(duì)列,代碼實(shí)現(xiàn)如下:select=page.getHtml().xpath("http://p[@class='t1']");urls=select.links().all();page.addTargetRequests(urls);添加后續(xù)分頁(yè)的鏈接也是如上一樣的方法,在此省去分析HTML源碼的截圖,直接貼上代碼:select=page.getHtml().xpath("http://div[@class='dw_page']");urls=select.links().all();可以發(fā)現(xiàn),所需要的URL地址是一個(gè)<p>標(biāo)簽下的唯一的超鏈接67這里需要注意的是,要防止添加空白搜索結(jié)果頁(yè)的鏈接,不然將會(huì)把整個(gè)51job的崗位全都抓取下來(lái)。盡管按照定制的抓取邏輯,這種意外不會(huì)出現(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é)果頁(yè)的鏈接,不然將會(huì)把68(2)解析崗位信息頁(yè)源代碼如圖3-5所示,需要抓取崗位信息頁(yè)上用紅框標(biāo)注出來(lái)的信息。方法與上一步中的類(lèi)似,也是通過(guò)分析HTML源碼,再利用Xpath語(yǔ)法或者正則表達(dá)式去定位相關(guān)內(nèi)容.(2)解析崗位信息頁(yè)源代碼69具體的代碼如下:elseif(page.getUrl().toString().startsWith("/")){page.putField("url",page.getUrl().toString()); //崗位名稱(chēng)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類(lèi)中的Blacklist靜態(tài)String數(shù)組中,那么可以用簡(jiǎn)單的if語(yǔ)句來(lái)判斷:Booleanchoose=true;//判斷是否為培訓(xùn)公司發(fā)布的“垃圾”招聘信息 for(Stringi:Dictionary.Blacklist){ if(((String)resultItems.get("company")).contains(i)){ choose=false; } }對(duì)于發(fā)布日期,僅需要保留當(dāng)天發(fā)布的招聘信息,判斷代碼如下://判斷是否為當(dāng)天發(fā)布的招聘信息 if(!((String)resultItems.get("createtime")).contains(Today_Date)){ choose=false; }(3)根據(jù)條件保存抓取到的信息72其中Today_Date是一個(gè)靜態(tài)final型字符串:publicstaticfinalStringToday_Date=timeTostrMD(newDate());timeToStrMD是一個(gè)自定義獲取當(dāng)天月份和日期并返回諸如“05-05”形式字符串的方法。代碼如下:publicstaticStringtimeTostrMD(Datedate){ StringstrDate=""; if(date!=null){ SimpleDateFormatformat=newSimpleDateFormat("MM-dd"); strDate=format.format(date); } returnstrDate; }其中Today_Date是一個(gè)靜態(tài)final型字符串:73在篩選完之后,便可以將抓取內(nèi)容選擇性地保存至本地的某個(gè)文件中,這里定制的保存格式為一個(gè)崗位保存一行,每行中的信息用制表符\t分隔,最后保存在一個(gè)以日期命名的文本文件中,代碼如下:try{ //定義存儲(chǔ)路徑,以每天為一個(gè)文件存儲(chǔ) 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)容選擇性地保存至本地的某個(gè)文件中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,通過(guò)上述步驟的講解,讀者應(yīng)該可以定制這兩個(gè)組件了,而調(diào)用這兩個(gè)核心組件是通過(guò)Spider類(lèi),簡(jiǎn)單的代碼如下:Spider.create(newCrawlJob()) .addUrl(URL_START) .addPipeline(newPipelineJob()).thread(5).run();由于要將Java程序?qū)С鰹閖ar文件,并且需要實(shí)現(xiàn)無(wú)參傳遞(使用默認(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ò)資源和各種圖書(shū)資源,學(xué)習(xí)HDFS文件系統(tǒng)的使用方法。2.將利用WebMagic爬取工具爬取的招聘崗位信息上傳到HDFS文件系統(tǒng)中。任務(wù)目標(biāo)1.熟悉HDFS工作原理。2.學(xué)會(huì)文件系統(tǒng)的屬性配置方法。3.學(xué)會(huì)通過(guò)多種方式上傳文件至HDFS文件系統(tǒng)的方法。任務(wù)3.2采集的數(shù)據(jù)上傳到HDFS任務(wù)描述78知識(shí)準(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)知識(shí)準(zhǔn)備
在HDFS體系結(jié)構(gòu)采用Master/Slave的主79磁盤(pán)有一個(gè)BlockSize的概念,它是磁盤(pán)讀/寫(xiě)數(shù)據(jù)的最小單位。文件系統(tǒng)的塊一般為幾千字節(jié)(byte),磁盤(pán)塊一般為512字節(jié)(byte)。HDFS也有Block的概念,但它的塊是一個(gè)很大的單元,是文件存儲(chǔ)處理的邏輯單元。默認(rèn)是64MB。像硬盤(pán)中的文件系統(tǒng)一樣,在HDFS中的文件將會(huì)按塊大小進(jìn)行分解,并作為獨(dú)立的單元進(jìn)行存儲(chǔ)。但和硬盤(pán)中的文件系統(tǒng)不一樣的是,存儲(chǔ)在塊中的一個(gè)比塊小的文件并不會(huì)占據(jù)一個(gè)塊大小的物理空間(HDFS中一個(gè)塊只存儲(chǔ)一個(gè)文件的內(nèi)容)。HDFS作為一個(gè)分布式文件系統(tǒng),是設(shè)計(jì)用來(lái)處理大文件的,使用抽象的塊會(huì)帶來(lái)很多好處。一個(gè)好處是可以存儲(chǔ)任意大的文件,而又不會(huì)受到網(wǎng)絡(luò)中任一單個(gè)節(jié)點(diǎn)磁盤(pán)大小的限制。另外一個(gè)好處是使用抽象塊作為操作的單元可簡(jiǎn)化存儲(chǔ)子系統(tǒng),不僅如此,塊更有利于分布式文件系統(tǒng)中復(fù)制容錯(cuò)的實(shí)現(xiàn)。在HDFS中為了處理節(jié)點(diǎn)故障,默認(rèn)將文件塊副本數(shù)設(shè)定為3份,分別存儲(chǔ)在集群的不同節(jié)點(diǎn)上。當(dāng)一個(gè)塊損壞時(shí),系統(tǒng)會(huì)通過(guò)NameNode獲取元數(shù)據(jù)信息,在另外的機(jī)器上讀取一個(gè)副本并進(jìn)行存儲(chǔ),這個(gè)過(guò)程對(duì)用戶(hù)來(lái)說(shuō)都是透明的。當(dāng)然,這里的文件塊副本冗余可以通過(guò)文件進(jìn)行配置,在HDFS中,可以通過(guò)終端命令直接獲得文件和塊信息,比如以下命令可以列出文件系統(tǒng)中組成各個(gè)文件的塊:hadoopfsck/-files-blocks磁盤(pán)有一個(gè)BlockSize的概念,它是磁盤(pán)讀/寫(xiě)數(shù)據(jù)的最80任務(wù)實(shí)施(1)服務(wù)進(jìn)程管理hadoop-daemon.sh腳本是啟動(dòng)和停止Hadoop后臺(tái)程序,--config參數(shù)指定啟動(dòng)程序時(shí)用到的配置文件目錄。大括號(hào)中的namenode和datenode是需要啟動(dòng)的進(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è)置緩存的大小,這個(gè)參數(shù)要設(shè)置為系統(tǒng)頁(yè)面大小的倍數(shù),以byte為單位。<property><name>io.file.buffer.size</name><value>131072</value></property>設(shè)置HDFS的NameNode的格式化信息存儲(chǔ)路徑。<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就會(huì)按照設(shè)置將文件系統(tǒng)塊復(fù)制為3份。如果采用的是偽分布配置,這里參數(shù)應(yīng)設(shè)置為1,否則在單獨(dú)一個(gè)數(shù)據(jù)節(jié)點(diǎn)上運(yùn)行時(shí),HDFS無(wú)法將塊復(fù)制到3個(gè)數(shù)據(jù)節(jié)點(diǎn)上,所以會(huì)持續(xù)警告塊的副本不夠。<property><name>dfs.replication</name><value>3</value></property>(2)HDFS屬性配置hdfs-site.xml設(shè)置本地文件(2)HDFS屬性配置安全模式NameNode啟動(dòng)后會(huì)進(jìn)入一個(gè)稱(chēng)為安全模式的特殊狀態(tài)。處于安全模式下的文件系統(tǒng)只可讀不可寫(xiě)。NameNode從所有的DataNode上接收心跳信號(hào)和塊狀態(tài)報(bào)告。當(dāng)在進(jìn)行系統(tǒng)維護(hù)或者集群維護(hù)時(shí),不希望用戶(hù)再去操作HDFS文件系統(tǒng)中的文件,這時(shí)候需要手動(dòng)將NameNode設(shè)置成安全模式的狀態(tài)。該操作需要HDFS管理用戶(hù)來(lái)進(jìn)行實(shí)現(xiàn),即hdfs用戶(hù)。進(jìn)入安全模式的命令如下:$hadoopdfsadmin-safemodeenter$hadoopdfsadmin-safemodeget執(zhí)行結(jié)果如下:SafemodeisON(2)HDFS屬性配置安全模式NameNode啟動(dòng)后會(huì)進(jìn)入一(2)HDFS屬性配置文件安全下面簡(jiǎn)單介紹Hadoop是采用哪種機(jī)制來(lái)確保NameNode的安全的。第一種是備份NameNode上持久化存儲(chǔ)的元數(shù)據(jù)文件,然后將其轉(zhuǎn)儲(chǔ)到其他文件系統(tǒng)中,這種轉(zhuǎn)儲(chǔ)是同步的、原子的操作。第二種是系統(tǒng)中同步運(yùn)行一個(gè)SecondaryNameNode(二級(jí)NameNode)。(2)HDFS屬性配置文件安全下面簡(jiǎn)單介紹Hadoop是采用(2)HDFS屬性配置可靠性管理為了保證HDFS文件系統(tǒng)的可靠性,可以采取以下策略:●冗余副本策略。第一種是通過(guò)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)建一個(gè)恢復(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)配置案例開(kāi)發(fā)環(huán)境①運(yùn)行這個(gè)案例前,需要對(duì)大數(shù)據(jù)開(kāi)發(fā)環(huán)境進(jìn)行配置,首先,需要在用于開(kāi)發(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)境變量中,首先在用戶(hù)變量中添加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④插件拷貝完成后,啟動(dòng)Eclipse,配置Hadoop插件。在主菜單欄中選擇“Window→Preferences→HadoopMap/Reduce”命令,在“Hadoopinstallationdiretory”的文本框中輸入hadoop-2.7.0的目錄路徑,最后單擊“OK”按鈕。如圖3-13所示。圖3-13配置Hadoop安裝路徑④插件拷
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030葡萄酒行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2025-2030葡萄牙葡萄酒行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 常州2025年江蘇常州市事業(yè)單位招聘259人筆試歷年參考題庫(kù)附帶答案詳解
- 安全知識(shí)基礎(chǔ)試題及答案
- 安徽安徽新聞出版職業(yè)技術(shù)學(xué)院招聘任務(wù)型教師143人筆試歷年參考題庫(kù)附帶答案詳解
- 安慶2025年安徽安慶市迎江區(qū)事業(yè)單位招聘30人筆試歷年參考題庫(kù)附帶答案詳解
- 寧波浙江寧波市北侖區(qū)農(nóng)業(yè)技術(shù)推廣中心招聘編外人員筆試歷年參考題庫(kù)附帶答案詳解
- 安全員A證考試試題(得分題)含完整答案詳解(有一套)
- 天津2025年天津科技大學(xué)博士或副高及以上崗位招聘筆試歷年參考題庫(kù)附帶答案詳解
- 天津2025年天津醫(yī)科大學(xué)眼科醫(yī)院招聘11人筆試歷年參考題庫(kù)附帶答案詳解
- 渣土車(chē)租賃合同
- 2025屆高考小說(shuō)專(zhuān)題復(fù)習(xí)-小說(shuō)敘事特征+課件
- 部編版二年級(jí)下冊(cè)寫(xiě)字表字帖(附描紅)
- 干部履歷表(中共中央組織部2015年制)
- GB/T 5657-2013離心泵技術(shù)條件(Ⅲ類(lèi))
- GB/T 3518-2008鱗片石墨
- GB/T 17622-2008帶電作業(yè)用絕緣手套
- GB/T 1041-2008塑料壓縮性能的測(cè)定
- 400份食物頻率調(diào)查問(wèn)卷F表
- 滑坡地質(zhì)災(zāi)害治理施工
- 實(shí)驗(yàn)動(dòng)物從業(yè)人員上崗證考試題庫(kù)(含近年真題、典型題)
評(píng)論
0/150
提交評(píng)論