八、hive3.1.2 安裝及其配置(本地模式和遠端模式)

李好秀發表於2021-11-23

前文

hive3.1.2 安裝及其配置(本地模式和遠端模式)

下載

1、下載hive包

Index of /dist/hive (apache.org)

wget http://archive.apache.org/dist/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz
#可選用清華映象
http://mirror.tuna.tsinghua.edu.cn/apache/hive/hive-3.1.2/apache-hive-3.1.2-bin.tar.gz

2、修改其環境變數

vim /etc/profile
	#增加環境變數
	export HIVE_HOME=/export/servers/apache-hive-3.1.2-src
	export PATH=$PATH:$HIVE_HOME/bin
source /etc/profile

3、MySQL配置

為什麼配置MySQL?

metastore是hive後設資料的集中存放地
metastore預設使用內嵌的derby資料庫作為儲存引擎
Derby引擎的缺點:一次只能開啟一個會話
使用Mysql作為外接儲存引擎,多使用者同時訪問
Hive安裝

內嵌模式:後設資料保持在內嵌的Derby模式,只允許一個會話連線

本地獨立模式:在本地安裝MySQL,把後設資料放到MySQL內

遠端模式:後設資料放置在遠端的Mysql資料庫。

hive只是個工具,包括它的資料分析,依賴於mapreduce,它的資料管理,依賴於外部系統

這一步其實不是必須的,因為Hive預設的metadata(後設資料)是儲存在Derby裡面的,但是有一個弊端就是同一時間只能有一個Hive例項訪問,這適合做開發程式時做本地測試。

Hive提供了增強配置,可將資料庫替換成MySQL等關係型資料庫,將儲存資料獨立出來在多個服務示例之間共享。

由此可見,你在哪路徑下,執行hive指令,就在哪路徑下生成metastore_db。建一套資料庫檔案,這樣是極其不合適的,公司裡每個人若不一樣,則會顯得非常混雜。導致員工之間無法公用交流。

為此,需公用的MySQL。

這也是為什麼,在安裝Hive時,也需要配置MySQL了。

Centos7 MySQL安裝步驟:

1、設定MySQL源

首先,您需要在MySQL提供的系統中啟用MySQL yum儲存庫。 根據您的作業系統版本執行以下命令之一,這裡我們選擇CentOS 7 / RHEL 7的源

###在CentOS 7 / RHEL 7系統上### 
rpm -Uvh https://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm

###在CentOS 7 / RHEL 6系統上### 
rpm -Uvh https://repo.mysql.com/mysql80-community-release-el6-3.noarch.rpm

2、安裝MySQL Community Server

MySQL yum儲存庫包含用於多個MySQL版本的多個儲存庫配置。 因此,首先禁用mysql repo檔案中的所有儲存庫

sed -i 's/enabled=1/enabled=0/' /etc/yum.repos.d/mysql-community.repo

啟用centos mysql8版本

## CentOS & RedHat 版本
yum --enablerepo=mysql80-community install mysql-community-server
## Fedora Systems 版本
dnf --enablerepo=mysql80-community install mysql-community-server

3、啟動MySQL服務

service mysqld start

使用Systemd

systemctl start mysqld.service

4、查詢MySQL root密碼

安裝MySQL 8.0後,將為MySQL根使用者建立一個臨時密碼。 您可以在日誌檔案中找到生成的臨時密碼。密碼檔案位置:/var/log/mysqld.log

grep "A temporary password" /var/log/mysqld.log

5、重置root密碼

首次安裝MySQL後,執行mysql_secure_installation命令以保護MySQL伺服器,包含重置密碼步驟

密碼需要特殊要求,八位,大小寫,特殊符號

mysql_secure_installation
Enter password for user root:

The existing password for the user account root has expired. Please set a new password.

New password:
Re-enter new password:

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y

6、MySQL 服務加入開機啟動項,並啟動mysql程式

