您的位置:首页 > 其它

Hive安装及基本命令整理超详细超详细超详细重要的事情说三遍以及连接错误问题处理

2017-10-16 21:20 597 查看


在~下创建hive文件夹,再在hive下创建ubunt0文件夹







$>/have/bin/schemaTool-initSchema-dbTypemysql

删除之前生成的元数据库和hdfs上的/usr/hive/

jar-tfxxx.jar//查看jar包

hive下按两次tab键可以显示所有函数提示






<dependency>

<groupId>org.apache.hive</groupId>

<artifactId>hive-exec</artifactId>

<version>2.1.1</version>

</dependency>

<dependency>

<groupId>org.apache.hive</groupId>

<artifactId>hive-jdbc</artifactId>

<version>2.1.1</version>

</dependency>





$hive>createtablehive1.tasselect*fromothertable;



--thisisacomment!这个是hive中的注释,跟MySQL中是一样的





传统数据库是写时模式,在写入的时候校验,hive是读时模式,在写入的时候不校验,查询的时候校验
级联删除库:dropdatabaseifexistsxxxcascade;
指定目录下创建数据库:createdatabasehive2location'/usr/ubuntu/hive2.db';
创建库有扩展信息:createdatabasehive3withdbproperties(''='',''='');
描述:descdatabaseextendedhive3;
hive默认创建的表都是托管表managedtable.hive控制其数据的生命周期,默认将这些表的数据存在hive.metastore.warehouse.dir.
创建外部表:createexternaltablehive1.testlikehive2.test//只有表结构
创建表:createtablehive1.testasselect*fromhive2.test//带数据,不能用于创建外部表











一)hive中支持两种类型的分区:

静态分区SP(staticpartition)
动态分区DP(dynamicpartition)

静态分区与动态分区的主要区别在于静态分区是手动指定,而动态分区是通过数据来进行判断。详细来说,静态分区的列实在编译时期,通过用户传递来决定的;动态分区只有在SQL执行时才能决定。

二)实战演示如何在hive中使用动态分区

1、创建一张分区表,包含两个分区dt和ht表示日期和小时

[sql]view
plaincopy

CREATETABLEpartition_table001

(

nameSTRING,

ipSTRING

)

PARTITIONEDBY(dtSTRING,htSTRING)

ROWFORMATDELIMITEDFIELDSTERMINATEDBY"\t";

2、启用hive动态分区,只需要在hive会话中设置两个参数:

[sql]view
plaincopy

sethive.exec.dynamic.partition=true;

sethive.exec.dynamic.partition.mode=nonstrict;

3、把partition_table001表某个日期分区下的数据load到目标表partition_table002

使用静态分区时,必须指定分区的值,如:

[sql]view
plaincopy

createtableifnotexistspartition_table002likepartition_table001;

insertoverwritetablepartition_table002partition(dt='20150617',ht='00')selectname,ipfrompartition_table001wheredt='20150617'andht='00';

此时我们发现一个问题,如果希望插入每天24小时的数据,则需要执行24次上面的语句。而动态分区会根据select出的结果自动判断数据改load到哪个分区中去。

4、使用动态分区

[sql]view
plaincopy

insertoverwritetablepartition_table002partition(dt,ht)select*frompartition_table001wheredt='20150617';

hive先获取select的最后两个位置的dt和ht参数值,然后将这两个值填写到insert语句partition中的两个dt和ht变量中,即动态分区是通过位置来对应分区值的。原始表select出来的值和输出partition的值的关系仅仅是通过位置来确定的,和名字并没有关系,比如这里dt和st的名称完全没有关系。

只需要一句SQL即可把20150617下的24个ht分区插到了新表中。

三)静态分区和动态分区可以混合使用

1、全部DP

[sql]view
plaincopy

INSERTOVERWRITETABLETPARTITION(ds,hr)

SELECTkey,value,ds,hrFROMsrcpartWHEREdsisnotnullandhr>10;

