1. 程式人生 > 其它 >Hadoop+Hive

Hadoop+Hive

前言:

在按照自己之前的文件搭建Hadoop和hive時遇到不少的問題,特此記錄。

參考部落格:

Flink1.10叢集環境搭建 - 萘汝 - 部落格園 (cnblogs.com)

CentOS7下構建SQL引擎 - 萘汝 - 部落格園 (cnblogs.com)

CentOS7下搭建Hadoop分散式叢集

Hadooop叢集規劃

伺服器IP hadoop01 hadoop02 hadoop03
HDFS NameNode
HDFS SecondaryNameNode
HDFS DataNode DataNode DataNode
YARN NodeManager NodeManager NodeManager
YARN ResourceManager

前置工作

配置ssh

輸入systemctl restart sshd.service 啟動ssh服務;

設定開機自動啟動ssh服務systemctl enable sshd.service

配置hosts

vi /etc/hosts開啟檔案,在最後一行加入:IP地址 主機名

ip hadoop01
ip hadoop02
ip hadoop03

關閉防火牆

systemctl status firewalld		檢視防火牆狀態
systemctl stop firewalld		關閉防火牆
systemctl disable firewalld		永久關閉防火牆。

關閉SELINUX

vi /etc/selinux/config編輯檔案,將SELINUX=enfocing修改為disabled.

配置ssh免密登陸

輸入命令 ssh-keygen -t rsa ,按三次確認鍵,生成公鑰和私鑰。

cd /root/.ssh/可看到生成的公鑰id_rsa.pub和私鑰檔案id_rsa。hadoop02、hadoop03同樣操作。

在Hadoop02、Hadoop03上輸入cat /root/.ssh/id_rsa.pub檢視公鑰內容,複製備用。

  • 在hadoop01上

    .ssh目錄下執行 touch authorized_keys建立存放祕鑰的檔案;

    cp id_rsa.pub authorized_keys

    將公鑰放進authorized_keys檔案,可無密登入本機;

    chmod 644 authorized_keys 修改 authorized_keys 許可權;

    sudo service sshd restart 重啟ssh服務;

    ssh hadoop01 命令測試本機免密登入,第一次需要輸入 yes ,下次就不用再輸入了。

    echo '公鑰' >> authorized_keys 將前面複製的Hadoop02、Hadoop03公鑰內容寫入authorized_keys中;

    scp /root/.ssh/authorized_keys hadoop02:/root/.ssh

    scp /root/.ssh/authorized_keys hadoop03:/root/.ssh

  • 在hadoop02、hadoop03上

    在.ssh目錄下,chmod 644 authorized_keys修改 authorized_keys 許可權。

許可權配置完成後,回到hadoop01,輸入ssh hadoop02連線 hadoop02,exit退出連線;ssh hadoop03連線 hadoop03,exit退出連線;至此, root使用者下三臺虛擬機器互相免密登入配置完成。

安裝jdk

將下載的jdk-8u301-linux-x64.tar.gz傳輸到/usr/loacl目錄下。

在/usr/local目錄下解壓:tar zxvf jdk-8u301-linux-x64.tar.gz

vi /etc/profile配置環境變數:

export JAVA_HOME=/usr/local/jdk1.8.0_301
export CALSSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH

source /etc/profile重新整理設定。使用 javajavacjava -version 驗證是否安裝成功。

scp -r /usr/local/jdk1.8.0_301 root@hadoop02:/usr/local/

scp -r /usr/local/jdk1.8.0_301 root@hadoop03:/usr/local/

scp /etc/profile root@hadoop02:/etc/profile

scp /etc/profile root@hadoop03:/etc/profile

hadoop02、hadoop03重新整理配置:source /etc/profile,輸入java -version驗證。

叢集搭建

將下載的hadoop-3.1.4.tar.gz傳輸到/usr/loacl目錄下。

解壓:tar zxvf hadoop-3.1.4.tar.gz

重新命名:mv /usr/local/hadoop-3.1.4 /usr/local/hadoop

修改5個配置檔案

vi /usr/local/hadoop/etc/hadoop/hadoop-env.sh

export JAVA_HOME=/usr/local/jdk1.8.0_301

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

<!--指定HADOOP所使用的檔案系統schema(URI),HDFS的老大(NameNode)的地址-->
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoop01:9000</value>
</property>
<!--指定HADOOP執行時產生檔案的儲存目錄-->
<property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/hadoop/data</value>
</property>

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

