- 論壇徽章:
- 0
|
假設一個這樣的應用場景:需要對一個大日志文件(這個文件有100G或1T大)做用戶來源的統(tǒng)計,需要<br>得到的結果是:廣東省 xxx;北京xxx…… 或 電信 xxxx ;聯(lián)通 xxxx。<br> 主要的工作步驟很簡單:獲取到用戶的IP,解析到用戶IP的地址,然后做地址的統(tǒng)計。<br> 現(xiàn)在我們用hadoop來簡單實現(xiàn)),在實現(xiàn)過程中,對ip來源地址的解析我現(xiàn)在偷懶只是簡單使用了web調用接口,而不使用程序client調用接口和解析純真庫。<br><br> 定義Map方法(日志格式為:User_IP|date|URI……):<br><a href="http://blog.chinaunix.net/attachment/201110/27/22270773_1319685789JFTj.jpg" target="_blank" target="_blank"><img src="http://blog.chinaunix.net/attachment/201110/27/22270773_1319685789JFTj.jpg" .load="imgResize(this, 650);" ;="" border="0"></a><br>主要流程為:獲取到每行的第一個字段,使用whois對這個ip進行解析,然后,將來源地址和來源地址的數(shù)量做一個key-value。<br><br>Reduce:<br> <a href="http://blog.chinaunix.net/attachment/201110/27/22270773_1319685826K5l5.jpg" target="_blank" target="_blank"><img src="http://blog.chinaunix.net/attachment/201110/27/22270773_1319685826K5l5.jpg" .load="imgResize(this, 650);" ;="" border="0"></a><br>這個就更簡單了;對每個key-value對做相加的操作。<br><br>主體程序:<br><a href="http://blog.chinaunix.net/attachment/201110/27/22270773_13196858602wuY.jpg" target="_blank" target="_blank"><img src="http://blog.chinaunix.net/attachment/201110/27/22270773_13196858602wuY.jpg" .load="imgResize(this, 650);" ;="" border="0"></a><br>在這里感嘆一句:以前寫個分布式并行運行可麻煩一點,現(xiàn)在很多的一些調度框架使用起來做<br>這方面的事情方便很多)<br><br><br>[hadoop@hadoop-237-13 bin]$ hadoop fs -cat /test/userplace/gzoutput/part-00000<br>
廣東省廣州市 電信 3<br>
廣東省汕尾市 電信 1<br>
江蘇省蘇州市 電信 1<br>
福建省泉州市 電信 1<br><br><br><br>在這里引申一個問題,hadoop中使用第三方包的方法:<br>1.將第三方jar包放在集群中每個節(jié)點$HADOOP_HOME/lib目錄下或者JDK的ext目錄下,其中<br>$HAOOP_HOME為Hadoop的根目錄。善于偷懶所以我也采用這種了,因為我做的一些運算使用<br>的包還是比較固定,在裝hadoop的時候打包進去就行。<br><br>2.將所有的jar包解壓縮,然后把他和源程序的類文件打包到一個jar包中。<br><br>3.使用DistributeCache <a target="_blank" href="http://blog.csdn.net/amuseme_lu/article/details/6706110">http://blog.csdn.net/amuseme_lu/article/details/6706110</a><br><br> 對DistribueCache的使用是抄網(wǎng)上的<br> a. 配置應用程序的cache,把需要使用的文件上傳到DFS中去 <br> $ bin/hadoop fs -copyFromLocal lookup.dat /myapp/lookup.dat <br> $ bin/hadoop fs -copyFromLocal map.zip /myapp/map.zip <br> $ bin/hadoop fs -copyFromLocal mylib.jar /myapp/mylib.jar <br>$ bin/hadoop fs -copyFromLocal mytar.tar /myapp/mytar.tar<br>$ bin/hadoop fs -copyFromLocal mytgz.tgz /myapp/mytgz.tgz <br> $ bin/hadoop fs -copyFromLocal mytargz.tar.gz /myapp/mytargz.tar.gz <br><br><br> b. 配置JobConf<br> JobConf job = new JobConf(); <br> DistributedCache.addCacheFile(new URI("/myapp/lookup.dat#lookup.dat"),job); // 這里的lookup.dat加了一個符號連接<br> DistributedCache.addCacheArchive(new URI("/myapp/map.zip", job); <br> DistributedCache.addFileToClassPath(new Path("/myapp/mylib.jar"), job); // 這里是把相應的jar包加到Task的啟動路徑上去<br> DistributedCache.addCacheArchive(new URI("/myapp/map.zip", job); <br> DistributedCache.addFileToClassPath(new Path("/myapp/mylib.jar"), job); // 這里是把相應的jar包加到Task的啟動路徑上去<br> Distri<br>butedCache.addCacheArchive(new URI("/myapp/mytar.tar", job); <br> DistributedCache.addCacheArchive(new URI("/myapp/mytargz.tar.gz", job)<br><br><br><br><br>c. 在Mapper或者Reducer任務中使用這些文件<br> <ul class="wysiwygUl1"><li class="wysiwygLi">public static class MapClass extends MapReduceBase </li><li class="wysiwygLi"> implements Mapper<K, V, K, V> { </li><li class="wysiwygLi"><br></li><li class="wysiwygLi"> private Path[] localArchives; </li><li class="wysiwygLi"> private Path[] localFiles; </li><li class="wysiwygLi"><br></li><li class="wysiwygLi"> public void configure(JobConf job) { </li><li class="wysiwygLi"> // Get the cached archives/files </li><li class="wysiwygLi"> localArchives = DistributedCache.getLocalCacheArchives(job); // 得到本地打包的文件,一般是數(shù)據(jù)文件,如字典文件 </li><li class="wysiwygLi"> localFiles = DistributedCache.getLocalCacheFiles(job); // 得到本地緩沖的文件,一般是配置文件等 </li><li class="wysiwygLi"> } </li><li class="wysiwygLi"><br></li><li class="wysiwygLi"> public void map(K key, V value, </li><li class="wysiwygLi"> OutputCollector<K, V> output, Reporter reporter) </li><li class="wysiwygLi"> throws IOException { </li><li class="wysiwygLi"> // Use data from the cached archives/files here </li><li class="wysiwygLi"> // ... </li><li class="wysiwygLi"> // ... </li><li class="wysiwygLi"> output.collect(k, v); </li><li class="wysiwygLi"> } <br></li><li class="wysiwygLi"> } <br></li></ul><br> |
|