Python海量數(shù)據(jù)處理之_Hadoop(一)集群搭建

1. 說明

?數(shù)據(jù)處理時(shí),可能會(huì)遇到數(shù)千萬以及上億條數(shù)據(jù)的情況。如果一次性處理所有數(shù)據(jù),就會(huì)遇到內(nèi)存不夠,計(jì)算時(shí)間太長(zhǎng)等問題。上篇《Python海量數(shù)據(jù)處理之_單機(jī)優(yōu)化》講述了單機(jī)的處理大數(shù)據(jù)的解決方案。下面將講述如何利用服務(wù)器集群處理大數(shù)據(jù),這里使用的工具是Hadoop,內(nèi)容太多,分為三部分介紹,本篇是第一部分集群搭建,后兩部分分別是原理和python調(diào)用。

2. Hadoop簡(jiǎn)介

?如果有多臺(tái)用于數(shù)據(jù)計(jì)算的機(jī)器,可以使用Hadoop框架建立集群,統(tǒng)一分配布屬。Hadoop是由Apache基金會(huì)所開發(fā)的分布式系統(tǒng)基礎(chǔ)架構(gòu),最核心的設(shè)計(jì)是:HDFS和MapReduce。HDFS為數(shù)據(jù)提供了存儲(chǔ),MapReduce為數(shù)據(jù)提供了計(jì)算,其中Mapper指的就是拆分處理,Reducer指的就是將結(jié)果合并。和單機(jī)一樣,核心也是拆分,處理,再合并。
?多臺(tái)機(jī)器同時(shí)處理數(shù)據(jù),相對(duì)更復(fù)雜,需要考慮:數(shù)據(jù)共享,同步,沖突,資源分析,計(jì)算順序,以及主控宕機(jī)等等問題。

3. Hadoop安裝

?首先,需要配置起Hadoop環(huán)境,才能進(jìn)行各種實(shí)驗(yàn)。Hadoop有三種安裝方式:?jiǎn)螜C(jī),偽分布式和分布式,前兩種都是在單機(jī)上安裝使用的。偽分布式即可以用單機(jī)實(shí)現(xiàn),又可以理解分布式的原理,本文主要介紹偽分布式Hadoop的安裝。

1) 安裝Java

?Hadoop是java語言實(shí)現(xiàn)的,所以需要先安裝java和配置相關(guān)的環(huán)境變量,一般用apt-get安裝后環(huán)境就被自動(dòng)配置了。

2) 創(chuàng)建hadoop用戶

?不一定非要?jiǎng)?chuàng)建hadoop用戶,因?yàn)榭紤]到有刪除ssh密碼等操作,為了機(jī)器安全性,這里創(chuàng)建了hadoop用戶。

$ sudo adduser hadoop
$ su hadoop # 之后的操作都在hadoop用戶下進(jìn)行

3) 安裝配置ssh

?為了使本機(jī)能使用ssh登陸,需要安裝ssh服務(wù)端,并關(guān)掉 PAM認(rèn)證,并設(shè)用戶密碼為空

$ sudo apt-get install -y openssh-server # 安裝ssh服務(wù)
$ sudo vim /etc/ssh/sshd_config # 將UsePAM設(shè)為no
$ sudo /etc/init.d/ssh start # 啟動(dòng)ssh服務(wù),如果安裝時(shí)已自啟動(dòng),則配置后用restart重啟
$ ssh localhost # 連接后用exit接出,此時(shí)用戶目錄下生成.ssh目錄
$ cd ~/.ssh # 以下幾步是為了設(shè)置當(dāng)前用戶無密碼登陸
$ ssh-keygen -t rsa # 設(shè)置密碼為空,即直接回車
$ cat ./id_rsa.pub >> ./authorized_keys 

4) 下載Hadoop

?http://www.apache.org/dyn/closer.cgi/hadoop/common/
?建議下載2.6或2.7的版本,不同版本配置文件不同,而2.7前后的版本教程較多,不用下源碼,下載bin包即可。

$ cd /home/hadoop/ # 安裝在哪里都行,但需要注意在配置文件中指定目錄
$ tar xvzf  hadoop-2.7.5.tar.gz
$ ln –s hadoop-2.7.5 hadoop # 方便以后更換版本
$ vi ~/.bashrc 

#加下以入內(nèi)容(在/etc/profile中設(shè)置也行)。設(shè)置后,用source ./barshrc讓它立即生效。

export HADOOP_PREFIX="/home/hadoop/hadoop"  # 具體根據(jù)安裝目錄設(shè)置
export YARN_CONF_DIR="/home/hadoop/hadoop"  
export HADOOP_COMMON_LIB_NATIVE_DIR="$HADOOP_PREFIX/lib/native"  
export HADOOP_OPTS="-Djava.library.path=$HADOOP_PREFIX/lib"  
export PATH=$PATH:$HADOOP_PREFIX/bin