<property>
	<name>dfs.namenode.http-address</name>
	<value>hadoop01:9870</value>
</property>
<property>
	<name>dfs.namenode.secondary.http-address</name>
	<value>hadoop03:9868</value>
</property>

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

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

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

<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>hadoop02</value>
</property>
<property>
    <name>yarn.nodemanager.env-whitelist</name>
    <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>		
</property>
<!-- 設定虛擬記憶體更大些,預設2.1,即實體記憶體1G,虛擬記憶體2.1G -->
<property>
    <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>2.1</value>
</property>

環境變數和workers

  • 配置workers

    vi /usr/local/hadoop/etc/hadoop/workers

    hadoop01
    hadoop02
    hadoop03
    
  • 配置環境變數

    vi /etc/profile

    export HADOOP_HOME=/usr/local/hadoop
    export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
    

scp -r /usr/local/hadoop root@hadoop02:/usr/local/

scp -r /usr/local/hadoop root@hadoop03:/usr/local/

scp /etc/profile root@hadoop02:/etc/profile

scp /etc/profile root@hadoop03:/etc/profile

source /etc/profile使配置環境變數生效

驗證:hadoop version

配置hosts

Windows下修改hosts檔案,以管理員身份執行Windows PowerShell

輸入notepad,開啟記事本,在記事本中開啟hosts

新增:

ip hadoop01
ip hadoop02
ip hadoop03

啟動叢集

在root模式下啟動hadoop,需要在hadoop的sbin目錄下修改幾個配置檔案:

vi start-dfs.sh		vi stop-dfs.sh
新增:
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

vi start-yarn.sh	vi stop-yarn.sh
新增:
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

首次啟動需要格式化磁碟。在/usr/local/hadoop目錄下,輸入hdfs namenode -format

格式化完成後,start-all.sh啟動。使用jps檢視程序:

#jps #顯示以下幾個程序說明啟動成功
95273 DataNode #可有可無
95465 SecondaryNameNode #重要
95144 NameNode #重要
95900 NodeManager #可有可無
95775 ResourceManager #非常重要

前端檢視:在windows下開啟網頁:hadoop01:9870 hadoop02:8088

至此,Hadoop分散式叢集搭建完成。

Hive安裝

資料倉庫(元資料儲存在mysql中,元資料包括表名、表的屬性等,實際資料儲存於 HDFS 中)

輸入 start-all.sh,啟動Hadoop叢集。由於Hadoop的版本是3.1.4,所以這裡hive選擇3.1.2版本。

安裝mysql

將下載的mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz傳輸到/usr/loacl目錄下。

解壓:tar zxvf mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz

重新命名:mv mysql-5.7.35-linux-glibc2.12-x86_64 mysql

mkdir /usr/local/mysql/data		//新建data目錄
groupadd mysql					//建立使用者組
useradd -g mysql mysql			//使用者和密碼
chown -R mysql.mysql /usr/local/mysql		//許可權
cd /usr/local/mysql/bin		//切換到bin目錄
./mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/ --initialize		//初始化,將臨時密碼儲存下來

vi /etc/my.cnf,新增以下內容:

[mysqld]
# 設定3306埠
port=3306
# 設定mysql的安裝目錄
basedir=/usr/local/mysql/
# 設定mysql資料庫的資料的存放目錄
datadir=/usr/local/mysql/data
# 允許最大連線數
max_connections=10000
# 允許連線失敗的次數。這是為了防止有人從該主機試圖攻擊資料庫系統
max_connect_errors=10
# 服務端使用的字符集預設為UTF8
character-set-server=utf8
# 建立新表時將使用的預設儲存引擎
default-storage-engine=INNODB
# 預設使用“mysql_native_password”外掛認證
default_authentication_plugin=mysql_native_password
[mysql]
# 設定mysql客戶端預設字符集
default-character-set=utf8
[client]
# 設定mysql客戶端連線服務端時預設使用的埠
port=3306
default-character-set=utf8

新增mysqld服務到系統

cp -a /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
chmod +x /etc/init.d/mysql
chkconfig --add mysql

啟動mysql

service mysql start
service mysql status	#檢視啟動狀態
service mysql stop		#關閉mysql
service mysql restart	#重啟mysql

#將mysql命令新增到服務
ln -s /usr/local/mysql/bin/mysql /usr/bin
#使用臨時密碼登入mysql
mysql -uroot -p	

