1. 說明
?數據處理時,可能會遇到數千萬以及上億條數據的情況。如果一次性處理所有數據,就會遇到內存不夠,計算時間太長等問題。上篇《Python海量數據處理之_單機優化》講述了單機的處理大數據的解決方案。下面將講述如何利用服務器集群處理大數據,這里使用的工具是Hadoop,內容太多,分為三部分介紹,本篇是第一部分集群搭建,后兩部分分別是原理和python調用。
2. Hadoop簡介
?如果有多臺用于數據計算的機器,可以使用Hadoop框架建立集群,統一分配布屬。Hadoop是由Apache基金會所開發的分布式系統基礎架構,最核心的設計是:HDFS和MapReduce。HDFS為數據提供了存儲,MapReduce為數據提供了計算,其中Mapper指的就是拆分處理,Reducer指的就是將結果合并。和單機一樣,核心也是拆分,處理,再合并。
?多臺機器同時處理數據,相對更復雜,需要考慮:數據共享,同步,沖突,資源分析,計算順序,以及主控宕機等等問題。
3. Hadoop安裝
?首先,需要配置起Hadoop環境,才能進行各種實驗。Hadoop有三種安裝方式:單機,偽分布式和分布式,前兩種都是在單機上安裝使用的。偽分布式即可以用單機實現,又可以理解分布式的原理,本文主要介紹偽分布式Hadoop的安裝。
1) 安裝Java
?Hadoop是java語言實現的,所以需要先安裝java和配置相關的環境變量,一般用apt-get安裝后環境就被自動配置了。
2) 創建hadoop用戶
?不一定非要創建hadoop用戶,因為考慮到有刪除ssh密碼等操作,為了機器安全性,這里創建了hadoop用戶。
$ sudo adduser hadoop
$ su hadoop # 之后的操作都在hadoop用戶下進行
3) 安裝配置ssh
?為了使本機能使用ssh登陸,需要安裝ssh服務端,并關掉 PAM認證,并設用戶密碼為空
$ sudo apt-get install -y openssh-server # 安裝ssh服務
$ sudo vim /etc/ssh/sshd_config # 將UsePAM設為no
$ sudo /etc/init.d/ssh start # 啟動ssh服務,如果安裝時已自啟動,則配置后用restart重啟
$ ssh localhost # 連接后用exit接出,此時用戶目錄下生成.ssh目錄
$ cd ~/.ssh # 以下幾步是為了設置當前用戶無密碼登陸
$ ssh-keygen -t rsa # 設置密碼為空,即直接回車
$ 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
#加下以入內容(在/etc/profile中設置也行)。設置后,用source ./barshrc讓它立即生效。
export HADOOP_PREFIX="/home/hadoop/hadoop" # 具體根據安裝目錄設置
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中加入如下內容(具體根據安裝目錄設置)
<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中加入如下內容
<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中加入如下內容
<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,則創建成功
10) 在etc/hadoop/*-env.sh中設置JAVA_HOME
(根據自己機器的配置)
export JAVA_HOME=/usr/lib/jvm/java-1.9.0-openjdk-amd64/
11) 啟動hdfs
$ hadoop/sbin/start-dfs.sh
12) 看當前服務啟動狀態
$ jps
?成功啟動后還可以通過訪問http://localhost:50070,來查看狀態。
13) 啟動所有服務
./sbin/start-all.sh
?成功啟動后還可以通過訪問http://localhost:8088/cluster,來查看狀態。
14) 問題及解決
?我在執行start-dfs.sh時,報錯util.NativeCodeLoader,意思是調用內部庫時出錯,內部庫指的是用JNI調的C庫,解決方法是用ldd看看so庫鏈接是否正常,如果so庫與當前系統不能匹配,則需要重編源碼。還有一種情況,就是環境變量沒設對,我這邊設置了兩個環境變量:
$ export JAVA_LIBRARY_PATH=/home/hadoop/hadoop/lib/native/
$ export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
之后問題得以解決,根本原因是不同Hadoop版本環境變量名有差別,所以跟著文檔做常會出現各種問題,而文檔中指定的版本很可能不是主流版本,已經無法下載了。解決方法是跟進腳本,定位具體問題。
4. 編譯Hadoop源碼
?如果上述可工作正常,則無需要編譯源碼。有些情況下,環境與二進制版本不一致,則需要下載源碼編譯,我下載的也是2.7.5版本的src包。重編時坑也很多。
源碼包解壓后,目錄中有BUILDING.txt文件,執行其中所有apt-get相關命令。然后編譯:
$ mvn package -Pdist,native -DskipTests –Dtar
mvn是編譯工具maven,編譯過程非常慢,編出將近4G。編譯后生成文件為hadoop-dist/target/hadoop-2.7.5.tar.gz,
在編譯過程中遇到三種報錯:
?一種報錯是“protoc failure”,用apt-get安裝該包后又報錯版本不對,最后編譯了protobuf-2.5.0包(注意install后要ldconfig,否則還是找不到),得以解決。
?另一個報錯是“No plugin descriptor found at META-INF”,我從csdn下載了一個,改了版本號就能用了。
?還有一種報錯是連不上marven服務器,于是在設置文件/etc/maven/settings.xml中加入了國內的鏡像地址。