### Using Systemd
systemctl enable mysqld.service
systemctl restart mysqld.service

開放3306埠

如果伺服器開啟了防火牆,記得開啟3306埠

systemctl enable iptables
systemctl start iptables
vim /etc/sysconfig/iptables
##規則中加入
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
##重啟防火牆
systemctl enable iptables.service
systemctl start iptables.service

7、登入MySQL

mysql -uroot -p

修改您的密碼不滿足當前的策略要求,可修改成簡單密碼

*# 檢視密碼策略* 
> mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+

MySQL8密碼策略
1)、validate_password_length 固定密碼的總長度;
2)、validate_password_dictionary_file 指定密碼驗證的檔案路徑;
3)、validate_password_mixed_case_count 整個密碼中至少要包含大/小寫字母的總個數;
4)、validate_password_number_count 整個密碼中至少要包含阿拉伯數字的個數;
5)、validate_password_policy 指定密碼的強度驗證等級,預設為 MEDIUM;
取值:
0/LOW:只驗證長度;
1/MEDIUM:驗證長度、數字、大小寫、特殊字元;
2/STRONG:驗證長度、數字、大小寫、特殊字元、字典檔案;

6)、validate_password_special_char_count 整個密碼中至少要包含特殊字元的個數;

set global validate_password.policy=0;
set global validate_password.length=1;

8、配置mysql允許遠端訪問

#登入
mysql -u root -p
#檢視使用者表
select user,host,authentication_string from mysql.user;
#切換資料庫
use mysql;
#更新使用者表 :
update user set host='%' where user='root';
#配置mysql允許遠端訪問
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
#強制重新整理許可權
flush privileges;

9、附mysql常用命令:

登入mysql

mysql -u username -p

啟動mysql

systemctl start mysqld.service

結束mysql

systemctl stop mysqld.service

重啟mysql

systemctl restart mysqld.service

開機自啟

systemctl enable mysqld.service

4、將MySQL的JDBC驅動拷貝到Hive的lib目錄下

我這裡選用的8.0.27自己可以選擇版本去下載

[MySQL官網下載驅動](MySQL :: Download Connector/J)

#Platform Independent
wget https://cdn.mysql.com//Downloads/Connector-J/mysql-connector-java-8.0.27.tar.gz
#解壓檔案到Hive的lib目錄下

5、配置hive檔案

cd /export/servers/apache-hive-3.1.2-src/conf

把初始化的配置檔案 複製一份出來 並且改名

cp hive-env.sh.template hive-env.sh
cp hive-default.xml.template hive-site.xml
cp hive-log4j2.properties.template hive-log4j2.properties
cp hive-exec-log4j2.properties.template hive-exec-log4j2.properties

6、配置hive-env.sh

vi hive-env.sh

檔案末尾處

# Set HADOOP_HOME to point to a specific hadoop install directory
export HADOOP_HOME=/export/servers/hadoop-3.3.1 #hadoop安裝路徑

# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/export/servers/apache-hive-3.1.2-src/conf #hive路徑

# Folder containing extra libraries required for hive compilation/execution can be controlled by:
export HIVE_AUX_JARS_PATH=/export/servers/apache-hive-3.1.2-src/lib #hivejar包路徑

配置hive-site.xml檔案
首先使用hadoop建立3個資料夾

hdfs dfs -mkdir -p /user/hive/warehouse
hadoop fs -mkdir -p /user/hive/tmp
hadoop fs -mkdir -p /user/hive/log

修改資料夾許可權

hadoop fs -chmod -R 777 /user/hive/warehouse
hadoop fs -chmod -R 777 /user/hive/tmp
hadoop fs -chmod -R 777 /user/hive/log

7、配置Metastore到MySQL

在標籤加入下面配置:

vim hive-site.xml

在$HIVE_HOME/conf修改新建hive-site.xml檔案,根據自己的情況更在主機名,mysql的使用者名稱和密碼