2、DP/SP结合

[sql]view
plaincopy

INSERTOVERWRITETABLETPARTITION(ds='2010-03-03',hr)

SELECTkey,value,/*ds,*/hrFROMsrcpartWHEREdsisnotnullandhr>10;

3、当SP是DP的子分区时,以下DML会报错,因为分区顺序决定了HDFS中目录的继承关系,这点是无法改变的

[sql]view
plaincopy

--throwanexception

INSERTOVERWRITETABLETPARTITION(ds,hr=11)

SELECTkey,value,ds/*,hr*/FROMsrcpartWHEREdsisnotnullandhr=11;

4、多张表插入

[sql]view
plaincopy

FROMS

INSERTOVERWRITETABLETPARTITION(ds='2010-03-03',hr)

SELECTkey,value,ds,hrFROMsrcpartWHEREdsisnotnullandhr>10

INSERTOVERWRITETABLERPARTITION(ds='2010-03-03,hr=12)

SELECTkey,value,ds,hrfromsrcpartwheredsisnotnullandhr=12;

5、CTAS,(CREATE-AS语句),DP与SP下的CTAS语法稍有不同,因为目标表的schema无法完全的从select语句传递过去。这时需要在create语句中指定partition列

[sql]view
plaincopy

CREATETABLET(keyint,valuestring)PARTITIONEDBY(dsstring,hrint)AS

SELECTkey,value,ds,hr+1hr1FROMsrcpartWHEREdsisnotnullandhr>10;

6、上面展示了DP下的CTAS用法,如果希望在partition列上加一些自己的常量,可以这样做

[sql]view
plaincopy

CREATETABLET(keyint,valuestring)PARTITIONEDBY(dsstring,hrint)AS

SELECTkey,value,"2010-03-03",hr+1hr1FROMsrcpartWHEREdsisnotnullandhr>10;




se前省略了as

左半连接:查询显示左边的信息,前提满足右边的条件。左半连接select和where子句中不能包含右边表的字段
hive不支持右半开连接





sethive.mapjoin.smalltable.filesize=25000000//设置小表的阈值,小于这个值就开始在map端连接
设置后直接查询即可,可不用写/*+maojoin(x)*/.加上这个标记也是可用的。
hive对于右外连接(rightoutjoin)和全外连接(fulloutjoin)不支持这个优化。
sortby:局部排序orderby:全排序

















只能对内部表进行归档,外部表不能归档。





如果还不行就把hadoop-archives-2.7.2.jar放到/soft/hive/lib/下









浮点数比较规避方案:selectcast(0.2asfloat);
%在sql语句中表示通配符,,在模糊查询中用到
如查询姓名以张开头的就写成like‘张%’如姓名以国结尾的写成like‘%国’。。。姓名中包含峰的写成like'%峰%'.
limit(1,2)1:偏移量;2:取的个数
join:hive只支持等值连接,即运算符是“=”。





Hive的meta数据支持以下三种存储方式,其中两种属于本地存储,一种为远端存储。远端存储比较适合生产环境。Hive官方wiki详细介绍了这三种方式,链接为:Hive
Metastore。

我们先建立一个分桶表,并尝试直接上传一个数据

createtablestudent4(snoint,snamestring,sexstring,sageint,sdeptstring)clusteredby(sno)into3bucketsrowformatdelimitedfieldsterminatedby',';
sethive.enforce.bucketing=true;强制分桶。
loaddatalocalinpath'/home/hadoop/hivedata/students.txt'overwriteintotablestudent4;




我们看到虽然设置了强制分桶,但实际student表下面只有一个students一个文件。分桶也就是分区,分区数量等于文件数,所以上面方法并没有分桶。


现在,我们用插入的方法给另外一个分桶表传入同样数据

createtablestudent4(snoint,snamestring,sexstring,sageint,sdeptstring)clusteredby(sno)into3bucketsrowformatdelimitedfieldsterminatedby',';
sethive.enforce.bucketing=true;强制分桶。
loaddatalocalinpath'/home/hadoop/hivedata/students.txt'overwriteintotablestudent4;
我们看到虽然设置了强制分桶,但实际STUDENT表下面只有一个STUDENTS一个文件。
分桶也就是分区,分区数量等于文件数,所以上面方法并没有分桶。
#创建第2个分桶表
createtablestu_buck(snoint,snamestring,sexstring,sageint,sdeptstring)
clusteredby(sno)
sortedby(snoDESC)
into4buckets
rowformatdelimited
fieldsterminatedby',';

#设置变量,设置分桶为true,设置reduce数量是分桶的数量个数
sethive.enforce.bucketing=true;
setmapreduce.job.reduces=4;
#开会往创建的分通表插入数据(插入数据需要是已分桶,且排序的)
#可以使用distributeby(sno)sortby(snoasc)或是排序和分桶的字段相同的时候使用Clusterby(字段)
#注意使用clusterby就等同于分桶+排序(sort)
insertintotablestu_buck
selectsno,sname,sex,sage,sdeptfromstudentdistributeby(sno)sortby(snoasc);

QueryID=root_20171109145012_7088af00-9356-46e6-a988-f1fc5f6d2e13
Totaljobs=1
LaunchingJob1outof1
Numberofreducetasksdeterminedatcompiletime:4
Inordertochangetheaverageloadforareducer(inbytes):
sethive.exec.reducers.bytes.per.reducer=<number>
Inordertolimitthemaximumnumberofreducers:
sethive.exec.reducers.max=<number>
Inordertosetaconstantnumberofreducers:
setmapreduce.job.reduces=<number>
StartingJob=job_1510197346181_0014,TrackingURL=http://server71:8088/proxy/application_1510197346181_0014/KillCommand=/usr/local/hadoop/bin/hadoopjob-killjob_1510197346181_0014
HadoopjobinformationforStage-1:numberofmappers:1;numberofreducers:4
2017-11-0914:50:59,642Stage-1map=0%,reduce=0%
2017-11-0914:51:38,682Stage-1map=100%,reduce=0%,CumulativeCPU5.04sec
2017-11-0914:52:31,935Stage-1map=100%,reduce=50%,CumulativeCPU7.91sec
2017-11-0914:52:33,467Stage-1map=100%,reduce=67%,CumulativeCPU15.51sec
2017-11-0914:52:39,420Stage-1map=100%,reduce=83%,CumulativeCPU22.5sec
2017-11-0914:52:40,953Stage-1map=100%,reduce=92%,CumulativeCPU25.86sec
2017-11-0914:52:42,243Stage-1map=100%,reduce=100%,CumulativeCPU28.01sec
MapReduceTotalcumulativeCPUtime:28seconds10msec
EndedJob=job_1510197346181_0014
Loadingdatatotabledefault.stu_buck
Tabledefault.stu_buckstats:[numFiles=4,numRows=22,totalSize=527,rawDataSize=505]
MapReduceJobsLaunched:
Stage-Stage-1:Map:1Reduce:4CumulativeCPU:28.01secHDFSRead:18642HDFSWrite:819SUCCESS
TotalMapReduceCPUTimeSpent:28seconds10msec
OK
Timetaken:153.794seconds




我们设置reduce的数量为4,学过mapreduce的人应该知道reduce数等于分区数,也等于处理的文件数量。

把表或分区划分成bucket有两个理由
1,更快,桶为表加上额外结构,链接相同列划分了桶的表,可以使用map-sidejoin更加高效。
2,取样sampling更高效。没有分区的话需要扫描整个数据集。

hive>createtablebucketed_user(idint,namestring)
>clusteredby(id)sortedby(idasc)into4buckets;
重点1:CLUSTEREDBY来指定划分桶所用列和划分桶的个数。HIVE对key的hash值除bucket个数取余数,保证数据均匀随机分布在所有bucket里。
重点2:SORTEDBY对桶中的一个或多个列另外排序

总结:我们发现其实桶的概念就是MapReduce的分区的概念,两者完全相同。物理上每个桶就是目录里的一个文件,一个作业产生的桶(输出文件)数量和reduce任务个数相同。
而分区表的概念,则是新的概念。分区代表了数据的仓库,也就是文件夹目录。每个文件夹下面可以放不同的数据文件。通过文件夹可以查询里面存放的文件。但文件夹本身和数据的内容毫无关系。
桶则是按照数据内容的某个值进行分桶,把一个大文件散列称为一个个小文件。

这些小文件可以单独排序。如果另外一个表也按照同样的规则分成了一个个小文件。两个表join的时候,就不必要扫描整个表,只需要匹配相同分桶的数据即可。效率当然大大提升。
同样,对数据抽样的时候,也不需要扫描整个文件。只需要对每个分区按照相同规则抽取一部分数据即可。






一、本地derby

这种方式是最简单的存储方式,只需要在hive-site.xml做如下配置便可

[html]view
plaincopy

<?xmlversion="1.0"?>

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

<configuration>

<property>

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

<value>jdbc:derby:;databaseName=metastore_db;create=true</value>

</property>

<property>

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

<value>org.apache.derby.jdbc.EmbeddedDriver</value>

</property>

<property>

<name>hive.metastore.local</name>

<value>true</value>

</property>

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive/warehouse</value>

</property>

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive/warehouse</value>

</property>

</configuration>

注:使用derby存储方式时,运行hive会在当前目录生成一个derby文件和一个metastore_db目录。这种存储方式的弊端是在同一个目录下同时只能有一个hive客户端能使用数据库,否则会提示如下错误

[html]view
plaincopy

hive>showtables;

FAILED:Errorinmetadata:javax.jdo.JDOFatalDataStoreException:Failedtostartdatabase'metastore_db',seethenextexceptionfordetails.

NestedThrowables:

java.sql.SQLException:Failedtostartdatabase'metastore_db',seethenextexceptionfordetails.

FAILED:ExecutionError,returncode1fromorg.apache.hadoop.hive.ql.exec.DDLTask


二、本地mysql

这种存储方式需要在本地运行一个mysql服务器,并作如下配置(下面两种使用mysql的方式,需要将mysql的jar包拷贝到$HIVE_HOME/lib目录下)。

[html]view
plaincopy

<?xmlversion="1.0"?>

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

<configuration>

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive_remote/warehouse</value>

</property>

<property>

<name>hive.metastore.local</name>

<value>true</value>

</property>

<property>

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

<value>jdbc:mysql://localhost/hive_remote?createDatabaseIfNotExist=true</value>

</property>

<property>

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

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

</property>

<property>

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

<value>hive</value>

</property>

<property>

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

<value>password</value>

</property>

</configuration>


三、远端mysql

这种存储方式需要在远端服务器运行一个mysql服务器,并且需要在Hive服务器启动meta服务。

这里用mysql的测试服务器,ip位192.168.1.214,新建hive_remote数据库,字符集位latine1

[html]view
plaincopy

<?xmlversion="1.0"?>

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

<configuration>

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive/warehouse</value>

</property>

<property>

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

<value>jdbc:mysql://192.168.1.214:3306/hive_remote?createDatabaseIfNotExist=true</value>

</property>

<property>

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

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

</property>

<property>

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

<value>hive</value>

</property>

<property>

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

<value>password</value>

</property>

<property>

<name>hive.metastore.local</name>

<value>false</value>

</property>

<property>

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

<value>thrift://192.168.1.188:9083</value>

</property>

</configuration>

注:这里把hive的服务端和客户端都放在同一台服务器上了。服务端和客户端可以拆开,将hive-site.xml配置文件拆为如下两部分

1)、服务端配置文件


