Hadoop2.5.0 搭建實錄 Hadoop HA Oozie-4.0.0-cdh5.3.6搭建

目錄:

  


第一步:準備相關材料

我是要在另一臺新服務器上搭建ESXi,部署了5個虛擬機,用 vSphere Client 管理。(注:如果選擇CD/DVD驅動器的時候,一直顯示正在連接,則需要重啓客戶端)

這裏我選用的是Cloudera公司的CDH版本,問題少一些,並且可以配套下載,避免遇到各種兼容問題。下載地址

  • CentOS-7-x86_64-Minimal-1511 。這個版本功能一應俱全,卻不到1G
  • OpenJDK 1.7
  • hadoop-2.5.0-cdh5.3.6
  • hbase-0.98.6-cdh5.3.6
  • hive-0.13.1-cdh5.3.6
  • zookeeper-3.4.5-cdh5.3.6
  • sqoop-1.4.5-cdh5.3.6
  • Xshell(方便敲命令)
  • SecureFXPortable(方便從本地上傳文件到虛擬機)

 


 

注:提前預覽需要修改的相關文件

系統配置

  1. /etc/hostname
  2. /etc/hosts
  3. /etc/sysconfig/network-scripts/ifcfg-eno16777984

相關軟件全放到/opt目錄下,而且環境變量全在各自的安裝目錄配置文件中設定(也可以在~/.bashrc 中統一設置)

環境變量

  1. hadoop
    1.   /opt/hadoop-xx/etc/hadoop/hadoop-env.sh
    2.   /opt/hadoop-xx/etc/hadoop/yarn-env.sh
    3.   /opt/hadoop-xx/etc/hadoop/mapred-env.sh
  2. hbase
    1.   /opt/hbase-xx/conf/hbase-env.sh
  3. hive
    1.   /opt/hive-xx/conf/hive-env.sh
  4. sqoop
    1.   /opt/sqoop-xx/conf/sqoop-env.sh

配置文件

  1. hadoop
    1.   /opt/hadoop-xx/etc/hadoop/slaves
    2.   /opt/hadoop-xx/etc/hadoop/core-site.xml
    3.   /opt/hadoop-xx/etc/hadoop/hdfs-site.xml
    4.   /opt/hadoop-xx/etc/hadoop/mapred-site.xml
    5.   /opt/hadoop-xx/etc/hadoop/yarn-site.xml 
  2. hbase
    1.   /opt/hbase-xx/conf/hbase-site.xml
    2.   /opt/hbase-xx/conf/backup-masters
    3.   /opt/hbase-xx/conf/regionservers
  3. zookeeper
    1.   /opt/zookeeper-xx/conf/zoo.cfg
    2.   在指定的目錄 dataDir下 創建文件myid
  4. hive
    1.   /opt/hive-xx/conf/hive-site.xml
  5. sqoop
    1.   /opt/sqoop-xx/bin/configure-sqoop

  


 

第二步:虛擬機環境搭建

  1. 使用 vSphere Client 創建虛擬機並指定自己下載的CentOS文件,先不設置網絡,啓動。
  2. 用root用戶登錄,然後通過修改 /etc/sysconfig/network-scripts/ifcfg-enoxxxxxx 文件設置橋接模式網絡,具體參照 CentOS7網卡設置爲橋接模式靜態IP配置方法詳解
  3. 修改 /etc/hostname 
  4. 修改 /etc/hosts
    192.168.0.155 NameNode1
    192.168.0.156 NameNode2
    192.168.0.157 DataNode1
    192.168.0.158 DataNode2
    192.168.0.159 DataNode3
    127.0.0.1     localhost  #這個必須要有

     

節點配置圖 

 


 

第三步:用戶信息

爲了以後的模塊化管理,打算hadoop,hbase,hive等等都單獨建用戶

因爲這5臺機器創建用戶,配置權限等的操作是一樣的,我們要不就是在五個機器上都敲一遍命令,要不就是在一臺機器上配完了再把文件複製過去,都比較繁瑣。

因爲我用的是Xshell,使用 【Alt + t , k】或者【工具】->【發送鍵輸入到所有會話】,這樣只要在一個會話中輸入命令,所有打開的會話都會執行,就像是同時在這5臺機器上敲命令一樣。

su  #使用root用戶
useradd -m hadoop -s  /bin/bash  #用同樣方式創建hbase,hive,zookeeper,sqoop用戶
passwd hadoop   #給用戶設置密碼
visudo  #給用戶設定權限  :98  在98行新加hadoop的權限即可

接下來就是安裝SSH、配置SSH無密碼登陸

