Hive詳解(02) - Hive 3.1.2安裝


Hive詳解(02) - Hive 3.1.2安裝

安裝准備

Hive下載地址

Hive官網地址:http://hive.apache.org/

官方文檔查看地址:https://cwiki.apache.org/confluence/display/Hive/GettingStarted

安裝包下載地址:http://archive.apache.org/dist/hive/

github地址:https://github.com/apache/hive

環境准備

JDK:Hive和Hadoop使用java語言編寫,需要JDK環境。本文使用jdk1.8版本,安裝文檔《linux安裝jdk8》

Hadoop:Hive使用HDFS進行存儲,使用MapReduce進行計算。本文使用Hadoop3.1.3版本,安裝文檔《Hadoop詳解(02) - Hadoop3.1.3集群運行環境搭建》

Mysql:Hive默認使用的元數據庫為derby,開啟Hive之后就會占用元數據庫,且不與其他客戶端共享數據,只能單個窗口操作,操作比較局限。若支持多窗口操作就需要將Hive的元數據地址改為MySQL。本文使用mysql5.7.27版本,安裝文檔《CentOS 7安裝mysql5.7-單節點&主從》

Hive安裝部署

安裝Hive

把apache-hive-3.1.2-bin.tar.gz上傳到linux的/opt/software目錄下

解壓apache-hive-3.1.2-bin.tar.gz到/opt/module/目錄下面

[hadoop@hadoop102 ~]$ tar -zxvf /opt/software/apache-hive-3.1.2-bin.tar.gz -C /opt/module/

修改apache-hive-3.1.2-bin.tar.gz的名稱為hive

[hadoop@hadoop102 ~]$ mv /opt/module/apache-hive-3.1.2-bin/ /opt/module/hive

修改/opt/module/hive/conf目錄下的hive-env.sh.template名稱為hive-env.sh

[hadoop@hadoop102 conf]$ cp hive-env.sh.template hive-env.sh

配置hive-env.sh文件

[hadoop@hadoop102 conf]$ vi hive-env.sh

修改如下內容    

配置HADOOP_HOME路徑

HADOOP_HOME= /opt/module/hadoop-3.1.3

配置HIVE_CONF_DIR路徑

export HIVE_CONF_DIR=/opt/module/hive/conf

添加環境變量

[hadoop@hadoop102 ~]$ sudo vi /etc/profile

添加內容

#HIVE_HOME

HIVE_HOME=/opt/module/hive

export PATH=$PATH:$HIVE_HOME/bin

重新加載環境變量

[hadoop@hadoop102 ~]$ source /etc/profile

解決日志Jar包沖突

[hadoop@hadoop102 ~]$ mv /opt/module/hive/lib/log4j-slf4j-impl-2.10.0.jar /opt/module/hive/lib/log4j-slf4j-impl-2.10.0.jar.bak

Hive元數據配置到MySql

拷貝Mysql驅動

將MySQL的JDBC驅動mysql-connector-java-5.1.48.jar拷貝到Hive的lib目錄下

[hadoop@hadoop102 ~]$ cp /opt/software/mysql-connector-java-5.1.48.jar /opt/module/hive/lib/

配置Metastore到MySql

在/opt/module/hive/conf目錄下新建hive-site.xml文件

[hadoop@hadoop102 ~]$ cd /opt/module/hive/conf/

[hadoop@hadoop102 conf]$ vi hive-site.xml

添加如下內容

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

<!-- jdbc連接的URL -->

<property>

    <name>javax.jdo.option.ConnectionURL</name>

    <value>jdbc:mysql://hadoop102:3306/metastore?useSSL=false</value>

</property>

 

<!-- jdbc連接的Driver-->

<property>

    <name>javax.jdo.option.ConnectionDriverName</name>

    <value>com.mysql.jdbc.Driver</value>

</property>

 

<!-- jdbc連接的username-->

<property>

    <name>javax.jdo.option.ConnectionUserName</name>

    <value>admin</value>

</property>

 

<!-- jdbc連接的password -->

<property>

    <name>javax.jdo.option.ConnectionPassword</name>

    <value>Abc_123456</value>

</property>

 

<!-- 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>

</configuration>

在mysql中初始hive的化元數據庫

登陸MySQL

[hadoop@hadoop102 ~]$ mysql -uadmin -pAbc_123456

新建Hive元數據庫

mysql> create database metastore;

mysql> quit

初始化Hive元數據庫