[html]view
plaincopy

<?xmlversion="1.0"?>

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

<configuration>

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive/warehouse</value>

</property>

<property>

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

<value>jdbc:mysql://192.168.1.214:3306/hive_remote?createDatabaseIfNotExist=true</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>test1234</value>

</property>

</configuration>


2)、客户端配置文件


[html]view
plaincopy

<?xmlversion="1.0"?>

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

<configuration>

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive/warehouse</value>

</property>

<property>

<name>hive.metastore.local</name>

<value>false</value>

</property>

<property>

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

<value>thrift://192.168.1.188:9083</value>

</property>

</configuration>

启动hive服务端程序

[plain]view
plaincopy

$hive--servicemetastore

客户端直接使用hive命令即可

[plain]view
plaincopy

root@my188:~$hive

Hivehistoryfile=/tmp/root/hive_job_log_root_201301301416_955801255.txt

hive>showtables;

OK

test_hive

Timetaken:0.736seconds

hive>

问题导读
1、如何加载分区表数据?

2、Hive中如何查询使用多少个MapReduce作业?

3、查看数组、map、结构?



创建表:

hive>CREATETABLEpokes(fooINT,barSTRING);

Createsatablecalledpokeswithtwocolumns,thefirstbeinganintegerandtheotherastring