首先更新一下系統軟件

yum upgrade

 

設置本機公鑰、私鑰

cd ~/.ssh/ # 若沒有該目錄,請先執行一次 mkdir ~/.ssh

ssh-keygen -t rsa #一路回車

cat id_rsa.pub >> authorized_keys # 將公鑰加入服務器

chmod 600 ./authorized_keys # 修改文件權限

-----------------------------------如果是非root用戶,下面這一步必須要做----------------------------------------------------

chmod 700 ~/.ssh   #修改文件夾權限  mkdir生成的文件夾默認是775,必須改成700;用ssh localhost生成的文件夾也可以

上面介紹的SSH免密登錄本機的,而我們的登錄關係是這樣的 

所以  還要分別賦予公鑰

  1. 將NameNode1,NameNode2的公鑰分別加入對方的授權文件
  2. 將NameNode1的公鑰分別加入DataNode1,DataNode2,DataNode3的授權文件
  3. 將NameNode2的公鑰分別加入DataNode1,DataNode2,DataNode3的授權文件
  4. 更改這5個.ssh的文件夾以及authorized_keys的權限

  


 

第四步 安裝、配置Java環境

使用yum安裝java(每一臺虛擬機)

sudo yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel

默認安裝路徑: /usr/lib/jvm/java-1.7.0-openjdk 

然後在 /etc/environment 中保存JAVA_HOME變量

sudo vi /etc/environment

內容如下

 


 