[hadoop@hadoop102 ~]$ schematool -initSchema -dbType mysql –verbose

執行初始化Hive元數據庫命令后,可以在mysql的metastore庫中看到創建的表

啟動Hive

先啟動hadoop集群

啟動Hive

[hadoop@hadoop102 ~]$ cd /opt/module/hive/

[hadoop@hadoop102 hive]$ bin/hive

使用Hive

hive> show databases;

hive> create table test (id int);

hive> show tables;

hive> insert into test values(1);

hive> select * from test;

Hive常見屬性配置

在hive-site.xml文件中添加如下配置信息,就可以實現顯示當前數據庫,以及查詢表的頭信息配置。

<property>

    <name>hive.cli.print.header</name>

    <value>true</value>

</property>

 

<property>

    <name>hive.cli.print.current.db</name>

    <value>true</value>

</property>

重新啟動hive,對比配置前后差異。

Hive的log默認存放在/tmp/當前用戶名/hive.log目錄下(當前用戶名下)

修改hive的log存放日志到/opt/module/hive/logs

修改/opt/module/hive/conf/hive-log4j.properties.template文件名稱為hive-log4j.properties

[hadoop@hadoop102 hadoop]$ cd /opt/module/hive/conf/

[hadoop@hadoop102 conf]$ mv hive-log4j2.properties.template hive-log4j2.properties

在hive-log4j.properties文件中修改log存放位置

property.hive.log.dir = /opt/module/hive/logs

查看當前所有的配置信息

hive>set;

參數的配置三種方式

(1)配置文件方式

默認配置文件:hive-default.xml

用戶自定義配置文件:hive-site.xml

注意:用戶自定義配置會覆蓋默認配置。

另外,Hive也會讀入Hadoop的配置,因為Hive是作為Hadoop的客戶端啟動的,Hive的配置會覆蓋Hadoop的配置。配置文件的設定對本機啟動的所有Hive進程都有效。

(2)命令行參數方式

啟動Hive時,可以在命令行添加-hiveconf param=value來設定參數。

例如:

[hadoop@hadoop102 hive]$ bin/hive -hiveconf mapred.reduce.tasks=10;

注意:僅對本次hive啟動有效

查看參數設置:    

hive (default)> set mapred.reduce.tasks;

(3)參數聲明方式

可以在HQL中使用SET關鍵字設定參數

例如:

hive (default)> set mapred.reduce.tasks=100;

注意:僅對本次hive啟動有效

查看參數設置

hive (default)> set mapred.reduce.tasks;

上述三種設定方式的優先級依次遞增。即配置文件<命令行參數<參數聲明。注意某些系統級的參數,例如log4j相關的設定,必須用前兩種方式設定,因為那些參數的讀取在會話建立以前已經完成了。

使用元數據MetaStore服務的方式訪問Hive

Hive獲取Mysql元數據的兩種方式:

啟動方式:只需直接啟動Hive客戶端,即可連接

2 Hive先連接MetaStore服務,再通過MetaStore服務連接MySQL獲取元數據

啟動方式:

先啟動Metastore服務

再啟動Hive客戶端

什么有了第一種方式,還要用MetaStore服務

Hive既是客戶端(是HDFS的客戶端也是MetaStore的客戶端,也是Hive的客戶端)又是服務端(因為有MetaStore服務和Hiveserver2服務配置)

而在實際生產環境下,可能有多台Hive客戶端(比如有:hadoop102、hadoop103、hadoop104三台機器),MySQL的 IP地址對外不暴露,只暴露給其中一台(假如暴露給node-1這台機器),那么其他客戶端怎么連接呢?此時就需要在暴露的那台機器上啟動MetaStore服務,其他Hive客戶端連接這個MetaStore服務,進而達到連接Mysql獲取元數據的目的。

在Hive的配置文件hive-site.xml 中是否配置了hive.metastore.uris參數,

如果有,那么Hive連接MySQL的方式則為第二種

如果想用第一種方式連接的話,需要把上面的配置注釋掉 ,還必需保證有如下mysql鏈接配置

<property>

<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true&amp;characterEncoding=UTF-8&amp;useSSL=false</value>

</property>

<property>

<name>javax.jdo.option.ConnectionDriverName</name>

<value>com.mysql.jdbc.Driver</value>

</property>

<property>

<name>javax.jdo.option.ConnectionUserName</name>

<value>admin</value>

</property>

<property>

<name>javax.jdo.option.ConnectionPassword</name>