复制代码

创建一个新表,结构与其他一样

hive>createtablenew_tablelikerecords;

复制代码

创建分区表:

hive>createtablelogs(tsbigint,linestring)partitionedby(dtString,countryString);

复制代码

加载分区表数据:

hive>loaddatalocalinpath'/home/hadoop/input/hive/partitions/file1'intotablelogspartition(dt='2001-01-01',country='GB');

复制代码

展示表中有多少分区:

hive>showpartitionslogs;

复制代码

展示所有表:

hive>SHOWTABLES;

listsallthetableshive>SHOWTABLES'.*s';

listsallthetablethatendwith's'.ThepatternmatchingfollowsJavaregularexpressions.Checkoutthislinkfordocumentationhttp://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html
复制代码

显示表的结构信息

hive>DESCRIBEinvites;

showsthelistofcolumns

复制代码

更新表的名称:

hive>ALTERTABLEsourceRENAMETOtarget;

复制代码

添加新一列

hive>ALTERTABLEinvitesADDCOLUMNS(new_col2INTCOMMENT'acomment');

复制代码

删除表:

hive>DROPTABLErecords;

复制代码

删除表中数据,但要保持表的结构定义

hive>dfs-rmr/user/hive/warehouse/records;

复制代码

从本地文件加载数据:

hive>LOADDATALOCALINPATH'/home/hadoop/input/ncdc/micro-tab/sample.txt'OVERWRITEINTOTABLErecords;

复制代码

显示所有函数:

hive>showfunctions;

复制代码

查看函数用法:

hive>describefunctionsubstr;

复制代码

查看数组、map、结构

hive>selectcol1[0],col2['b'],col3.cfromcomplex;

复制代码

内连接:

hive>SELECTsales.*,things.*FROMsalesJOINthingsON(sales.id=things.id);

复制代码

查看hive为某个查询使用多少个MapReduce作业

hive>ExplainSELECTsales.*,things.*FROMsalesJOINthingsON(sales.id=things.id);

复制代码

外连接:

hive>SELECTsales.*,things.*FROMsalesLEFTOUTERJOINthingsON(sales.id=things.id);hive>SELECTsales.*,things.*FROMsalesRIGHTOUTERJOINthingsON(sales.id=things.id);hive>SELECTsales.*,things.*FROMsalesFULLOUTERJOINthingsON(sales.id
=things.id);

复制代码

in查询:Hive不支持,但可以使用LEFTSEMIJOIN

hive>SELECT*FROMthingsLEFTSEMIJOINsalesON(sales.id=things.id);

复制代码

Map连接:Hive可以把较小的表放入每个Mapper的内存来执行连接操作