<configuration>
<!-- jdbc連線的URL -->
    <property>
        <name>javax.jdo.option.ConnectionURL</name>
        <value>jdbc:mysql://hadoop1:3306/metastore?createDatabaseIfNotExist=true&amp;useSSL=false&amp;serverTimezone=GMT</value>
</property>

    <!-- jdbc連線的Driver-->
    <property>
        <name>javax.jdo.option.ConnectionDriverName</name>
        <value>com.mysql.cj.jdbc.Driver</value>
        <!-- <value>com.mysql.cj.jdbc.Driver</value> -->
</property>

        <!-- jdbc連線的username-->
    <property>
        <name>javax.jdo.option.ConnectionUserName</name>
        <value>root</value>
    </property>

    <!-- jdbc連線的password -->
    <property>
        <name>javax.jdo.option.ConnectionPassword</name>
        <value>000000</value>
    </property>

    <property>
        <name>system:java.io.tmpdir</name>
        <value>/export/servers/data/hive/tmp</value>
        <description/>
    </property>
</configuration>

注意: &amp;代表&

<configuration>
    <!--以下可選作,建議Hive3.x不要用-->
    <!-- Hive預設在HDFS的工作目錄 -->
    <property>
        <name>hive.metastore.warehouse.dir</name>
        <value>/user/hive/warehouse</value>
    </property>
    
   <!-- Hive後設資料儲存的驗證 -->
    <property>
        <name>hive.metastore.schema.verification</name>
        <value>false</value>
    </property>
   
    <!-- 後設資料儲存授權  -->
    <property>
        <name>hive.metastore.event.db.notification.api.auth</name>
        <value>false</value>
    </property>
    <!-- 指定儲存後設資料要連線的地址 -->
    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://hadoop2:9083</value>
    </property>
    <!-- 指定hiveserver2連線的host -->
    <property>
        <name>hive.server2.thrift.bind.host</name>
        <value>hadoop2</value>
    </property>
 
    <!-- 指定hiveserver2連線的埠號 -->
    <property>
        <name>hive.server2.thrift.port</name>
        <value>10000</value>
    </property>
</configuration>

報錯原因1:

1、Jar包衝突

因為跟hadoop的jar包存在衝突,主要有兩個jar包衝突,一個log4j-slf4j-impl-2.10.0.jar跟hadoop衝突,可以刪除,我這裡就打個標記棄用。

mv $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.jar $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.bak

另一個時guava-19.0.jar,跟hadoop裡面的guava-27.0-jre.jar衝突,採用高版本替換低版本的方式。

cp $HADOOP_HOME/share/hadoop/common/lib/guava-27.0-jre.jar $HIVE_HOME/lib

rm $HIVE_HOME/lib/guava-19.0.jar

報錯原因2:

hive-site.xml配置檔案中,3278行(見報錯記錄第二行)有特殊字元

Exception in thread "main" java.lang.RuntimeException: com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x8
at [row,col,system-id]: [3278,96,"file:/export/servers/apache-hive-3.1.2-bin/conf/hive-site.xml"]

[root@hadoop1 apache-hive-3.1.2-bin]# schematool -dbType mysql -initSchema
Exception in thread "main" java.lang.RuntimeException: com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x8
 at [row,col,system-id]: [3278,96,"file:/export/servers/apache-hive-3.1.2-bin/conf/hive-site.xml"]
        at org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:3069)
        at org.apache.hadoop.conf.Configuration.loadResources(Configuration.java:3018)
        at org.apache.hadoop.conf.Configuration.loadProps(Configuration.java:2893)
        at org.apache.hadoop.conf.Configuration.addResourceObject(Configuration.java:1034)
        at org.apache.hadoop.conf.Configuration.addResource(Configuration.java:939)
        at org.apache.hadoop.hive.conf.HiveConf.initialize(HiveConf.java:5151)
        at org.apache.hadoop.hive.conf.HiveConf.<init>(HiveConf.java:5104)
        at org.apache.hive.beeline.HiveSchemaTool.<init>(HiveSchemaTool.java:96)
        at org.apache.hive.beeline.HiveSchemaTool.main(HiveSchemaTool.java:1473)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.hadoop.util.RunJar.run(RunJar.java:323)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:236)