<value>Abc_123456</value>

</property>

在hive-site.xml文件中添加如下配置信息

<!-- 指定存儲元數據要連接的地址 -->

<property>

<name>hive.metastore.uris</name>

<value>thrift://hadoop102:9083</value>

</property>

啟動metastore

[hadoop@hadoop102 hive]$ hive --service metastore

2022-01-06 22:25:05: Starting Hive Metastore Server

hive --service metastore命令為前台啟動,啟動后窗口不能再操作,

后台啟動Metastore服務的命令為:

nohup hive --service metastore 2>&1 &

啟動hive客戶端

[hadoop@hadoop102 ~]$ hive

若其它機器只作為客戶端,hive-site.xml 文件只需如下配置即可通過Metastore服務鏈接hive

使用JDBC通過Hiveserver2服務的方式訪問Hive

Hiveserver2實際是HiveHive之間的服務端與客戶端連接的方式

上面提到了作為客戶端的機器比如hadoop103,當它作為hadoop104的客戶端時,那么可以用Hiveserver2服務連接:

1 在hadoop103上啟動Hiveserver2服務(如果配置了Metastore服務依舊也要啟動)

2 在hadoop104上啟動beline客戶端也可以連接

注:HIve既是客戶端又是服務端時,可以在同一個機器上啟動服務端和客戶端。

在hive-site.xml文件中添加如下配置信息

<!-- 指定hiveserver2連接的host -->

<property>

<name>hive.server2.thrift.bind.host</name>

<value>hadoop102</value>

</property>

<!-- 指定hiveserver2連接的端口號 -->

<property>

<name>hive.server2.thrift.port</name>

<value>10000</value>

</property>

啟動hiveserver2

[hadoop@hadoop102 conf]$ hive --service hiveserver2

后台啟動hiveserver2服務:nohup hive --service hiveserver2 2>&1 &

啟動完成后通過瀏覽器訪問UI頁面

http://hadoop102:10002/

啟動beeline客戶端(需要多等待一會)

[hadoop@hadoop102 ~]$ beeline -u jdbc:hive2://hadoop102:10000 -n hadoop

看到如下信息說明通過beeline客戶端訪問hive成功

[hadoop@hadoop102 ~]$ beeline -u jdbc:hive2://hadoop102:10000 -n hadoop

Connecting to jdbc:hive2://hadoop102:10000

Connected to: Apache Hive (version 3.1.2)

Driver: Hive JDBC (version 3.1.2)

Transaction isolation: TRANSACTION_REPEATABLE_READ

Beeline version 3.1.2 by Apache Hive

0: jdbc:hive2://hadoop102:10000> show tables;

  • 遇到的問題

問題一:Beeline鏈接hive需要密碼的情況:

[hadoop@hadoop102 ~]$ beeline

Beeline version 3.1.2 by Apache Hive

beeline> !connect jdbc:hive2://hadoop102:10000

Connecting to jdbc:hive2://hadoop102:10000

Enter username for jdbc:hive2://hadoop102:10000: hadoop #hive服務端操作系統用戶名

Enter password for jdbc:hive2://hadoop102:10000: ****** #hive服務端操作系統密碼

Connected to: Apache Hive (version 3.1.2)

Driver: Hive JDBC (version 3.1.2)

Transaction isolation: TRANSACTION_REPEATABLE_READ

0: jdbc:hive2://hadoop102:10000>

問題二:在使用beeline鏈接hive時如果連接失敗報錯:

Error: Could not open client transport with JDBC Uri: jdbc:hive2://192.168.194.48:10000: Failed to open new session: java.lang.RuntimeException: RemoteException(AuthorizationException): User: hadoop is not allowed to impersonate hadoop (state=08S01,code=0)

解決辦法:通過httpfs協議訪問rest接口,以hadoop用戶包裝自己的方式操作HDFS

首先需要開啟rest接口,

在hdfs-site.xml文件中加入:

<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>  

然后在core-site.xml文件中加入:

<property>

<name>hadoop.proxyuser.hadoop.hosts</name>

<value>*</value>

</property>

<property>

<name>hadoop.proxyuser.hadoop.groups</name>

<value>*</value>

</property>

綠色的hadoop是beeline> ! connect jdbc:hive2://192.168.194.48:10000登錄時的用戶名

    當用不同的用戶通過rest接口訪問hdfs時可以配置多個用戶如下圖中同時配置了hue和hadoop用戶