第5步 Zookeeper安裝配置

  1. 在一臺機器解壓安裝zookeeper,並進入該安裝目錄
  2. 將conf/zoo_example.cfg 重命名爲 zoo.cfg
    mv conf/zoo_example.cfg conf/zoo.cfg
  3. 編輯zoo.cfg內容
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/home/hadoop/data/zookeeper
    dataLogDir=/home/hadoop/logs/zookeeper
    clientPort=2181
    server.0=NameNode1:2888:3888
    server.1=NameNode2:2888:3888
    server.2=DataNode1:2888:3888
    server.3=DataNode2:2888:3888
    server.4=DataNode3:2888:3888

     

  4. 通過scp 將安裝包複製到其他機器
  5. 在每一個機器上的對應位置創建 dataDir和dataLogDir目錄,並將zoo.cfg文件中 server. 後面對應的數字寫入 dataDir下的myid文件。如 節點NameNode2就要這行一下命令
    echo 1 > /home/hadoop/data/zookeeper/myid
    #因爲zoo.cfg文件中 NameNode2前面的數字是1 所以寫入1即可
    #如果DataNode3的話就需要寫4

     注:一定要創建這兩個目錄 否則報錯【ERROR [main:QuorumPeerMain@86] - Invalid config, exiting abnormally

  6. 使用Zookeeper要注意各節點的時間一致性問題,需要做時間同步,這裏暫且同步一次。最好參考這篇CentOS7 中使用NTP進行時間同步
    # sudo yum install ntpdate #如果沒有安裝ntpdate的話,需要先安裝
    
    sudo ntpdate time.nist.gov
  7. 啓動服務
    bin/zkServer.sh start
    

      

  8. 查看狀態 (注意:/etc/hosts中必須要有 127.0.0.1 與 localhost的映射,否則zk之間無法連接
    bin/zkServer.sh status

     


 

第6步 Hadoop安裝、配置

在/opt下面創建一個文件夾 software並更改用戶組

cd /opt
sudo mkdir software
sudo chown -R hadoop:hadoop software

  然後所有大數據相關程序都放到這個文件夾中

  1. 在~/.bashrc 中定義 SOFTWARE_HOME
    export SOFTWARE_HOME=/opt/software
    

      

  2. cd到Hadoop安裝目錄的配置目錄 /etc/hadoop 編輯hadoop-env.sh,定義HADOOP_HOME,HADOOP_PID_DIR,HADOOP_LOG_DIR
    export HADOOP_HOME=/opt/hadoop/hadoop-2.5.0-cdh5.3.6
    export HADOOP_PID_DIR=$SOFTWARE_HOME/data/hadoop/pid
    export HADOOP_LOG_DIR=$SOFTWARE_HOME/logs/hadoop
    

      

  3. 編輯yarn-env.sh 定義YARN_PID_DIR,YARN_LOG_DIR
    export YARN_LOG_DIR=$SOFTWARE_HOME/logs/yarn
    export YARN_PID_DIR=$SOFTWARE_HOME/data/yarn
    

      

  4. 編輯 mapred-env.sh,定義PID和Log目錄
    export HADOOP_MAPRED_LOG_DIR=$SOFTWARE_HOME/logs/mapred
    export HADOOP_MAPRED_PID_DIR=$SOFTWARE_HOME/data/mapred
    

      

  5. 編輯core-site.xml  這裏 命名空間的邏輯名稱使用 sardoop
    <configuration>
        <property>
            <name>fs.defaultFS</name>
            <value>hdfs://sardoop</value>
        </property>
    
        <property>
            <name>hadoop.http.staticuser.user</name>
            <value>hadoop</value>
        </property>
        <property>
            <name>hadoop.proxyuser.hadoop.hosts</name>
            <value>*</value>
        </property>
        <property>
            <name>hadoop.proxyuser.hadoop.users</name>
            <value>hadoop</value>
        </property> 
        <property>
            <name>fs.trash.interval</name>
            <value>4230</value>
        </property>
        <property>
            <name>io.file.buffer.size</name>
            <value>65536</value>
        </property>
    
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/opt/software/hadoop-2.5.0-cdh5.3.6/tmp</value>
        </property>
    
        <property>
              <name>ha.zookeeper.quorum</name>
              <value>NameNode1,NameNode2,DataNode1,DataNode2,DataNode3</value>
        </property>
    
    </configuration>

     

     

  6. 編輯hdfs-site.xml。這裏對NameNode使用HA,NameNode ID使用 nn1,nn2 分別對應 NameNode1,NameNode2,使用三個DataNode做JournalNode。
    <configuration>
        <property>
            <name>dfs.replication</name>
            <value>2</value>
        </property>
        <property>
            <name>dfs.nameservices</name>
            <value>sardoop</value>
        </property>
        <property>
            <name>dfs.ha.namenodes.sardoop</name>
            <value>nn1,nn2</value>
        </property>
        <property>
            <name>dfs.namenode.rpc-address.sardoop.nn1</name>
            <value>NameNode1:9820</value>
        </property>
        <property>
            <name>dfs.namenode.rpc-address.sardoop.nn2</name>
            <value>NameNode2:9820</value>
        </property>
        <property>
            <name>dfs.namenode.http-address.sardoop.nn1</name>
            <value>NameNode1:9870</value>
        </property>
        <property>
            <name>dfs.namenode.http-address.sardoop.nn2</name>
            <value>NameNode2:9870</value>
        </property>
        <property>
            <name>dfs.namenode.shared.edits.dir</name>
            <value>
            qjournal://DataNode1:8485;DataNode2:8485;DataNode3:8485/sardoop</value>
        </property>
        <property>
            <name>dfs.client.failover.proxy.provider.sardoop</name>
            <value>
            org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
        <property>
            <name>dfs.ha.fencing.methods</name>
            <value>sshfence</value>
        </property>
        <property>
            <name>dfs.ha.fencing.ssh.private-key-files</name>        
            <value>/home/hadoop/.ssh/id_rsa</value>        
        </property>
        <property>        
            <name>dfs.journalnode.edits.dir</name>        
            <value>/opt/software/hadoop-2.5.0-cdh5.3.6/tmp/journal</value>        
        </property>
        <property>
            <name>dfs.ha.automatic-failover.enabled</name>
            <value>true</value>
        </property>
        <property>
            <name>dfs.datanode.max.transfer.threads</name>
            <value>4096</value>
        </property>

    <!--這裏必須要加上前綴 file:// 否則會出現警告 should be specified as a URI in configuration files.並無法啓動DataNode--> <property> <name>dfs.namenode.name.dir</name> <value>file:///opt/hdfsdata/namenode,file:///home/hadoop/data/hdfs/namenode</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///opt/hdfsdata/datanode,file:///home/hadoop/data/hdfs/datanode</value> </property> </configuration>

     

  7. 編輯slaves文件
    DataNode1
    DataNode2
    DataNode3

     

  8. 接下來就是啓動及初始化JournalNode、NameNode、DataNode,可對應這篇文章 Hadoop HA.
  9. 配置yarn-site.xml,使用HA
    <configuration>
      <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
      </property>
      <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
      </property>
      <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>NameNode1</value>
      </property>
      <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>NameNode2</value>
      </property>
      <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
      </property>
      <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yarnha</value>
      </property>
      <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
      </property>
      <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>NameNode1,NameNode2,DataNode1,DataNode2,DataNode3</value>
      </property>
      
      <property>
        <name>yarn.web-proxy.address</name>
        <value>NameNode2:9180</value>
      </property>
      <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
      </property>
      <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
      </property>
      <property>
        <name>yarn.nodemanager.vmem-pmem-ratio</name>
        <value>4</value>
      </property>
    
    </configuration>

     

  10. 配置mapred-site.xml
    <configuration>
    
            <property>
                    <name>mapreduce.framework.name</name>
                    <value>yarn</value>
            </property>
            <property>
                    <name>mapreduce.jobhistory.address</name>
                    <value>NameNode1:10020</value>
            </property>
            <property>
                    <name>mapreduce.jobhistory.webapp.address</name>
                    <value>NameNode1:19888</value>
            </property>
    </configuration>

     

  11. 退出Hadoop安全模式
    bin/hdfs dfsadmin -safemode leave

     檢查HDFS

  12.  

    bin/hdfs fsck / -files -blocks

     

    
    

 

第七步:HBase安裝部署

  1. 安裝並進入安裝目錄
  2. 編輯 conf/backup-masters
    NameNode2

     

  3. 編輯 conf/hbase-env.sh
    #主要修改這三項
    export HBASE_PID_DIR=${HOME}/data/hbase
    export HBASE_MANAGES_ZK=false
    export HBASE_LOG_DIR=${HOME}/logs/hbase

     

  4. 編輯 conf/hbase-site.xml
    <configuration>
        <property>
            <name>hbase.cluster.distributed</name>
            <value>true</value>
        </property>
        <property>
            <name>hbase.rootdir</name>
            <!--這裏應該是要使用nameservice的,但是用了之後IP解析不正確,只能暫時換成HostName;還要注意一點 這裏的必須使用當前處於Active的NameNode-->
            <!--HBase如果要做HA,這裏以後必須要改成Nameservice,否則NameNode發生變化的時候還要手動修改Hbase配置-->
            <value>hdfs://NameNode1:9820/hbase</value>
            <!--<value>hdfs://sardoop/hbase</value>-->
        </property>
        <property>
            <name>hbase.zookeeper.quorum</name>
            <value>NameNode1,NameNode2,DataNode1,DataNode2,DataNode3</value>
        </property>
        <property>
            <name>hbase.zookeeper.property.dataDir</name>
            <value>/home/hadoop/data/zookeeper</value>
        </property>
    </configuration>

     

  5. 編輯 conf/regionservers
    NameNode2
    DataNode1
    DataNode2
    DataNode3

注意:有時候啓動HBase的時候會出現【org.apache.Hadoop.hbase.TableExistsException: hbase:namespace

或者什麼【Znode already exists】相關的問題,一般都是因爲之前的HBase信息已經在Zookeeper目錄下已經存在引起的。

解決方法: 

  1. 登錄到zookeeper節點的機器上
  2. cd ${ZOOKEEPER_HOME}/bin
  3. bin/zkCli.sh
  4. ls /  可以查看到zookeeper上已有hbase目錄
  5. rmr /hbase  #刪除該目錄
  6. 最後重新啓動hbase即可

 

有時候用java調用hbase時,會發生訪問hbase時雖然沒有報錯,但是一直沒有響應。

解決方式:

在程序調用的機器中的hosts文件,添加hbase所在節點的hosts信息 

 

 


 

第八步:Sqoop安裝部署(Sqoop1)

通過sqoop我們可以實現RDMS與hadoop生態產品 如hdfs、hive、hbase(單向)的數據導入導出。

在導入的過程中 我們可以指定mapper的數量,甚至是壓縮的方式。目前有sqoop1和sqoop2兩個大版本,且差異較大。Sqoop1與Sqoop2的相關功能支持程度 

 

  1. 下載,解壓,cd到安裝目錄
  2. 將 conf/sqoop-env-template.sh 重命名爲 conf/sqoop-env.sh
  3. 編輯 conf/sqoop-env.sh
    #Set path to where bin/hadoop is available
    export HADOOP_COMMON_HOME=/opt/software/hadoop-2.5.0-cdh5.3.6
    
    #Set path to where hadoop-*-core.jar is available
    export HADOOP_MAPRED_HOME=/opt/software/hadoop-2.5.0-cdh5.3.6
    
    #set the path to where bin/hbase is available
    export HBASE_HOME=/opt/software/hbase-0.98.6-cdh5.3.6
    
    #Set the path to where bin/hive is available
    export HIVE_HOME=/opt/software/hive-0.13.1-cdh5.3.6
    
    #Set the path for where zookeper config dir is  (如果有獨立的ZooKeeper集羣,才需要配置這個)
    export ZOOCFGDIR=/opt/software/zookeeper-3.4.5-cdh5.3.6/

     

  4. 編輯 bin/configure-sqoop,註釋掉HCAT_HOME、ACCUMULO_HOME(如果沒有用到這些Hadoop組件的話),差不多在文件的中間位置,130行左右 
     

     

  5. 把mysql jdbc和sqlserver jdbc都放到 lib 下,同時拷貝到所有虛擬機的hadoop安裝目錄 $HADOOP_HOME/share/hadoop/common/lib。可使用下面的腳本
    cp mysql-connector-java-5.1.40-bin.jar /opt/software/sqoop-1.4.5-cdh5.3.6/lib/
    
    --複製到所有虛擬機的Hadoop目錄
    cp mysql-connector-java-5.1.40-bin.jar /opt/software/hadoop-2.5.0-cdh5.3.6/share/hadoop/common/lib/
    scp mysql-connector-java-5.1.40-bin.jar hadoop@NameNode2:/opt/software/hadoop-2.5.0-cdh5.3.6/share/hadoop/common/lib/
    scp mysql-connector-java-5.1.40-bin.jar hadoop@DataNode1:/opt/software/hadoop-2.5.0-cdh5.3.6/share/hadoop/common/lib/
    scp mysql-connector-java-5.1.40-bin.jar hadoop@DataNode2:/opt/software/hadoop-2.5.0-cdh5.3.6/share/hadoop/common/lib/
    scp mysql-connector-java-5.1.40-bin.jar hadoop@DataNode3:/opt/software/hadoop-2.5.0-cdh5.3.6/share/hadoop/common/lib/
    
    cp sqljdbc4.jar /opt/software/sqoop-1.4.5-cdh5.3.6/lib/
    cp sqljdbc4.jar /opt/software/hadoop-2.5.0-cdh5.3.6/share/hadoop/common/lib/
    scp sqljdbc4.jar hadoop@NameNode2:/opt/software/hadoop-2.5.0-cdh5.3.6/share/hadoop/common/lib/
    scp sqljdbc4.jar hadoop@DataNode1:/opt/software/hadoop-2.5.0-cdh5.3.6/share/hadoop/common/lib/
    scp sqljdbc4.jar hadoop@DataNode2:/opt/software/hadoop-2.5.0-cdh5.3.6/share/hadoop/common/lib/
    scp sqljdbc4.jar hadoop@DataNode3:/opt/software/hadoop-2.5.0-cdh5.3.6/share/hadoop/common/lib/
    jdbc copy

     

  6. 檢測安裝狀況,如下圖所示,則安裝配置都沒問題了
    bin/sqoop help

     

     

  7. 使用   注:MSSqlServer與MySql的區別只在於連接信息上
    ** 查看sqlserver數據庫列表
    bin/sqoop list-databases --connect 'jdbc:sqlserver://192.168.0.154:1433;username=sa;password=123'

    ** 查看數據庫表
    bin/sqoop list-tables --connect 'jdbc:mysql://192.168.0.154:3306/Test' --username sa --password 123

    ** 直接導表數據到HBase
    bin/sqoop import --connect 'jdbc:sqlserver://192.168.0.154:1433;username=sa;password=123;database=Test' --table Cities --split-by Id
      --hbase-table sqoop_Cities --column-family c --hbase-create-table --hbase-row-key Id

    **用sql語句導入(如果使用了query的形式,則必須要在sql後面加上 $CONDITIONS)
    bin/sqoop import --connect 'jdbc:sqlserver://192.168.0.154:1433;username=sa;password=123;database=Test'\
      --query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE id>10 AND $CONDITIONS' -m 1\
      --split-by Id --hbase-table sqoop_Cities --column-family c --hbase-create-table --hbase-row-key Id

    ** 導入HDFS(因爲這是通過Mapper處理的,所有這個目標路徑必須不存在)
    ./sqoop import --connect 'jdbc:sqlserver://192.168.0.154:1433;username=sa;password=123;database=Test' --table Cities --target-dir /input/Cities

    ** 從hdfs到處到mysql
    bin/sqoop export --connect jdbc:mysql://NameNode1:3306/test --username root --password 123
      --table loghour --m 2 --export-dir /tmp/loghour/ --input-fields-terminated-by '\t'

     

注:

  • sqoop2 不支持從sqlserver導入數據,且sqoop1與sqoop2在配置和使用上有很大區別
  • Sqoop1是無法從hbase/hive導出到mysql的,實現方式也都是通過hive將數據輸出到文件 然後再用sqoop導出到mysql
  • Sqoop2從1.99.6開始通過KiteConnector的方式在一定程度上支持了HBase的讀寫-->文章傳送門
  • Sqoop2 搭建及使用

 


 

第九步:Hive安裝部署

  1. 安裝MySql
  2. 在mysql命令行設置hive對應的數據庫,用戶及密碼  hive,123,並設置權限;
    create database hive;
    grant all on hive*.* to hive@'%'  identified by 'hive';
    flush privileges;

     

  3. cd到hive安裝目錄
    #爲了操作方便,可以選擇創建軟鏈接(非必須)
    ln -s hive-0.13.1-cdh5.3.6 hive

     

  4. 將conf下面的模板文件改名成正式文件
    hive-default.xml.template --> hive-site.xml
    hive-log4j.properties.template --> hive-log4j.properties
    hive-exec-log4j.properties.template --> hive-exec-log4j.properties
    hive-env.sh.template --> hive-env.sh

     

  5. 修改 conf/hive-env.sh,主要是設置 HADOOP_HOME
    # Set HADOOP_HOME to point to a specific hadoop install directory
    HADOOP_HOME=/opt/software/hadoop-2.5.0-cdh5.3.6/
    
    # Hive Configuration Directory can be controlled by:
    export HIVE_CONF_DIR=/opt/software/hive-0.13.1-cdh5.3.6/conf/
    
    # Folder containing extra ibraries required for hive compilation/execution can be controlled by:
    export HIVE_AUX_JARS_PATH=/opt/software/hive-0.13.1-cdh5.3.6/lib/

     

  6. 修改 conf/hive-site.xml。這個版本的文件有一個錯誤的地方,在2784行少了一個起始標籤 <property>。下面修改的配置是設定了元數據的存儲方式,如果不做修改的話就會使用自帶的derby作爲數據庫
    <property>
      <name>javax.jdo.option.ConnectionURL</name>
      <value>jdbc:mysql://NameNode1:3306/hive?createDatabaseIfNotExist=true</value>
      <description>JDBC connect string for a JDBC metastore</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>hive</value>
      <description>username to use against metastore database</description>
    </property>
    <property>
      <name>javax.jdo.option.ConnectionPassword</name>
      <value>123</value>
      <description>password to use against metastore database</description>
    </property>
    <!--用於遠程連接-->
    <property>
      <name>hive.metastore.uris</name>
      <value>thrift://127.0.0.1:9083</value>
    </property>
    <!--這個參數用於啓動hiveserver2,默認值存在bug 後續版本已修復-->
    <property>
       <name>hive.server2.long.polling.timeout</name>
       <value>5000ms</value>
       <description>Time in milliseconds that HiveServer2 will wait, before responding to asynchronous calls that use long polling</description>
    </property>
    <!--hive需要用到的包--> <property>   <name>hive.aux.jars.path</name>   <value>file:///opt/software/hive/lib/hive-hbase-handler-0.13.1-cdh5.3.6.jar,file:///opt/software/hive/lib/zookeeper-3.4.5-cdh5.3.6.jar,file:///opt/software/hive/lib/hbase-client-0.98.6-cdh5.3.6.jar</value> </property>

     

     

  7. 在hdfs上面,創建目錄
    $HADOOP_HOME/bin/hadoop fs -mkdir /tmp
    $HADOOP_HOME/bin/hadoop fs -mkdir /user/hive/warehouse
    $HADOOP_HOME/bin/hadoop fs -chmod g+w /tmp
    $HADOOP_HOME/bin/hadoop fs -chmod g+w /user/hive/warehouse

     

  8. 啓動metastore服務
    bin/hive --service metastore &  #後面的&是用來讓hive服務在後臺運行,沒有&的話 關掉服務所在的ssh連接時,服務也會stop
    #啓動成功後,敲任意鍵回到shell命令輸入模式,然後輸入exit退出即可(通過命令而不是直接關閉客戶端)

    # bin/hive --service hiveserver & #這個命令啓動的服務用於java的api調用。如果沒有這個需求則不需要執行該命令

     

  9. 啓動成功後,會多一個RunJar進程,現在就可以使用Hive Cli了
  10. 如果想啓用遠程模式的話需要啓動hive metastore服務。有個前提條件是 jps顯示的進程中不能有RunJar,有的話Kill掉。否則會出現【Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083

其他:

①hive命令的調用有3種方式:

  1. 多語句執行
    ./hive –f  ./hive-script.sql

     

  2. 單行語句
    ./hive -e  'select * from table'

     

  3. 交互模式  執行./hive 即可

②UDF的創建

  1. 首先要自定義UDF類
    package com.sarnath.jobtask.hive.udf;
    
    import org.apache.hadoop.hive.ql.exec.Description;
    import org.apache.hadoop.hive.ql.exec.UDF;;
    
    /**
     * 將時間字符串轉換成所在的5分鐘區間
     *
     * @author Zhanglei 2016年12月2日
     */
    @Description(name = "get5minTimeZone", value = "FUNC<time> - cast string to 5min timezone?")
    public class get5minTimeZone extends UDF {    
        public long evaluate(long time) {
            long minTotal = time/60;//總分鐘數
            long timeValue = minTotal*60;// 時間值
            /*
             * 精確到秒的時間  + 5秒 - 秒位數值與5的餘數
             */
            return timeValue + 5 * 60 - timeValue % (5 * 60);
        }
    }

     

  2. 將項目打包並放到HDFS上某路徑下 如 /user/hadoop/hiveUDF/udftest.jar
  3. 在hive中執行創建命令
    #如果已存在 要先刪除
    #drop function get5minTimeZone;
    
    create function get5minTimeZone as 'com.sarnath.jobtask.hive.udf.logTimeConvert' using jar 'hdfs:///user/hadoop/hiveUDF/jobtask.jar';

     

 ③相關command

  • 創建表 後面的棕色文字是指定從文件load數據的時候的字段間的分隔符
    create table logdetail(proxyip string,origin string)  row format delimited fields terminated by ';';

     

  • 分區  hive的分區可對大量數據的操作提升很大效率,一個分區就是一個文件夾
    • 創建分區
      create table logdetail(proxyip string ,origin string) partitioned by(logdate string);
    • 展示表的所有分區
      show partitions tablename;
  • 從文件load數據到hive.如果不加 local 則是hdfs上的文件
    load data [local] inpath '/opt/software/log/log2016_12_15.log' overwrite into table logdetail;

     

  • 創建hive與hbase的關聯表(STORED BY前面的是hive中的表結構;mapping=後面的字符串表示hbase中對應的字段;:key表示rowkey;hbaseloghour是hbase的表名)
    CREATE TABLE log(time string,total int) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
      WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,f:total") TBLPROPERTIES ("hbase.table.name" = "hbaseloghour");

     

  

參考:

beeline 連接的問題

 


 

其他

  1. Oozie-4.0.0-cdh5.3.6搭建


 

附:

① 批處理執行腳本(當前節點爲NameNode1)

重新格式化時,需要刪除數據的腳本

echo --remove hdfs data
rm -rf /opt/hdfsdata/datanode/*
rm -rf /opt/hdfsdata/namenode/*
rm -rf /home/hadoop/data/hdfs/namenode/*
rm -rf /home/hadoop/data/hdfs/datanode/*

ssh NameNode2 'rm -rf /opt/hdfsdata/datanode/*'
ssh NameNode2 'rm -rf /opt/hdfsdata/namenode/*'
ssh NameNode2 'rm -rf /home/hadoop/data/hdfs/namenode/*'
ssh NameNode2 'rm -rf /home/hadoop/data/hdfs/datanode/*'

ssh DataNode1 'rm -rf /opt/hdfsdata/datanode/*'
ssh DataNode1 'rm -rf /opt/hdfsdata/namenode/*'
ssh DataNode1 'rm -rf /home/hadoop/data/hdfs/namenode/*'
ssh DataNode1 'rm -rf /home/hadoop/data/hdfs/datanode/*'

ssh DataNode2 'rm -rf /opt/hdfsdata/datanode/*'
ssh DataNode2 'rm -rf /opt/hdfsdata/namenode/*'
ssh DataNode2 'rm -rf /home/hadoop/data/hdfs/namenode/*'
ssh DataNode2 'rm -rf /home/hadoop/data/hdfs/datanode/*'

ssh DataNode3 'rm -rf /opt/hdfsdata/datanode/*'
ssh DataNode3 'rm -rf /opt/hdfsdata/namenode/*'
ssh DataNode3 'rm -rf /home/hadoop/data/hdfs/namenode/*'
ssh DataNode3 'rm -rf /home/hadoop/data/hdfs/datanode/*'

echo --remove zookeeper data
rm -rf ~/data/zookeeper/version-2/*
rm -rf ~/data/zookeeper/zookeeper_server.pid
ssh NameNode2 'rm -rf ~/data/zookeeper/version-2/*'
ssh NameNode2 'rm -rf ~/data/zookeeper/zookeeper_server.pid'
ssh DataNode1 'rm -rf ~/data/zookeeper/version-2/*'
ssh DataNode1 'rm -rf ~/data/zookeeper/zookeeper_server.pid'
ssh DataNode2 'rm -rf ~/data/zookeeper/version-2/*'
ssh DataNode2 'rm -rf ~/data/zookeeper/zookeeper_server.pid'
ssh DataNode3 'rm -rf ~/data/zookeeper/version-2/*'
ssh DataNode3 'rm -rf ~/data/zookeeper/zookeeper_server.pid'


echo --remove hadoop logs
rm -rf /opt/software/hadoop-2.5.0-cdh5.3.6/tmp
rm -rf /home/hadoop/logs/hadoop
ssh NameNode2 'rm -rf /opt/software/hadoop-2.5.0-cdh5.3.6/tmp'
ssh NameNode2 'rm -rf /home/hadoop/logs/hadoop'
ssh DataNode1 'rm -rf /opt/software/hadoop-2.5.0-cdh5.3.6/tmp'
ssh DataNode1 'rm -rf /home/hadoop/logs/hadoop'
ssh DataNode2 'rm -rf /opt/software/hadoop-2.5.0-cdh5.3.6/tmp'
ssh DataNode2 'rm -rf /home/hadoop/logs/hadoop'
ssh DataNode3 'rm -rf /opt/software/hadoop-2.5.0-cdh5.3.6/tmp'
ssh DataNode3 'rm -rf /home/hadoop/logs/hadoop'

echo --remove hbase logs
rm -rf ~/logs/hbase/*
ssh NameNode2 'rm -rf ~/logs/hbase/*'
ssh DataNode1 'rm -rf ~/logs/hbase/*'
ssh DataNode2 'rm -rf ~/logs/hbase/*'
ssh DataNode3 'rm -rf ~/logs/hbase/*'
View Code

 

啓動過程的腳本

echo --start zookeeper
/opt/software/zookeeper-3.4.5-cdh5.3.6/bin/zkServer.sh start
ssh NameNode2 '/opt/software/zookeeper-3.4.5-cdh5.3.6/bin/zkServer.sh start'
ssh DataNode1 '/opt/software/zookeeper-3.4.5-cdh5.3.6/bin/zkServer.sh start'
ssh DataNode2 '/opt/software/zookeeper-3.4.5-cdh5.3.6/bin/zkServer.sh start'
ssh DataNode3 '/opt/software/zookeeper-3.4.5-cdh5.3.6/bin/zkServer.sh start'

echo --start journalnodes cluster
ssh DataNode1 '/opt/software/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start journalnode'
ssh DataNode2 '/opt/software/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start journalnode'
ssh DataNode3 '/opt/software/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start journalnode'

echo --format one namenode
/opt/software/hadoop-2.5.0-cdh5.3.6/bin/hdfs namenode -format
/opt/software/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start namenode

echo --format another namenode
ssh NameNode2 '/opt/software/hadoop-2.5.0-cdh5.3.6/bin/hdfs namenode -bootstrapStandby'
sleep 10
ssh NameNode2 '/opt/software/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemon.sh start namenode'
sleep 10

#echo --start all datanodes
/opt/software/hadoop-2.5.0-cdh5.3.6/sbin/hadoop-daemons.sh start datanode

echo --zookeeper init
/opt/software/hadoop-2.5.0-cdh5.3.6/bin/hdfs zkfc -formatZK

echo --start hdfs
/opt/software/hadoop-2.5.0-cdh5.3.6/sbin/start-dfs.sh

echo --start yarn
/opt/software/hadoop-2.5.0-cdh5.3.6/sbin/start-yarn.sh
ssh NameNode2 '/opt/software/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh start resourcemanager'
/opt/software/hadoop-2.5.0-cdh5.3.6/sbin/mr-jobhistory-daemon.sh  start historyserver
/opt/software/hadoop-2.5.0-cdh5.3.6/sbin/yarn-daemon.sh start proxyserver
View Code

 

關於CentOS7minimal下MySql的安裝

③用MapReduce操作HBase

默認情況下,在MapReduce中操作HBase的時候 會出現各種  java.lang.NoClassDefFoundError 問題,這是因爲沒有提供相關jar包。解決方法:

  1. 把$HBASE_HOME/lib 裏的所有jar包都拷貝到 $HADOOP_HOME/share/common/lib 下面
  2. 把$HBASE_HOME/conf/hbase-site.xml 拷貝到 $HADOOP_HOME/conf 下面
  3. 所有節點都執行以上操作(不需要重啓hadoop)

HBase官網文檔中的路徑是錯誤的,把jar包放到lib下面是沒有用的

④hdfs相關命令

//刷新節點
$HADOOP_HOME/bin/hadoop dfsadmin -refreshNodes

//查看目錄大小
hadoop dfs -count -q <dir>

//查看目錄下子目錄大小
hadoop dfs -du <dir>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章