Caused by: com.ctc.wstx.exc.WstxParsingException: Illegal character entity: expansion character (code 0x8
 at [row,col,system-id]: [3278,96,"file:/export/servers/apache-hive-3.1.2-bin/conf/hive-site.xml"]
        at com.ctc.wstx.sr.StreamScanner.constructWfcException(StreamScanner.java:634)
        at com.ctc.wstx.sr.StreamScanner.throwParseError(StreamScanner.java:504)
        at com.ctc.wstx.sr.StreamScanner.reportIllegalChar(StreamScanner.java:2469)
        at com.ctc.wstx.sr.StreamScanner.validateChar(StreamScanner.java:2416)
        at com.ctc.wstx.sr.StreamScanner.resolveCharEnt(StreamScanner.java:2382)
        at com.ctc.wstx.sr.StreamScanner.fullyResolveEntity(StreamScanner.java:1528)
        at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2818)
        at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1121)
        at org.apache.hadoop.conf.Configuration$Parser.parseNext(Configuration.java:3373)
        at org.apache.hadoop.conf.Configuration$Parser.parse(Configuration.java:3159)
        at org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:3052)
        ... 14 more

進入hive-site.xml檔案,跳轉到對應行,刪除裡面的&#8特殊字元即可

報錯原因3:

問題 Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative

一、問題

Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
        at org.apache.hadoop.fs.Path.initialize(Path.java:254)
        at org.apache.hadoop.fs.Path.<init>(Path.java:212)
        at org.apache.hadoop.hive.ql.session.SessionState.createSessionDirs(SessionState.java:663)
        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:586)
        at org.apache.hadoop.hive.ql.session.SessionState.beginStart(SessionState.java:553)
        at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:750)
        at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:686)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.apache.hadoop.util.RunJar.run(RunJar.java:234)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:148)
Caused by: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
        at java.net.URI.checkPath(URI.java:1823)
        at java.net.URI.<init>(URI.java:745)
        at org.apache.hadoop.fs.Path.initialize(Path.java:251)

二、解決

在hive下新建tmp檔案:
mkdir iotmp
檢視hive-site.xml:
查詢xml中"system:java.io.tmpdir"的配置項,如果存在直接修改地址路徑到自己新建的路徑下。
不存在則加入配置:
 <property>
    <name>system:java.io.tmpdir</name>
    <value>xxxxxx</value>                                          自己新建的路徑
    <description/>
 </property>
儲存退出,重新啟動hive成功。

8、下載connecor/J驅動

下載MySQL的java版本的驅動解壓,放到hive/lib檔案內

wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-8.0.11.tar.gz
tar -zxvf mysql-connector-java-8.0.11.tar.gz
cd mysql-connector-java-8.0.11
chmod 777 mysql-connector-java-8.0.11.jar
cp mysql-connector-java-8.0.11.jar /usr/share/hive/lib/

9、遠端服務

hadoop1服務安裝好的Hive給hadoop2和hadoop3

scp -r apache-hive-3.1.2-bin/ hadoop2:/export/servers/
scp -r apache-hive-3.1.2-bin/ hadoop3:/export/servers/

hadoop1節點:

啟動Hive中的hiveserver2節點

bin/hiveserver2

hadoop2節點/hive2節點

beeline> !connect jdbc:hive2://hadoop1:10000
#預設埠號是10000
Connecting to jdbc:hive2://hadoop1:10000
#輸入賬號密碼
Enter username for jdbc:hive2://hadoop1:10000: root
Enter password for jdbc:hive2://hadoop1:10000: ******

相關文章