編寫啟動metastore和hiveserver2腳本

前台啟動的方式導致需要打開多個shell窗口,且終端斷開鏈接后服務就停止運行,可以使用如下方式后台方式啟動

nohup hive --service metastore 2>&1 &

nohup hive --service hiveserver2 2>&1 &

編寫啟動腳本可以更方便的管理

[hadoop@hadoop102 ~]$ cd /opt/module/hive/bin/

[hadoop@hadoop102 bin]$ vi hiveservices.sh

文件中加入如下內容

#!/bin/bash

HIVE_LOG_DIR=/opt/module/hive/logs

if [ ! -d $HIVE_LOG_DIR ]

then

mkdir -p $HIVE_LOG_DIR

fi

#檢查進程是否運行正常,參數1為進程名,參數2為進程端口

function check_process()

{

pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}')

ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)

echo $pid

[[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1

}

 

function hive_start()

{

metapid=$(check_process HiveMetastore 9083)

cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"

cmd=$cmd" sleep 4; hdfs dfsadmin -safemode wait >/dev/null 2>&1"

[ -z "$metapid" ] && eval $cmd || echo "Metastroe服務已啟動"

server2pid=$(check_process HiveServer2 10000)

cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &"

[ -z "$server2pid" ] && eval $cmd || echo "HiveServer2服務已啟動"

}

 

function hive_stop()

{

metapid=$(check_process HiveMetastore 9083)

[ "$metapid" ] && kill $metapid || echo "Metastore服務未啟動"

server2pid=$(check_process HiveServer2 10000)

[ "$server2pid" ] && kill $server2pid || echo "HiveServer2服務未啟動"

}

 

case $1 in

"start")

hive_start

;;

"stop")

hive_stop

;;

"restart")

hive_stop

sleep 2

hive_start

;;

"status")

check_process HiveMetastore 9083 >/dev/null && echo "Metastore服務運行正常" || echo "Metastore服務運行異常"

check_process HiveServer2 10000 >/dev/null && echo "HiveServer2服務運行正常" || echo "HiveServer2服務運行異常"

;;

*)

echo Invalid Args!

echo 'Usage: '$(basename $0)' start|stop|restart|status'

;;

esac

添加執行權限

[hadoop@hadoop102 bin]$ chmod u+x hiveservices.sh

使用腳本

啟動:hiveservices.sh start

停止:hiveservices.sh stop

重啟:hiveservices.sh restart

查看狀態: hiveservices.sh status

Hive常用交互命令

[hadoop@hadoop102 hive]$ bin/hive -help

usage: hive

-d,--define <key=value> Variable subsitution to apply to hive

commands. e.g. -d A=B or --define A=B

--database <databasename> Specify the database to use

-e <quoted-query-string> SQL from command line

-f <filename> SQL from files

-H,--help Print help information

--hiveconf <property=value> Use value for given property

--hivevar <key=value> Variable subsitution to apply to hive

commands. e.g. --hivevar A=B

-i <filename> Initialization SQL file

-S,--silent Silent mode in interactive shell

-v,--verbose Verbose mode (echo executed SQL to the console)

"-e"不進入hive的交互窗口執行sql語句

bin/hive -e "select id from student;"

"-f"執行腳本中sql語句

在/opt/module/hive/下創建datas目錄並在datas目錄下創建hivef.sql文件

touch hivef.sql

文件中寫入正確的sql語句

select *from student;

執行文件中的sql語句

bin/hive -f /opt/module/hive/datas/hivef.sql

執行文件中的sql語句並將結果寫入文件中

bin/hive -f /opt/module/hive/datas/hivef.sql > /opt/module/datas/hive_result.txt

Hive其他命令操作

退出hive窗口:

hive(default)>exit;

hive(default)>quit;

在hive cli命令窗口中如何查看hdfs文件系統

hive(default)>dfs -ls /;

查看在hive中輸入的所有歷史命令

進入到當前用戶的根目錄/root或/home/atguigu

查看. hivehistory文件

cat .hivehistory

在Hive中配置Tez引擎

Hive運行引擎Tez

Tez是一個Hive的運行引擎,性能優於MR。

用Hive直接編寫MR程序,假設有四個有依賴關系的MR作業,上圖中,綠色是Reduce Task,雲狀表示寫屏蔽,需要將中間結果持久化寫到HDFS。Tez可以將多個有依賴的作業轉換為一個作業,這樣只需寫一次HDFS,且中間節點較少,從而大大提升作業的計算性能。