5) 配置core-site.xml

$  vi hadoop/etc/hadoop/core-site.xml

在configure中加入如下內(nèi)容(具體根據(jù)安裝目錄設(shè)置)
<configuration>
        <property>
             <name>hadoop.tmp.dir</name>
             <value>file:/home/hadoop/hadoop/tmp</value>
             <description>Abase for other temporary directories.</description>
        </property>
        <property>
             <name>fs.defaultFS</name>
             <value>hdfs://localhost:9000</value>
        </property>
</configuration>

6) 配置hdfs-site.xml

$  vi hadoop/etc/hadoop/hdfs-site.xml
在configure中加入如下內(nèi)容

<configuration>
        <property>
             <name>dfs.replication</name>
             <value>1</value>
        </property>
        <property>
             <name>dfs.namenode.name.dir</name>
             <value>file:/home/hadoop/hadoop/tmp/dfs/name</value>
        </property>
        <property>
             <name>dfs.datanode.data.dir</name>
             <value>file:/home/hadoop/hadoop/tmp/dfs/data</value>
        </property>
</configuration>

7) 配置mapered-site.xml

$ cp ./etc/hadoop/mapred-site.xml.template ./etc/hadoop/mapred-site.xml
$ vi ./etc/hadoop/mapred-site.xml
在configure中加入如下內(nèi)容

<configuration>
        <property>
             <name>mapreduce.framework.name</name>
             <value>yarn</value>
        </property>
</configuration>

8) 配置yarn-site.xml

$ vi ./etc/hadoop/yarn-site.xml

<configuration>
        <property>
             <name>yarn.nodemanager.aux-services</name>
             <value>mapreduce_shuffle</value>
            </property>
</configuration>

9) 格式化namenode

$ hadoop namenode -format

?如果顯示Exiting with status 0,則創(chuàng)建成功

10) 在etc/hadoop/*-env.sh中設(shè)置JAVA_HOME

(根據(jù)自己機(jī)器的配置)

export JAVA_HOME=/usr/lib/jvm/java-1.9.0-openjdk-amd64/

11) 啟動(dòng)hdfs

$ hadoop/sbin/start-dfs.sh

12) 看當(dāng)前服務(wù)啟動(dòng)狀態(tài)

$ jps

?成功啟動(dòng)后還可以通過訪問http://localhost:50070,來查看狀態(tài)。

13) 啟動(dòng)所有服務(wù)

./sbin/start-all.sh

?成功啟動(dòng)后還可以通過訪問http://localhost:8088/cluster,來查看狀態(tài)。

14) 問題及解決

?我在執(zhí)行start-dfs.sh時(shí),報(bào)錯(cuò)util.NativeCodeLoader,意思是調(diào)用內(nèi)部庫時(shí)出錯(cuò),內(nèi)部庫指的是用JNI調(diào)的C庫,解決方法是用ldd看看so庫鏈接是否正常,如果so庫與當(dāng)前系統(tǒng)不能匹配,則需要重編源碼。還有一種情況,就是環(huán)境變量沒設(shè)對(duì),我這邊設(shè)置了兩個(gè)環(huán)境變量:

$ export JAVA_LIBRARY_PATH=/home/hadoop/hadoop/lib/native/
$ export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

之后問題得以解決,根本原因是不同Hadoop版本環(huán)境變量名有差別,所以跟著文檔做常會(huì)出現(xiàn)各種問題,而文檔中指定的版本很可能不是主流版本,已經(jīng)無法下載了。解決方法是跟進(jìn)腳本,定位具體問題。

4. 編譯Hadoop源碼

?如果上述可工作正常,則無需要編譯源碼。有些情況下,環(huán)境與二進(jìn)制版本不一致,則需要下載源碼編譯,我下載的也是2.7.5版本的src包。重編時(shí)坑也很多。
源碼包解壓后,目錄中有BUILDING.txt文件,執(zhí)行其中所有apt-get相關(guān)命令。然后編譯:

$ mvn package -Pdist,native -DskipTests –Dtar

mvn是編譯工具maven,編譯過程非常慢,編出將近4G。編譯后生成文件為hadoop-dist/target/hadoop-2.7.5.tar.gz,

在編譯過程中遇到三種報(bào)錯(cuò):
?一種報(bào)錯(cuò)是“protoc failure”,用apt-get安裝該包后又報(bào)錯(cuò)版本不對(duì),最后編譯了protobuf-2.5.0包(注意install后要ldconfig,否則還是找不到),得以解決。
?另一個(gè)報(bào)錯(cuò)是“No plugin descriptor found at META-INF”,我從csdn下載了一個(gè),改了版本號(hào)就能用了。
?還有一種報(bào)錯(cuò)是連不上marven服務(wù)器,于是在設(shè)置文件/etc/maven/settings.xml中加入了國內(nèi)的鏡像地址。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容