#修改密碼
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';		
flush privileges;

修改遠端連線並生效

use mysql;
update user set host='%' where user='root';
flush privileges;
select user,host from user;

#可將其他user都刪掉
delete from user where host='localhost';

至此,安裝完成。

安裝hive

將下載的apache-hive-3.1.2-bin.tar.gz傳輸到/usr/loacl目錄下。

解壓:tar zxvf apache-hive-3.1.2-bin.tar.gz

重新命名:mv apache-hive-3.1.2-bin.tar.gz hive

hive只需安裝在hadoop01上即可。

/etc/profile配置環境變數

export HIVE_HOME=/usr/local/hive
export HIVE_CONF_DIR=${HIVE_HOME}/conf
export PATH=$PATH:$HIVE_HOME/bin
export CLASSPATH=.:${HIVE_HOME}/lib:$CLASSPATH

source /etc/profile更新配置,輸入hive --version檢視hive版本

配置Hive

確保已啟動hadoop。

$HADOOP_HOME/bin/hadoop fs -mkdir -p /user/hive/warehouse

$HADOOP_HOME/bin/hadoop fs -chmod 777 /user/hive/warehouse

$HADOOP_HOME/bin/hadoop fs -mkdir -p /tmp/hive/

$HADOOP_HOME/bin/hadoop fs -chmod 777 /tmp/hive

讓hadoop新建/user/hive/warehouse目錄與tmp目錄,並賦予許可權。檢視是否建立成功:

$HADOOP_HOME/bin/hadoop fs -ls /user/hive/
$HADOOP_HOME/bin/hadoop fs -ls /tmp/

修改hive-site.xml

cd /usr/local/hive/conf

cp hive-default.xml.template hive-site.xml

vi hive-site.xml(建議在windows在使用Notepad++進行查詢修改,然後替換文件)

  • 將hive-site.xml檔案中的${system:java.io.tmpdir}替換為/usr/local/hive/tmp

%s#${system:java.io.tmpdir}#/usr/local/hive/tmp#g

  • 將${system:user.name}都替換為root

%s#${system:user.name}#root#g

  • 修改hive.metastore.schema.verification,將對應的value修改為false

  • 查詢ConnectionURL、ConnectionDriverName、ConnectionUserName、ConnectionPassword,將其全部註釋掉。

  • 找到第3237行,直接將<description></description>註釋掉

  • 將hive的預設資料庫改為mysql,即在hive-site.xml中新增以下內容:

    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://hadoop01:3306/hive?useSSL=false&amp;createDatabaseIfNotExist=true&amp;characterEncoding=UTF-8</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.jdbc.Driver</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>123456</value>
    </property>
    

hive-site.xml修改完成。

cp hive-env.sh.template hive-env.sh

vi hive-env.sh,新增以下內容

export  HADOOP_HOME=/usr/local/hadoop
export  PATH=$PATH:$HIVE_HOME/bin
export  HIVE_CONF_DIR=/usr/local/hive/conf
export  HIVE_AUX_JARS_PATH=/usr/local/hive/lib

檢視以下兩個目錄中的guava.jar版本是否一致:

/usr/local/hive/lib/
/usr/local/hadoop/share/hadoop/common/lib/

刪除低版本的那個,將高版本的複製到低版本目錄下。

rm /usr/local/hive/lib/guava-19.0.jar

cp /usr/local/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /usr/local/hive/lib/

下載mysql的jdbc驅動包

這裡使用的MySQL版本為5.7,所以使用mysql-connector-java-5.1.47.tar.gz,將其傳輸到/usr/local目錄下,解壓後將mysql-connector-java-5.1.47-bin.jar移動到hive的lib目錄下。

mv mysql-connector-java-5.1.47-bin.jar /usr/local/hive/lib

這裡根據自己資料庫的版本進行適當選擇。若是mysql8.0版本,需要將前面配置的Driver改為:

com.mysql,cj.jdbc.Driver

啟動測試

在mysql資料庫中新建hive資料庫。create datebase hive;

初始化資料庫schematool -dbType mysql -initSchema,生成元資料。

能否成功初始化資料庫是至關重要的一環!!!

啟動hive,./hive

執行show databases;檢視資料庫

執行檢視函式的命令show funtions;

至此,Hive安裝完成。

容易出錯的地方,在root使用者下啟動hadoop需要進行的配置。啟動hive時初始化資料庫失敗。