安裝准備

hadoop配置支持LZO壓縮,參考文檔《Hadoop詳解(07-1) - Hdfs支持LZO壓縮配置》

tez官網:https://tez.apache.org/

tez安裝包下載地址:https://downloads.apache.org/tez/0.10.1/apache-tez-0.10.1-bin.tar.gz

上傳解壓

[hadoop@hadoop102 software]$ tar -zxvf apache-tez-0.10.1-bin.tar.gz -C /opt/module/

修改名稱

[hadoop@hadoop102 software]$ cd /opt/module/

[hadoop@hadoop102 module]$ mv apache-tez-0.10.1-bin/ tez-0.10.1

在Hive中配置Tez

  • 在hive-env.sh文件中添加tez環境變量配置和依賴包環境變量配置

    [hadoop@hadoop102 module]$ cd /opt/module/hive/conf/

    [hadoop@hadoop102 conf]$ vi hive-env.sh

在文件末尾添加如下配置

#tez的解壓目錄

export TEZ_HOME=/opt/module/tez-0.10.1

export TEZ_JARS=""

for jar in `ls $TEZ_HOME |grep jar`; do

export TEZ_JARS=$TEZ_JARS:$TEZ_HOME/$jar

done

for jar in `ls $TEZ_HOME/lib`; do

export TEZ_JARS=$TEZ_JARS:$TEZ_HOME/lib/$jar

done

#導入lzo壓縮jar包的環境變量

export HIVE_AUX_JARS_PATH=/opt/module/hadoop-3.1.3/share/hadoop/common/hadoop-lzo-0.4.21-SNAPSHOT.jar$TEZ_JARS

  • 在hive-site.xml文件中添加如下配置,更改hive計算引擎

    <property>

    <name>hive.execution.engine</name>

    <value>tez</value>

    </property>

  • 配置tez-site.xml

在/opt/module/hive/conf下面創建tez-site.xml文件

[hadoop@hadoop102 conf]$ vi tez-site.xml

在tez-site.xml添加如下內容

<?xml version="1.0" encoding="UTF-8"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

<property>

<name>tez.lib.uris</name>

<value>${fs.defaultFS}/tez/tez-0.10.1,${fs.defaultFS}/tez/tez-0.10.1/lib</value>

</property>

<property>

<name>tez.lib.uris.classpath</name>

<value>${fs.defaultFS}/tez/tez-0.10.1,${fs.defaultFS}/tez/tez-0.10.1/lib</value>

</property>

<property>

<name>tez.use.cluster.hadoop-libs</name>

<value>true</value>

</property>

<property>

<name>tez.history.logging.service.class</name>

<value>org.apache.tez.dag.history.logging.ats.ATSHistoryLoggingService</value>

</property>

</configuration>

  • 上傳Tez目錄到hdfs集群

1)將tez安裝目錄/opt/module/tez-0.9.1上傳到HDFS的/tez路徑

[hadoop@hadoop102 conf]$ hadoop fs -mkdir /tez

[hadoop@hadoop102 conf]$ hadoop fs -put /opt/module/tez-0.10.1/ /tez

[hadoop@hadoop102 conf]$ hadoop fs -ls /tez

Found 1 items

drwxr-xr-x - hadoop supergroup 0 2022-01-14 01:40 /tez/tez-0.10.1

  • 測試

啟動Hive

啟動hive過程不報錯,如果報錯說明tez引擎配置有問題

[hadoop@hadoop102 hive]$ bin/hive

普通表數據測試

創建LZO表

hive (default)> create table student(

id int,

name string);

向表中添加數據

hive (default)> insert into student values(1,"zhangjk");

查詢數據,如果沒有報錯就表示hive配置tez引擎成功

hive (default)> select * from student;

OK

student.id student.name

1 zhangjk

Time taken: 0.187 seconds, Fetched: 1 row(s)

使用LZO壓縮的表測試

創建輸入數據是lzo輸出是text,支持json解析的分區表

hive (default)> drop table if exists log;

CREATE EXTERNAL TABLE log (`line` string)

PARTITIONED BY (`dt` string)

STORED AS

INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat'

OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'

LOCATION '/user/hive/warehouse/log';

在本地創建文本數據,添加測試數據並上傳到hdfs中

[hadoop@hadoop102 module]$ vi 1.log

文件中添加如下測試數據

hello hadoop

hello hive

hello tez

