前文
- 一、CentOS7 hadoop3.3.1安裝(單機分散式、偽分散式、分散式
- 二、JAVA API實現HDFS
- 三、MapReduce程式設計例項
- 四、Zookeeper3.7安裝
- 五、Zookeeper的Shell操作
- 六、Java API操作zookeeper節點
- 七、Hadoop3.3.1 HA 高可用叢集QJM (基於Zookeeper,NameNode高可用+Yarn高可用)
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&useSSL=false&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>
注意:
&
代表&
<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檔案,跳轉到對應行,刪除裡面的特殊字元即可
報錯原因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: ******