hive>SELECT/*+MAPJOIN(things)*/sales.*,things.*FROMsalesJOINthingsON(sales.id=things.id);

复制代码

INSERTOVERWRITETABLE..SELECT:新表预先存在

hive>FROMrecords2>INSERTOVERWRITETABLEstations_by_yearSELECTyear,COUNT(DISTINCTstation)GROUPBYyear

>INSERTOVERWRITETABLErecords_by_yearSELECTyear,COUNT(1)GROUPBYyear

>INSERTOVERWRITETABLEgood_records_by_yearSELECTyear,COUNT(1)WHEREtemperature!=9999AND(quality=0ORquality=1ORquality=4ORquality=5ORquality=9)GROUPBYyear;

复制代码

CREATETABLE...ASSELECT:新表表预先不存在

hive>CREATETABLEtargetASSELECTcol1,col2FROMsource;

复制代码

创建视图:

hive>CREATEVIEWvalid_recordsASSELECT*FROMrecords2WHEREtemperature!=9999;

复制代码

查看视图详细信息:

hive>DESCRIBEEXTENDEDvalid_records;

复制代码

8.hive是否需要每个datanode都安装?

9.<property>

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

<value>uri1,uri2,...</value>//可配置多个
uri

<description>JDBC
connectstringforaJDBCmetastore</description>

</property>

这个配置的含义是什么?

10.当在Hadoop的HA环境中HiveServer安装在哪里比较合适?

11.每个DataNode上都已经安装了Hbase,是否都要安装Hive?



第8问回答:Hive的安装其实有两部分组成,一个是Server端、一个是客户端,所谓服务端其实就是Hive管理Meta的那个Hive,服务端可以装在任何节点上,可以是Namenode上也可以是Datanode的任意一个节点上,至于哪个节点做Hive的服务端,由自己决定,不过在Hadoop的HA环境里我想应该是在两个NameNode里都装成Hive的Server,并且hive.metastore.warehouse.dir
配置成hdfs://****,这样其他节点安装的Hive就都是客户端了,并且hive.metastore.uris值可以指向这两个NameNode的Ip.(仅代表个人理解,如果有不对的地方请多多指教)

主要属性解释:

hive.metastore.uris:指定hive元数据访问路径

hive.metastore.warehouse.dir:(HDFS上的)数据目录

hive.exec.scratchdir:(HDFS上的)临时文件目录

hive.metastore.warehouse.dir默认值是/user/hive/warehouse

hive.exec.scratchdir默认值是/tmp/hive-${user.name}

第9问回答:这个属性都配置在客户端,ip地址指向的是Hive服务端Ip地址,端口是默认的。
可以看到value可以指向多个ip,意思应该是多个HiveServer所在主机。(仅代表个人理解,不吝赐教)

第10问回答:个人认为安装在NameNode所在节点(假如集群有两个NameNode,那么两个NameNode都要安装)。

第11问回答:其实根据前面问题的回答,这个问题已经不需解释,这个问题的底层意思应该是说Hive数据的存储问题,比如Hbase在每个节点上都部署了,并且存储会根据数据的分裂存储在各个Datanode上,那么是不是没有安装Hive的DataNode上就无法存储Hive的数据?其实,Hive数据的存储是根据hive.metastore.warehouse.dir这个属性来配置,这个属性加入制定的是HDFS集群,那么Hive数据的存储已经指向了所有的DataNode了。

对于以上这些疑问已经纠结两天,这是我昨天在论坛的提问http://www.aboutyun.com/thread-10917-1-1.html;对于以上有说错的地方,请不吝赐教,以免误人子弟,谢谢!

下面分享个Hive三种配置的介绍,加深下概念的理解:

一、本地derby这种方式是最简单的存储方式,只需要在hive-site.xml做如下配置便可

<?xmlversion="1.0"?>

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

<configuration>

<property>

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

<value>jdbc:derby:;databaseName=metastore_db;create=true</value>

</property>

<property>

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

<value>org.apache.derby.jdbc.EmbeddedDriver</value>

</property>

<property>

<name>hive.metastore.local</name>

<value>true</value>

</property>

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive/warehouse</value>

</property>

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive/warehouse</value>

</property>

</configuration>

注:使用derby存储方式时,运行hive会在当前目录生成一个derby文件和一个

metastore_db目录。这种存储方式的弊端是在同一个目录下同时只能有一个hive客户端能使用数据库,否则会提示如下错误

hive>showtables;

FAILED:Errorinmetadata:javax.jdo.JDOFatalDataStoreException:Failedtostartdatabase'metastore_db',seethenextexceptionfordetails.

NestedThrowables:

java.sql.SQLException:Failedtostartdatabase'metastore_db',seethenextexceptionfordetails.

FAILED:ExecutionError,returncode1fromorg.apache.hadoop.hive.ql.exec.DDLTask

二、本地mysql这种存储方式需要在本地运行一个mysql服务器,并作如下配置(下面两种使用mysql的方式,需要将mysql的jar包拷贝到$HIVE_HOME/lib目录下)。

<?xmlversion="1.0"?>

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

<configuration>

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive_remote/warehouse</value>

</property>

<property>

<name>hive.metastore.local</name>

<value>true</value>

</property>

<property>

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

<value>jdbc:mysql://localhost/hive_remote?createDatabaseIfNotExist=true</value>

</property>

<property>

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

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

</property>

<property>

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

<value>hive</value>

</property>

<property>

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

<value>password</value>

</property>

</configuration>

三、远端mysql

这种存储方式需要在远端服务器运行一个mysql服务器,并且需要在Hive服务器启动meta服务。这里用mysql的测试服务器,ip位192.168.1.214,新建hive_remote数据库,字符集位latine1

<?xmlversion="1.0"?>

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

<configuration>

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive/warehouse</value>

</property>

<property>

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

<value>jdbc:mysql://192.168.1.214:3306/hive_remote?createDatabaseIfNotExist=true</value>

</property>

<property>

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

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

</property>

<property>

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

<value>hive</value>

</property>

<property>

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

<value>password</value>

</property>

<property>

<name>hive.metastore.local</name>

<value>false</value>

</property>

<property>

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

<value>thrift://192.168.1.188:9083</value>

</property>

</configuration>

注:这里把hive的服务端和客户端都放在同一台服务器上了。服务端和客户端可以拆开,将hive-site.xml配置文件拆为如下两部分

1)、服务端配置文件

<?xmlversion="1.0"?>

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

<configuration>

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive/warehouse</value>

</property>

<property>

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

<value>jdbc:mysql://192.168.1.214:3306/hive_remote?createDatabaseIfNotExist=true</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>test1234</value>

</property>

</configuration>

2)、客户端配置文件

<?xmlversion="1.0"?>

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

<configuration>

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive/warehouse</value>

</property>

<property>

<name>hive.metastore.local</name>

<value>false</value>

</property>

<property>

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

<value>thrift://192.168.1.188:9083</value>

</property>

</configuration>

启动hive服务端程序

$hive--servicemetastore

客户端直接使用hive命令即可

root@my188:~$hive

Hivehistoryfile=/tmp/root/hive_job_log_root_201301301416_955801255.txt

hive>showtables;

OK

test_hive

Timetaken:0.736seconds

hive>

问题重现1:

开始定义的url="jdbc:hive://master:10000/default";结果报如下错误:

java.sql.SQLException:Nosuitabledriverfoundforjdbc:hive://master:10000/default

atjava.sql.DriverManager.getConnection(DriverManager.java:596)

atjava.sql.DriverManager.getConnection(DriverManager.java:215)

atcom.berg.hive.test1.api.Test01Hive.getConn(Test01Hive.java:50)

atcom.berg.hive.test1.api.Test01Hive.main(Test01Hive.java:37)

问题1解决:

将url更改为:url="jdbc:hive2://master:10000/default";

问题1解决思路来源:

http://stackoverflow.com/questions/33722139/java-sql-sqlexception-no-suitable-driver-found-for-jdbchive-localhost10000

问题重现2:

org.apache.hive.service.cli.HiveSQLException:Failedtoopennewsession:

java.lang.RuntimeException:org.apache.hadoop.ipc.RemoteException

(org.apache.hadoop.security.authorize.AuthorizationException):User:hadoopisnotallowedtoimpersonatehive

atorg.apache.hive.jdbc.Utils.verifySuccess(Utils.java:258)

atorg.apache.hive.jdbc.Utils.verifySuccess(Utils.java:249)

atorg.apache.hive.jdbc.HiveConnection.openSession(HiveConnection.java:579)

atorg.apache.hive.jdbc.HiveConnection.<init>(HiveConnection.java:167)

atorg.apache.hive.jdbc.HiveDriver.connect(HiveDriver.java:107)

atjava.sql.DriverManager.getConnection(DriverManager.java:571)

atjava.sql.DriverManager.getConnection(DriverManager.java:215)

atcom.berg.hive.test1.api.Test01Hive.getConn(Test01Hive.java:50)

atcom.berg.hive.test1.api.Test01Hive.main(Test01Hive.java:38)

Causedby:org.apache.hive.service.cli.HiveSQLException:Failedtoopennewsession:

java.lang.RuntimeException:org.apache.hadoop.ipc.RemoteException

(org.apache.hadoop.security.authorize.AuthorizationException):User:hadoopisnotallowedto

impersonatehive

问题2解决:进入hadoop安装目录下,然后切换至etc/hadoop即hadoop-2.6.4/etc/hadoop,修改core-site.xml中文件内容,在原文件内容中添加:

<property>

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

<value>*</value>

</property>


<property>

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

<value>*</value>

</property>


如果你的是用neworigin用户访问,就改成:



<property>

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

<value>*</value>

</property>


<property>

<name>hadoop.proxyuser.[b]neworigin
.groups</name>

<value>*</value>

</property>[/b]

我的修改后是:

<configuration>

<property>[/code]
<name>
fs.defaultFS
</name>[/code]
<value>
hdfs://master:9000
</value>[/code]
</property>[/code]
<property>[/code]
<name>
hadoop.tmp.dir
</name>[/code]
<value>
file:/mysoftware/hadoop-2.6.4/tmp
</value>[/code]
</property>[/code]
<property>[/code]
<name>
hadoop.native.lib
</name>[/code]
<value>
false
</value>[/code]
</property>[/code]

<property>[/code]
<name>
hadoop.proxyuser.hadoop.hosts
</name>

<value>
*
</value>[/code]
</property>[/code]

<property>[/code]
<name>
hadoop.proxyuser.hadoop.groups
</name>[/code]
<value>
*
</value>[/code]
</property>[/code]
</configuration>

问题2思路解决来源:

http://stackoverflow.com/questions/16582126/getting-e0902-exception-occured-user-oozie-is-not-allowed-to-impersonate-ooz

另外几个链接:

1.重启mysql服务:

http://wwwlouxuemingcom.blog.163.com/blog/static/209747822013411103950266/

2.Couldnotopenconnectiontojdbc

http://stackoverflow.com/questions/31150678/java-sql-sqlexception-could-not-open-connection-to-jdbchive2-localhost10000

3.Unabletoinstantiateorg.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

http://stackoverflow.com/questions/35449274/java-lang-runtimeexception-unable-to-instantiate-org-apache-hadoop-hive-ql-meta
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hive
相关文章推荐