上傳到hdfs

hadoop fs -put /opt/module/1.log /user

加載數據

hive (gmall)> load data inpath '/user/1.log' into table log partition(dt='2022-01-01');

解決內存不足問題

如果在虛擬機上運行Tez時經常會出現內存不足道情況而被NodeManager殺死進程,如:

Caused by: org.apache.tez.dag.api.SessionNotRunning: TezSession has already shutdown. Application application_1546781144082_0005 failed 2 times due to AM Container for appattempt_1546781144082_0005_000002 exited with exitCode: -103 For more detailed output, check application tracking page:http://hadoop103:8088/cluster/app/application_1546781144082_0005Then, click on links to logs of each attempt. Diagnostics: Container [pid=11116,containerID=container_1546781144082_0005_02_000001] is running beyond virtual memory limits. Current usage: 216.3 MB of 1 GB physical memory used; 2.6 GB of 2.1 GB virtual memory used. Killing container.

這種問題是從機上運行的Container試圖使用過多的內存,而被NodeManager kill掉了。

[摘錄] The NodeManager is killing your container. It sounds like you are trying to use hadoop streaming which is running as a child process of the map-reduce task. The NodeManager monitors the entire process tree of the task and if it eats up more memory than the maximum set in mapreduce.map.memory.mb or mapreduce.reduce.memory.mb respectively, we would expect the Nodemanager to kill the task, otherwise your task is stealing memory belonging to other containers, which you don't want.

[摘錄翻譯]節點管理器正在殺死您的容器。聽起來您正在嘗試使用hadoop流,它作為map reduce任務的子進程運行。NodeManager監視任務的整個進程樹,以及任務占用的內存是否超過mapreduce中設置的最大值。地圖記憶力mb或mapreduce。減少記憶力我們希望節點管理器殺死該任務,否則您的任務將竊取屬於其他容器的內存,這是您不想要的。

方案一:關掉虛擬內存檢查。

修改yarn-site.xml

<property>

<name>yarn.nodemanager.vmem-check-enabled</name>

<value>false</value>

</property>

方案二:mapred-site.xml中設置Map和Reduce任務的內存配置

value中實際配置的內存需要根據自己機器內存大小及應用情況進行修改

<property>

  <name>mapreduce.map.memory.mb</name>

  <value>1536</value>

</property>

<property>

  <name>mapreduce.map.java.opts</name>

  <value>-Xmx1024M</value>

</property>

<property>

  <name>mapreduce.reduce.memory.mb</name>

  <value>3072</value>

</property>

<property>

  <name>mapreduce.reduce.java.opts</name>

  <value>-Xmx2560M</value>

</property>

修改完后重新啟動hadoop集群和hive服務

 

常見錯誤及解決方案

將$HADOOP_HOME/etc/hadoop/capacity-scheduler.xml文件中的

<property>

<name>yarn.scheduler.capacity.maximum-am-resource-percent</name>

<value>0.1</value>

<description>

Maximum percent of resources in the cluster which can be used to run

application masters i.e. controls number of concurrent running

applications.

</description>

</property>

改成

<property>

<name>yarn.scheduler.capacity.maximum-am-resource-percent</name>

<value>1</value>

<description>

Maximum percent of resources in the cluster which can be used to run

application masters i.e. controls number of concurrent running

applications.

</description>

</property>

(1)導錯驅動包,應該把mysql-connector-java-5.1.27-bin.jar導入/opt/module/hive/lib的不是這個包。錯把mysql-connector-java-5.1.27.tar.gz導入hive/lib包下。

(2)修改user表中的主機名稱沒有都修改為%,而是修改為localhost

可以采用HiveInputFormat就會根據分區數輸出相應的文件。

hive (default)> set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;

描述:java.lang.OutOfMemoryError: Java heap space

解決:在yarn-site.xml中加入如下代碼

<property>

    <name>yarn.scheduler.maximum-allocation-mb</name>

    <value>2048</value>

</property>

<property>

    <name>yarn.scheduler.minimum-allocation-mb</name>

    <value>2048</value>

</property>

<property>

    <name>yarn.nodemanager.vmem-pmem-ratio</name>

    <value>2.1</value>

</property>

<property>

    <name>mapred.child.java.opts</name>

    <value>-Xmx1024m</value>

</property>

在yarn-site.xml中添加如下配置:

<property>

<name>yarn.nodemanager.vmem-check-enabled</name>

<value>false</value>

</property>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM