1. 程式人生 > >Hadoop2.7.3及常用元件安裝和配置

Hadoop2.7.3及常用元件安裝和配置

最近在學Hadoop,從最開始的安裝配置,到簡單的小程式,再到專案實戰,都非常的有趣。最開始也是在網上找了很多教程來入門,但是因為有的教程是比較早期的Hadoop1.x甚至Hadoop0.x的,有些配置在現在流行的Hadoop2中可能會出問題,自己也被這些版本差異搞的很頭疼,不過好在網上還是能找到些資料的,也成功的配起了Hadoop以及常用的元件,在這裡也做個總結,避免以後重灌了系統又搞忘了當初是怎麼配置的,也能少走點彎路。

總結一下Hadoop及常用元件(HBase,Hive,Pig,Sqoop)的環境配置,作業系統:Ubuntu 16.04(類似的系統如Linux Mint也完全沒有問題,macOS也是可以的),JDK:oracle-java8(這個隨意,open-JDK8也是可以的)。

新增額外倉庫

sudo add-apt-repository ppa:webupd8team/java

回車以後輸入當前使用者密碼,然後再回車確認。之後更新倉庫

sudo apt-get update

然後安裝oracle-java8

sudo apt-get install oracle-java8-installer

環境變數呆會和Hadoop的一起配置,這裡先做另一步,Hadoop不管是叢集模式還是單機模式都要用到ssh登陸(和遠端登入類似),由於Ubuntu預設已經安裝了openssh-client,所以只需要安裝openssh-server即可

sudo apt-get install openssh-server

安裝好後,ctrl+alt+T開啟終端,使用ssh命令登陸本機

ssh localhost

ssh首次登陸會要求輸入yes生成金鑰,然後輸入當前使用者的密碼,然後ctrl+D退出,之後進入使用者目錄下的.ssh資料夾(這是個隱藏資料夾),加入授權

cd ~/.ssh/
ssh-keygen -t rsa
cat id_rsa.pub >> authorized_keys

之後再使用ssh登陸localhost時就不必再輸入密碼了,接下來下載Hadoop,HBase,Hive,Pig,到官網下載最新穩定版二進位制檔案包(一般檔名形如xxx-bin.tar.gz)

http://hadoop.apache.org/
http://hbase.apache.org/
http://hive.apache.org/
http://pig.apache.org/
http://sqoop.apache.org/

解壓後分別重新命名為hadoop,hbase,hive,pig,sqoop移動至/usr/local下,並且更改所有者為你的使用者名稱(目的是為了修改配置檔案方便,不用頻繁的sudo)如下

sudo chown your-user-name hadoop/
sudo chown your-user-name hbase/
sudo chown your-user-name hive/
sudo chown your-user-name pig/
sudo chown your-user-name sqoop/

之後進行環境變數的集中配置,大致要配置這些(儘可能多配置,方便今後的使用),開啟/etc/profile,在末尾追加如下內容

export PATH=$PATH:/usr/local/hadoop/sbin:/usr/local/hadoop/bin:/usr/local/hbase/bin:/usr/local/pig/bin:/usr/local/hive/bin:/usr/local/sqoop/bin
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HBASE_HOME=/usr/local/hbase
export HBASE_CLASSPATH=$HADOOP_HOME/etc/hadoop/
export HIVE_HOME=/usr/local/hive
export PIG_HOME=/usr/local/pig
export PIG_CLASSPATH=$HADOOP_HOME/etc/hadoop/
export SQOOP_HOME=/usr/local/sqoop

儲存退出,不急著source,因為重啟系統以後就能應用到全域性,而不僅僅是當前的終端視窗,然後設定開機啟動項(也是為了今後方便使用),大概有這些啟動項需要新增

start-dfs.sh(hdfs的啟動項)
start-yarn.sh(yarn的啟動項)
mr-jobhistory-daemon.sh start historyserver(historyserver的啟動項)
start-hbase.sh(hbase的啟動項)
hive --service hiveserver2 &(hive的啟動項)
sqoop2-server start(sqoop的啟動項)

之後,進行Hadoop的配置(很重要,這裡採用偽分散式配置),首先是core-site.xml,使用gedit編輯器開啟(也可以用其他編輯器,這裡隨意)

gedit /usr/local/hadoop/etc/hadoop/core-site.xml

在內建的<configuration></configuration>中新增配置內容,如下,等下會說明

<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
    <property>
        <name>hadoop.proxyuser.your-user-name.groups</name>
        <value>*</value>
    </property>    
    <property>
        <name>hadoop.proxyuser.your-user-name.hosts</name>
        <value>*</value>
    </property>
        <property>
        <name>hadoop.proxyuser.sqoop2.groups</name>
        <value>*</value>
    </property>    
    <property>
        <name>hadoop.proxyuser.sqoop2.hosts</name>
        <value>*</value>
    </property>
</configuration>

其中,hadoop.tmp.dir指的是臨時檔案存放處,這個指定是為了防止預設的臨時檔案儲存位置在系統重啟後被清除,fs.defaultFS預設的檔案系統位置,這裡使用localhost,埠號為9000(一般設定為9000),後面四個選項是為了hive和sqoop能夠正常使用JDBC介面登陸而設定的,之後修改配置檔案hdfs-site.xml

gedit /usr/local/hadoop/etc/hadoop/hdfs-site.xml

在內建的<configuration></configuration>中新增配置內容,如下,等下會說明

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

dfs.replication,這個是副本數,因為真實生產環境中Hadoop是運行於叢集當中,為了資料的安全,叢集間資料會有備份的副本,預設是3個副本,這裡因為是偽分散式配置,所以設定為1,另外兩個選項分別是指定NameNode和DataNode的位置(偽分散式配置,NameNode和DataNode都在一臺機子上),之後修改hadoop-env.sh檔案,追加兩個變數如下

export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export HADOOP_CLASSPATH=.:$CLASSPATH:$HADOOP_CLASSPATH:$HADOOP_HOME/bin

之後執行NameNode的格式化,此時先source一下/etc/profile,然後終端中輸入

hdfs namenode -format

看到返回0,以及日誌中出現“successfully formatted”字樣說明格式化成功,之後啟動一下hdfs

start-dfs.sh

第一次啟動出現提示,輸入yes,然後可以在localhost:50070中看到Hadoop的Web端頁面,這裡可以檢視各項屬性以及瀏覽hdfs的各級目錄,之後配置yarn,修改mapred-site.xml.template為mapred-site.xml,然後編輯

gedit /usr/local/hadoop/etc/hadoop/mapred-site.xml

在內建的<configuration></configuration>中新增配置內容,如下

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

然後修改yarn-site.xml

gedit /usr/local/hadoop/etc/hadoop/yarn-site.xml

在內建的<configuration></configuration>中新增配置內容,如下

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

之後啟動yarn和historyserver,並能夠在localhost:8088中訪問到

start-yarn.sh
mr-jobhistory-daemon.sh start historyserver

之後配置HBase,修改hbase-site.xml檔案

gedit /usr/local/hbase/conf/hbase-site.xml

在內建的<configuration></configuration>中新增配置內容,如下

<configuration>
    <property>
        <name>hbase.rootdir</name>
        <value>hdfs://localhost:9000/hbase</value>
    </property>
    <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
    </property>
    <property>
        <name>hbase.master.info.port</name>
        <value>60010</value>
    </property>
</configuration>

分別是設定HBase根目錄,允許發行,和手動設定HBase的Web端的埠號,之後修改hbase-env.sh,追加兩個變數如下

export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export HBASE_CLASSPATH=/usr/local/hadoop/etc/hadoop

之後安裝mysql,為之後配置Hive做準備,安裝mysql並設定好root密碼,在終端中輸入如下內容

sudo apt-get install mysql-client mysql-server

之後下載JDBC的connector,將jar包複製到hive/lib以及sqoop/server/lib,然後配置Hive,重新命名Hive的兩個配置檔案,將hive-default.xml.template改為hive-site.xml,hive-env.sh.template改為hive-env.sh,然後更改hive-site.xml,有好幾處需要修改,這裡都一一列舉出來

<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value>
    <description>
      JDBC connect string for a JDBC metastore.
      To use SSL to encrypt/authenticate the connection, provide database-specific SSL flag in the connection URL.
      For example, jdbc:postgresql://myhost/db?ssl=true for postgres database.
    </description>
</property>
<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
</property>
<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
    <description>Username to use against metastore database</description>
</property>
<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>your-password</value>
    <description>password to use against metastore database</description>
</property>
<property>
    <name>hive.metastore.schema.verification</name>
    <value>false</value>
    <description>
      Enforce metastore schema version consistency.
      True: Verify that version information stored in is compatible with one from Hive jars.  Also disable automatic
            schema migration attempt. Users are required to manually migrate schema after Hive upgrade which ensures
            proper metastore schema migration. (Default)
      False: Warn if the version information stored in metastore doesn't match with one from in Hive jars.
    </description>
</property>
<property>
    <name>datanucleus.schema.autoCreateAll</name>
    <value>true</value>
    <description>Auto creates necessary schema on a startup if one doesn't exist. Set this to false, after creating it once.To enable auto create also set hive.metastore.schema.verification=false. Auto creation is not recommended for production use cases, run schematool command instead.</description>
</property>
<property>
    <name>hive.exec.local.scratchdir</name>
    <value>/usr/local/hive/tmp/hive</value>
    <description>Local scratch space for Hive jobs</description>
</property>
<property>
    <name>hive.downloaded.resources.dir</name>
    <value>/usr/local/hive/tmp/${hive.session.id}_resources</value>
    <description>Temporary local directory for added resources in the remote file system.</description>
</property>
<property>
    <name>hive.querylog.location</name>
    <value>/usr/local/hive/tmp/hive</value>
    <description>Location of Hive run time structured log file</description>
</property>
<property>
    <name>hive.server2.logging.operation.log.location</name>
    <value>/usr/local/hive/tmp/hive/operation_logs</value>
    <description>Top level directory where operation logs are stored if logging functionality is enabled</description>
</property>

之後修改hive-config.sh

gedit /usr/local/hive/bin/hive-config.sh

追加三個變數

export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export HIVE_HOME=/usr/local/hive
export HADOOP_HOME=/usr/local/hadoop

之後配置Sqoop,開啟Sqoop的配置檔案

gedit /usr/local/sqoop/conf/sqoop.properties

將@
[email protected]
和@[email protected]替換成自己的目錄(不然它會自行生成,以後要找的時候就很麻煩可能找不到),然後還要修改一個地方

# Hadoop configuration directory
org.apache.sqoop.submission.engine.mapreduce.configuration.directory=/usr/local/hadoop/etc/hadoop

之後使用Sqoop工具初始化和驗證

sqoop2-tool upgrade
sqoop2-tool verify

Pig因為之前配置過環境變數,它本身又沒有後臺服務需要配置,所以不需要改配置檔案。最後重啟系統即可,以後每次系統啟動,後臺的服務就都已經就緒了,可以方便的進行程式設計或者是命令列操作,後續還會有相關的程式設計例項分享