Hive 数据库仓库的基本操作

  1. 云栖社区>
  2. 博客>
  3. 正文

Hive 数据库仓库的基本操作

余二五 2017-11-15 09:27:00 浏览1869
展开阅读全文

CentOS下安装Hive2.0.0详解


本文环境如下:

操作系统:CentOS 6 32位

Hive版本:2.0.0

JDK版本:1.8.0_77 32位

Hadoop版本:2.6.4



1. 所需要的环境


Hive 2.0需要以下运行环境:

Java 1.7以上(强烈建议使用Java 1.8)

Hadoop 2.X


2. 下载、解压Hive安装包


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

例如:


wget "http://mirrors.cnnic.cn/apache/hive/hive-2.0.0/apache-hive-2.0.0-bin.tar.gz"

tar -xzvf apache-hive-2.0.0-bin.tar.gz

mv apache-hive-2.0.0-bin /opt/hive-2.0.0


3. 配置环境变量(可选)


将hive-2.0.0/bin添加到path,以方便访问


vi /etc/profile


在末尾添加:


HIVE_HOME=/opt/hive-2.0.0


PATH=$PATH:$HIVE_HOME/bin



4. 启动单机模式


Hive和Hadoop一样,有3种启动模式,分别是单机模式,伪分布模式,分布模式。


这里先来说一下单机模式的启动方式。


4.1 修改配置文件


cd /opt/hive-2.0.0/conf


vi hive-site.xml //也可以用hive-default.xml.template去改,不过这个文件中的配置项太多了


输入以下内容后保存:


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


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


<configuration>


<property>

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

    <value>/opt/hive-2.0.0/warehouse</value>

    <description>location of default database for the warehouse</description>

</property>


<property>

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

   <value>jdbc:derby:/opt/hive-2.0.0/metastore_db;create=true</value>

   <description>JDBC connect string for a JDBC metastore</description>

</property>


</configuration>


4.2 初始化数据库


schematool -initSchema -dbType derby


出现以下几行说明初始化成功:


Starting metastore schema initialization to 2.0.0

Initialization script hive-schema-2.0.0.derby.sql

Initialization script completed

schemaTool completed




4.3 启动程序


mkdir -p /opt/hive-2.0.0/warehouse       // 创建元数据存储文件夹


chmod a+rwx /opt/hive-2.0.0/warehouse    // 修改文件权限


hive


如果出现hive>提示符则说明启动成功


5. 常见错误


5.1 运行hive时出现


Exception in thread "main" java.lang.RuntimeException: Hive metastore database is not initialized. Please use schematool (e.g. ./schematool -initSchema -dbType ...) to create the schema. If needed, don't forget to include the option to auto-create the underlying database in your JDBC connection string (e.g. ?createDatabaseIfNotExist=true for mysql)

错误原因:  数据库没有初始化,请参照4.2


5.2 使用schematool初始化数据库时出现


Initialization script hive-schema-2.0.0.derby.sql

Error: FUNCTION 'NUCLEUS_ASCII' already exists. (state=X0Y68,code=30000)

org.apache.hadoop.hive.metastore.HiveMetaException: Schema initialization FAILED! Metastore state would be inconsistent !!



*** schemaTool failed ***

错误原因:数据库文件夹中已经存在一些文件,解决方法就是清空数据库文件夹

(也就是前面配置的/opt/hive-2.0.0/metastore_db文件夹)




环境要求:


mysql

hadoop


hive版本为:apache-hive-1.2.1-bin.tar


1.设置hive用户


进入mysql命令行,创建hive用户并赋予所有权限:

mysql -uroot -proot

mysql>create user 'hive' identified by 'hive';

mysql>grant all on *.* TO 'hive'@'%' with grant option;

mysql>flush privileges;

 


2.创建hive数据库


使用hive用户登录,创建hive数据库:

mysql -uhive -phive

mysql>create database hive;

mysql>show databases;

 

3.安装Hive


下载hive安装文件


可以到Apache基金hive官网http://hive.apache.org/downloads.html


选择镜像下载地址:http://mirrors.cnnic.cn/apache/hive/下载一个稳定版本,

 


把mysql驱动放到hive的lib目录下


把下载的hive安装包和mysql驱动包,使用


cd /home/hadoop/Downloads


cp mysql-connector-java-5.1.34-bin.jar   /usr/local/hive-0.12.0/lib

 


4.配置/etc/profile环境变量


使用如下命令打开/etc/profile文件:


sudo vi /etc/profile

 


#set hive path


export  HIVE_HOME=/usr/local/hive

export  PATH=$PATH:$HIVE_HOME/bin

export  CLASSPATH=$CLASSPATH:$HIVE_HOME/bin


使配置文件生效:

source /etc/profile



5.设置hive-env.sh配置文件


进入hive-0.12.0/conf目录,复制hive-env.sh.templaete为hive-env.sh:


cd /usr/local/hive-0.12.0/conf



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


vi hive-env.sh

 

分别设置HADOOP_HOME和HIVE_CONF_DIR两个值



6.设置hive-site.xml配置文件


复制hive-default.xml.templaete为hive-site.xml


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


sudo vi hive-site.xml


 

(1)加入配置项


默认metastore在本地,添加配置改为非本地  可以忽略此步


<property>

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

  <value>false</value>

</property>

 

(2) 修改配置项

hive默认为derby数据库,需要把相关信息调整为mysql数据库


<property>

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

  <value>thrift://hadoop1:9083</value>

  <description>Thrift URI for the remote metastore. ...</description>

</property>


<property>

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

  <value>jdbc:mysql://hadoop1:3306/hive?=createDatabaseIfNotExist=true</value>

  <description>JDBC connect string for a JDBC metastore</description>

</property>


<property>

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

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

  <description>Driver class name for a JDBC metastore</description>

</property>


<property>

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

  <value>hive</value>

  <description>username to use against metastore database</description>

</property>


<property>

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

  <value>hive</value>

  <description>password to use against metastore database</description>

</property>

 

 

(3) 订正错误项


在配置文件2000行左右配置项


hive.server2.thrift.sasl.qop原来为<value>auth</auth>,按照如下进行修改:


<property>

  <name>hive.server2.thrift.sasl.qop</name>

  <value>auth</value>

  <des.....

</property>

 

并把hive.metastore.schema.verification配置项值修改为false


<property>

  <name>hive.metastore.schema.verification</name>

  <value>false</value>

   <desc....>

</property>

 


7.验证部署


启动metastore和hiveserver


在使用hive之前需要启动metastore和hiveserver服务,通过如下命令启用



把MySQL的JDBC驱动包复制到Hive的lib目录下。


JDBC驱动包的版本:mysql-connector-java-5.1.18-bin.jar




以下也可以忽略


hive --service metastore &


hive --service hiveserver &

 

启动用通过jps命令可以看到两个进行运行在后台



8.在hive中操作


登录hive,在hive创建表并查看该表,命令如下:

hive

hive>create table test(a string, b int);

hive>show tables;

hive>desc test;



不能正常启动,处理方式为:


Terminal initialization failed; falling back to unsupported

 

原因是hadoop目录下存在老版本jline:

 

/hadoop-2.5.2/share/hadoop/yarn/lib:

-rw-r--r-- 1 root root   87325 Mar 10 18:10 jline-0.9.94.jar

  

解决方法是:

 

将hive下的新版本jline的JAR包拷贝到hadoop下:

cp /hive/apache-hive-1.1.0-bin/lib/jline-2.12.jar ./

  

/hadoop-2.5.2/share/hadoop/yarn/lib:

-rw-r--r-- 1 root root   87325 Mar 10 18:10 jline-0.9.94.jar.bak-rw-r--r-- 1 root root  213854 Mar 11 22:22 jline-2.12.jar




Hive 数据库仓库的基本操作



查看hive中的数据库

Show databases;


查看hive中的表

Show tables;


查看表结构信息

 DESCRIBE table_name;


创建表:

CREATE TABLE daxiong (id INT, name STRING);


创建一个新表daxiong1,结构与daxiong一样

Create table daxiong1 like daxiong;


创建分区表

create table logs(ts bigint,line string) partitioned by (dt String,country String);


加载表数据

(从linux(ext3/ext4文件系统到hive))

 


a文件之间是空格,b文件之间是tab键;一会看结果。


hive> create table ha(id int,name string)

    > row format delimited

    > fields terminated by '\\t'

    > stored as textfile;

OK

Time taken: 0.28 seconds


注:[ROW FORMAT DELIMITED]关键字,是用来设置创建的表在加载数据的时候,支持的列分隔符


[STORED AS file_format]关键字是用来设置加载数据的数据类型,默认是TEXTFILE,如果文件数据是纯


文本,就是使用 [STORED AS TEXTFILE],然后从本地直接拷贝到HDFS上,hive直接可以识别数据。




从HDFS上导入数据到Hive表    从linux上传到hdfs上:


load data inpath '/user/c' into table ha;


导出到本地文件系统


insert overwrite local directory  '/home/hdfs/d' select * from ha;



导出到HDFS中


insert overwrite directory  '/user/d select * from ha;


查看:


Hive连接hbase(数据传输)


建立一个表格classes具有1个列族user


create 'classes','user'


查看表的构造


describe 'classes‘


加入数据


put 'classes','001','user:name','jack'put 'classes','001','user:age','20' put 'classes','002','user:name','liza' put 'classes','002','user:age','18'


查看classes中的数据


scan 'classes'


创建外部hive表,查询验证:


create external table classes(id int, name string, age int)  STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,user:name,user:age")  TBLPROPERTIES("hbase.table.name" = "classes");


select * from classes;


再添加数据到Hbase


put 'classes','003','user:age','1820183291839132'


scan 'classes'


Hive查询,看看新数据


select * from classes;


null,因为3没有name,所以补位Null,而age为Null是因为超过最大值,截图中有验证



上述演示了在hbase中添加数据,在hive中就会产生新的数据,下面是在hive中创建hbase连接表,在hbase中就会自动生成一个与hive中同名的表,hive中表的数据发生变化,在hbse中也会发生同样的变化。 


spark集成hive


在 spark-env.sh中 添加:


export HIVE_CONF_DIR=/usr/hdp/2.2.8.0-3150/hive/conf

export SPARK_CLASSPATH=$SPARK_CLASSPATH:/usr/hdp/2.2.8.0-3150/hive/lib/mysql-connector-java.jar



hive 导入数据的四种方式



Hive的几种常见的数据导入方式

这里介绍四种:

(1)、从本地文件系统中导入数据到Hive表;

(2)、从HDFS上导入数据到Hive表;

(3)、从别的表中查询出相应的数据并导入到Hive表中;

(4)、在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中。



一、从本地文件系统中导入数据到Hive表


先在Hive里面创建好表,如下:


hive> create table wyp

    > (id int, name string,

    > age int, tel string)

    > ROW FORMAT DELIMITED

    > FIELDS TERMINATED BY '\t'

    > STORED AS TEXTFILE;

OK

Time taken: 2.832 seconds



这个表很简单,只有四个字段,具体含义我就不解释了。本地文件系统里面有个/home/wyp/wyp.txt文件,内容如下:

[wyp@master ~]$ cat wyp.txt

1       wyp     25      13188888888888

2       test    30      13888888888888

3       zs      34      899314121



wyp.txt文件中的数据列之间是使用\t分割的,可以通过下面的语句将这个文件里面的数据导入到wyp表里面,操作如下:


hive> load data local inpath 'wyp.txt' into table wyp;

Copying data from file:/home/wyp/wyp.txt

Copying file: file:/home/wyp/wyp.txt

Loading data to table default.wyp

Table default.wyp stats:

[num_partitions: 0, num_files: 1, num_rows: 0, total_size: 67]

OK

Time taken: 5.967 seconds



这样就将wyp.txt里面的内容导入到wyp表里面去了,可以到wyp表的数据目录下查看,如下命令:


hive> dfs -ls /user/hive/warehouse/wyp ;

Found 1 items

-rw-r--r--3 wyp supergroup 67 2014-02-19 18:23 /hive/warehouse/wyp/wyp.txt



需要注意的是:


和我们熟悉的关系型数据库不一样,Hive现在还不支持在insert语句里面直接给出一组记录的文字形式,也就是说,Hive并不支持INSERT INTO …. VALUES形式的语句。


二、HDFS上导入数据到Hive表


  从本地文件系统中将数据导入到Hive表的过程中,其实是先将数据临时复制到HDFS的一个目录下


(典型的情况是复制到上传用户的HDFS home目录下,比如/home/wyp/),然后再将数据从那个临时


目录下移动(注意,这里说的是移动,不是复制!)到对应的Hive表的数据目录里面。


既然如此,那么Hive肯定支持将数据直接从HDFS上的一个目录移动到相应Hive表的数据目录下,假设


有下面这个文件/home/wyp/add.txt,具体的操作如下:


[wyp@master /home/q/hadoop-2.2.0]$ bin/hadoop fs -cat /home/wyp/add.txt

5       wyp1    23      131212121212

6       wyp2    24      134535353535

7       wyp3    25      132453535353

8       wyp4    26      154243434355



上面是需要插入数据的内容,这个文件是存放在HDFS上/home/wyp目录(和一中提到的不同,一中提到的文件是存放在本地文件系统上)里面,我们可以通过下面的命令将这个文件里面的内容导入到Hive表中,具体操作如下:


hive> load data inpath '/home/wyp/add.txt' into table wyp;

Loading data to table default.wyp

Table default.wyp stats:

[num_partitions: 0, num_files: 2, num_rows: 0, total_size: 215]

OK

Time taken: 0.47 seconds


hive> select * from wyp;

OK

5       wyp1    23      131212121212

6       wyp2    24      134535353535

7       wyp3    25      132453535353

8       wyp4    26      154243434355

1       wyp     25      13188888888888

2       test    30      13888888888888

3       zs      34      899314121

Time taken: 0.096 seconds, Fetched: 7 row(s)



从上面的执行结果我们可以看到,数据的确导入到wyp表中了!请注意load data inpath 

‘/home/wyp/add.txt’ into table wyp;里面是没有local这个单词的,这个是和一中的区别。


三、从别的表中查询出相应的数据并导入到Hive表中


假设Hive中有test表,其建表语句如下所示:


hive> create table test(

    > id int, name string

    > ,tel string)

    > partitioned by

    > (age int)

    > ROW FORMAT DELIMITED

    > FIELDS TERMINATED BY '\t'

    > STORED AS TEXTFILE;

OK

Time taken: 0.261 seconds



大体和wyp表的建表语句类似,只不过test表里面用age作为了分区字段。


对于分区,这里在做解释一下:


分区:在Hive中,表的每一个分区对应表下的相应目录,所有分区的数据都是存储在对应的目录中


比如wyp表有dt和city两个分区,则对应dt=20131218,city=BJ对应表的目录


为/user/hive/warehouse/dt=20131218/city=BJ,所有属于这个分区的数据都存放在这个目录中。


下面语句就是将wyp表中的查询结果并插入到test表中:


hive> insert into table test  partition (age='25')  select id, name, tel  from wyp;

#####################################################################

           这里输出了一堆Mapreduce任务信息,这里省略

#####################################################################

Total MapReduce CPU Time Spent: 1 seconds 310 msec

OK

Time taken: 19.125 seconds


hive> select * from test;

OK

5       wyp1    131212121212    25

6       wyp2    134535353535    25

7       wyp3    132453535353    25

8       wyp4    154243434355    25

1       wyp     13188888888888  25

2       test    13888888888888  25

3       zs      899314121       25

Time taken: 0.126 seconds, Fetched: 7 row(s)


这里做一下说明:


我们知道我们传统数据块的形式insert into table values(字段1,字段2),这种形式hive是不支持的。


通过上面的输出,我们可以看到从wyp表中查询出来的东西已经成功插入到test表中去了!如果目标表(test)中不存在分区字段,可以去掉partition (age=’25′)语句。当然,我们也可以在select语句里面通过使用分区值来动态指明分区:


hive> set hive.exec.dynamic.partition.mode=nonstrict;


hive> insert into table test

    > partition (age)

    > select id, name,

    > tel, age

    > from wyp;

#####################################################################

           这里输出了一堆Mapreduce任务信息,这里省略

#####################################################################

Total MapReduce CPU Time Spent: 1 seconds 510 msec

OK

Time taken: 17.712 seconds



hive> select * from test;

OK

5       wyp1    131212121212    23

6       wyp2    134535353535    24

7       wyp3    132453535353    25

1       wyp     13188888888888  25

8       wyp4    154243434355    26

2       test    13888888888888  30

3       zs      899314121       34

Time taken: 0.399 seconds, Fetched: 7 row(s)



这种方法叫做动态分区插入,但是Hive中默认是关闭的,所以在使用前需要先把


hive.exec.dynamic.partition.mode设置为nonstrict。


当然,Hive也支持insert overwrite方式来插入数据,从字面我们就可以看出,overwrite是覆盖的意


思,是的,执行完这条语句的时候,相应数据目录下的数据将会被覆盖!而insert into则不会,注意两者


之间的区别。例子如下:


hive> insert overwrite table test

    > PARTITION (age)

    > select id, name, tel, age

    > from wyp;



更可喜的是,Hive还支持多表插入,什么意思呢?


在Hive中,我们可以把insert语句倒过来,把from放在最前面,它的执行效果和放在后面是一样的


如下:


hive> show create table test3;

OK

CREATE  TABLE test3(

  id int,

  name string)

Time taken: 0.277 seconds, Fetched: 18 row(s)


hive> from wyp

    > insert into table test

    > partition(age)

    > select id, name, tel, age

    > insert into table test3

    > select id, name

    > where age>25;


hive> select * from test3;

OK

8       wyp4

2       test

3       zs

Time taken: 4.308 seconds, Fetched: 3 row(s)



可以在同一个查询中使用多个insert子句,这样的好处是我们只需要扫描一遍源表就可以生成多个不相交的输出。这个很酷吧!


四、在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中


在实际情况中,表的输出结果可能太多,不适于显示在控制台上,这时候,将Hive的查询输出结果直接

存在一个新的表中是非常方便的,我们称这种情况为CTAS(create table .. as select)如下:


hive> create table test4

    > as

    > select id, name, tel

    > from wyp;


hive> select * from test4;

OK

5       wyp1    131212121212

6       wyp2    134535353535

7       wyp3    132453535353

8       wyp4    154243434355

1       wyp     13188888888888

2       test    13888888888888

3       zs      899314121

Time taken: 0.089 seconds, Fetched: 7 row(s)



数据就插入到test4表中去了,CTAS操作是原子的,因此如果select查询由于某种原因而失败,新表是不会创建的!



hive的mysql配置笔记


配置hive使用mysql数据库

------------------------

1.下载并加压hive.tar.gz

2.配置环境变量

HIVE_HOME=...

PATH=..:$HIVE_HOME/bin:$HIVE_HOME/conf


$>source /etc/environment

3.创建配置文件

$>cd conf

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

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

$ cp hive-exec-log4j.properties.template hive-execlog4j.properties

$ cp hive-log4j.properties.template hive-log4j.properties

4.修改conf/hive-env.sh配置文件

export HADOOP_HOME=/soft/hadoop

export HIVE_CONF_DIR=/soft/hive/conf

5.修改conf/hive-site.xml文件

hive.metastore.warehourse.dir=/user/hive/warehouse//hdfs系统

hive.exec.scratchdir=/tmp/hive-${user.name}//hdfs系统

6.配置使用mysql数据库

0.在mysql上创建myhive数据库

create database myhive ;

1.配置hive-ste.xml


[conf/hive-site.xml]

#javax.jdo.option.ConnectionURL // the database URL

#javax.jdo.option.ConnectionDriverName // the JDBC driver name

#javax.jdo.option.ConnectionUserName // database username

#javax.jdo.option.ConnectionPassword // database password


<property>

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

<value>jdbc:mysql://myhost:3306/myhive?createDatabaseIfNotExist=true</value>

<description>JDBC connect string for a JDBC metastore</description>

</property>


<property>

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

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

<description>Driver class name for a JDBC metastore</description>

</property>


<property>

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

<value>hive</value>

<description>username to use against metastore database</description>

</property>


<property>

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

<value>hive</value>

<description>password to use against metastore database</description>

</property>


7.复制mysql驱动程序到${hive_home}\lib下




hive的指令操作及内外临时表的创建


2、数据库: OLTP//online transaction process ,在线事务处理


3、drop databases  if exists  mybase//删除数据库


4、show tables//显示表


5、create  database  mybase//mysql 创建库


6、create table test(id int ,name varchar(20));//创建列表


7、select id from test        //查看表中的内容


8、两张表合成:select a.*,b.* form tbls a,columms_v2 b where a.tbl_id = b.tbl_id 


9、show databases;//显示数据库


10、在/soft/hive/bin/下执行:hive 后再执行:create database if not exists mybase;


11、用自己的库的话就执行:use mybase ;   ------>记得加分号

show tables; ——————》显示表信息


12、创建表:create table test(id int , name varchar(20));


13、查看表的结构:desc test


14、往数据库里面放数据:insert into test(id,name)values(1,'tom');


15、select * form test      //查看表中所有的内容




具体流程是:创建库:

create database mysbase ------>

用那个库use mybase  ------->

创建表create table test(id int ,name varchar(20))

-----------------------------------------------------


表的填写信息及创建语法:

1、create  table if not exists employee(edi int ,nam String,salary String, destination String)


2、comment ‘employee details’



4、 row format delimited  fields terminated by ‘\t’ //这行的格式分隔如何 :(1  tom  12 )


5、lines terminated by ‘\n’//换行1  tom  12

     2  tod  13


6、stored as textfile;  //存储为文本文件



dfs -lsr / ;//查看它们的目录结构


-------------------------------------------------------------------------------------------

desc[ribe] database mybase ;//查看数据库信息

alter database mybase set dbproperties ('created'='xpc');//修改数据库,增加数据库属性

desc database extended mybase ;//显示数据库扩展信息,不能格式化输出

desc extended default.test0 ;//显示表扩展信息

desc formatted default.test0 ;//显示表格式化信息

desc extended test ;//显示表的扩展信息

create database mybase location '/x/x/x/x'//指定数据库存放hdfs位置

create table default.test0 like mybase.test2 ;//复制表结构


load data local ...//上传本地文件到hdfs

load data '/x/x/x' into table xx//移动hdfs文件系统上的数据文件。

insert into mybase.test2 select * from default.test0 where id > 1204 ;//复制表数据


create table mybase.test3 as select * from default.test0 ;//复制表(表结构 + 数据)

select all id,name from test2 ;//查询所有记录(不去重)

select distinct id,name from test2 ;//查询所有记录(去重)


--------------------------------------------------------

拷贝一张已经存在的表模式

create table if ont exists mydb.employees2 like mydb.employees


-------------------------------------------


如何从本地插进文本文件:


load data local inpath '/home/user/sample.txt' overwrite into table tset;

----------------------------------------------------------

外部表的创建步骤:

1、create database mybase ;  //创建库

2、use  mybase  ;          //用库

3、create external table etest(id int ,name string,age int) row format delimited fields terminated by '\t' stored as textfile ;//创建外部表


4、查看表的参数: desc formatted etest ; 查看有 多少张表:show tables  看表的结构select * from etest ;


5、创建临时表create tempporary table temp(id int ,name string,age int) row format delimited fields terminated by '\t' stored as textfile ;


6、CTAS:create table as select 


7、truncate  :删除所有的行,只能用于内部的表


8、修改表分隔符:alter table table_name set serdeproperties (‘field,delimi’= ',')


9、修改表的位置:alter table 表名 set location 'hdfs:/xxx/x/表名'



分区表

------------

[手动分区--静态分区]

1.预先定义分区列和存储数据到表的子目录下。

2.创建分区表

create table xxx(...) partitioned by (year int ,month int) row format ...;


3.给分区表添加多个分区(手动分区)

alter table partest add partition (year=2016,month=4) partition (year=2016,month=5);

4.显示指定表的分区

show partitions partest ;

5.删除分区

ALTER TABLE partest DROP IF EXISTS PARTITION (year=2014, month=11);

6.加载数据到指定的分区目录下。

LOAD DATA LOCAL INPATH '..sample.txt' OVERWRITE INTO TABLE partest PARTITION (year=2016, month=4);

单是查询2016年4月份的数据:select * from  表名 where year=2016 and month = 4 ;


7.启动动态分区(默认是开启的)

SET hive.exec.dynamic.partition=true;//启动动态分区.

//默认是strict,是严格模式,至少要指定一个分区类,通过如下指令关闭严格模式。

SET hive.exec.dynamic.partition.mode=nonstrict;//设置分区模式,非严格.

8.测试动态分区

insert into table partest partition(year,month) select id,name,age,year,month from test ;



HADOOP的HA搭建


进入到执行:/soft/hadoop-2.7.1/etc/hadoop_cluster$ gedit hdfs-site.xml

[配置部分]

[hdfs-site.xml]


  1. 配置名称服务:dfs.nameservices


名称服务的逻辑名。


<property>

  <name>dfs.nameservices</name>

  <value>mycluster</value>

</property>


2.配置nameservice中每个namenode


dfs.ha.namenodes.[nameservice ID]

<property>

  <name>dfs.ha.namenodes.mycluster</name>

  <value>nn1,nn2</value>

</property>


注意:目前的hadoop2.7.2最多只能配置2个namenode。


3.配置每个namede的rpc地址


<property>

  <name>dfs.namenode.rpc-address.mycluster.nn1</name>

  <value>s1:8020</value>

</property>

<property>

  <name>dfs.namenode.rpc-address.mycluster.nn2</name>

  <value>s8:8020</value>

</property>


4.配置每个namenode的webui地址


<property>

  <name>dfs.namenode.http-address.mycluster.nn1</name>

  <value>machine1.example.com:50070</value>

</property>

<property>

  <name>dfs.namenode.http-address.mycluster.nn2</name>

  <value>machine2.example.com:50070</value>

</property>


5.配置namenode的共享edit log目录


<property>

  <name>dfs.namenode.shared.edits.dir</name>

  <value>qjournal://s1:8485;s7:8485;s8:8485/mycluster</value>

</property>

 

6.配置客户端容灾代理供应商类


供客户端用来检测那个是namenode是活页节点。

<property>

  <name>dfs.client.failover.proxy.provider.mycluster</name>

  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>

7.(可选的)配置HA防护方法名集合.

QJM防止脑裂发生,不存在两个active node。

可以配置sshfence或者shell脚本。


8.配置hdfs的文件系统


[core-site.xml]

<property>

  <name>fs.defaultFS</name>

  <value>hdfs://mycluster</value>

</property>


9.配置JN的本地存放数据(edit log)的目录


<property>

  <name>dfs.journalnode.edits.dir</name>

  <value>/home/ubuntu/hadoop/journal</value>

</property>

 

2、把core-site.xml文件的客户机名改成如下再颁发给每个虚拟机:<property>

  <name>fs.defaultFS</name>

  <value>hdfs://mycluster</value>

 

3、然后回到hdfs-site.xml里面把<property>

  <name>fs.defaultFS</name>

  <value>hdfs://mycluster</value>

</property>删掉。同样颁发给每个虚拟机

 

4、接下来启动jn进程即:hadoop-daemon.sh starat journalnode

(我是在s1、s7和s8上分别启动journalnode进程。我一共八台虚拟机)

 

5、将s1的hadoop目录下的 dfs拷贝到s8中。即执行:scp -r dfs ubuntu@s8:/home/ubuntu/hadoop

 

6、在开启一个namenode节点的情况下,登录:ssh s8的虚拟机上执行hdfs namenode -bootstrapStandby

 

7、再停止namenode节点,然后 在s1虚拟机上执行:hdfs namenode -initializeSharedEdits

 

8、分别在s1和s8上启动namenode即:执行hadoop-daemno.sh start namenode

 

9、最后启动所有的数据节点:hadoop-daemons.sh start datanode (hadoop-daemons.sh是启动所有的节点)

 

管理ha过程

 

1、手动完成状态切换:

hdfs haadmin -transitionToActive nn1

hdfs haadmin -transitionToStandbby nn1



列出所有Hadoop Shell支持的命令


bin/hadoop fs -help 

(注:一般手动安装hadoop大数据平台,只需要创建一个用户即可,所有的操作命令就可以在这个用户下执行;现在是使用ambari安装的dadoop大数据平台,安装过程中会自动创建hadoop生态系统组件的用户,那么就可以到相应的用户下操作了,当然也可以在root用户下执行。下面的图就是执行的结果,只是hadoop shell 支持的所有命令,详细命令解说在下面,因为太多,我没有粘贴。)


显示关于某个命令的详细信息 


bin/hadoop fs -help command-name

(注:可能有些命令,不知道什么意思,那么可以通过上面的命令查看该命令的详细使用信息。例子:


这里我用的是hdfs用户。)  

注:上面的两个命令就可以帮助查找所有的haodoop命令和该命令的详细使用资料。

创建一个名为 /daxiong 的目录 


$ bin/hadoop dfs -mkdir /daxiong


查看名为 /daxiong/myfile.txt 的文件内容  


$ bin/hadoop dfs -cat /hadoop dfs -cat /user/haha/part-m-00000


上图看到的是我上传上去的一张表,我只截了一部分图。

注:hadoop fs <..> 命令等同于 hadoop dfs <..> 命令(hdfs fs/dfs)

显示Datanode列表

$ bin/hadoop dfsadmin -report


$ bin/hadoop dfsadmin -help 命令能列出所有当前支持的命令。比如:

l       -report:报告HDFS的基本统计信息。

注:有些信息也可以在NameNode Web服务首页看到

运行HDFS文件系统检查工具(fsck tools)

用法:hadoop fsck [GENERIC_OPTIONS] <path> [-move | -delete | -openforwrite] [-files [-blocks [-locations | -racks]]]

命令选项描述

<path> 检查的起始目录。

-move 移动受损文件到/lost+found

-delete 删除受损文件。

-openforwrite 打印出写打开的文件。

-files 打印出正被检查的文件。

-blocks 打印出块信息报告。

-locations 打印出每个块的位置信息。

-racks 打印出data-node的网络拓扑结构。

打印版本信息

用法:hadoop version


运行集群平衡工具。管理员可以简单的按Ctrl-C来停止平衡过程(balancer)

用法:hadoop balancer [-threshold <threshold>]


命令选项描述

-threshold <threshold> 磁盘容量的百分比。这会覆盖缺省的阀值。

官网详解


FS Shell

调用文件系统(FS)Shell命令应使用 bin/hadoop fs <args>的形式。所有的的FS shell命令使用URI路径作为参数。URI格式是scheme://authority/path。对HDFS文件系统,scheme是hdfs,对本地文件系统,scheme是file。其中scheme和authority参数都是可选的,如果未加指定,就会使用配置中指定的默认scheme。一个HDFS文件或目录比如/parent/child可以表示成hdfs://namenode:namenodeport/parent/child,或者更简单的/parent/child(假设你配置文件中的默认值是namenode:namenodeport)。大多数FS Shell命令的行为和对应的Unix Shell命令类似,不同之处会在下面介绍各命令使用详情时指出。出错信息会输出到stderr,其他信息输出到stdout。

cat

使用方法:hadoop fs -cat URI [URI …]

将路径指定文件的内容输出到stdout。

示例:

hadoop fs -cat hdfs://host1:port1/file1 hdfs://host2:port2/file2

hadoop fs -cat file:///file3 /user/hadoop/file4

返回值:

成功返回0,失败返回-1。

chgrp

使用方法:hadoop fs -chgrp [-R] GROUP URI [URI …] Change group association of files. With -R, make the change recursively through the directory structure. The user must be the owner of files, or else a super-user. Additional information is in thePermissions User Guide. -->

改变文件所属的组。使用-R将使改变在目录结构下递归进行。命令的使用者必须是文件的所有者或者超级用户。更多的信息请参见HDFS权限用户指南。

chmod

使用方法:hadoop fs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI …]

改变文件的权限。使用-R将使改变在目录结构下递归进行。命令的使用者必须是文件的所有者或者超级用户。更多的信息请参见HDFS权限用户指南。

chown

使用方法:hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI ]

改变文件的拥有者。使用-R将使改变在目录结构下递归进行。命令的使用者必须是超级用户。更多的信息请参见HDFS权限用户指南。

copyFromLocal

使用方法:hadoop fs -copyFromLocal <localsrc> URI

除了限定源路径是一个本地文件外,和put命令相似。

copyToLocal

使用方法:hadoop fs -copyToLocal [-ignorecrc] [-crc] URI <localdst>

除了限定目标路径是一个本地文件外,和get命令类似。

cp

使用方法:hadoop fs -cp URI [URI …] <dest>

将文件从源路径复制到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。 

示例:

hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2

hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir

返回值:

成功返回0,失败返回-1。

du

使用方法:hadoop fs -du URI [URI …]

显示目录中所有文件的大小,或者当只指定一个文件时,显示此文件的大小。

示例:

hadoop fs -du /user/hadoop/dir1 /user/hadoop/file1 hdfs://host:port/user/hadoop/dir1 

返回值:

成功返回0,失败返回-1。 

dus

使用方法:hadoop fs -dus <args>

显示文件的大小。

expunge

使用方法:hadoop fs -expunge

清空回收站。请参考HDFS设计文档以获取更多关于回收站特性的信息。

get

使用方法:hadoop fs -get [-ignorecrc] [-crc] <src> <localdst> 

复制文件到本地文件系统。可用-ignorecrc选项复制CRC校验失败的文件。使用-crc选项复制文件以及CRC信息。

示例:

hadoop fs -get /user/hadoop/file localfile

hadoop fs -get hdfs://host:port/user/hadoop/file localfile

返回值:

成功返回0,失败返回-1。

getmerge

使用方法:hadoop fs -getmerge <src> <localdst> [addnl]

接受一个源目录和一个目标文件作为输入,并且将源目录中所有的文件连接成本地目标文件。addnl是可选的,用于指定在每个文件结尾添加一个换行符。

ls

使用方法:hadoop fs -ls <args>

如果是文件,则按照如下格式返回文件信息:

文件名 <副本数> 文件大小修改日期修改时间权限用户ID 组ID 

如果是目录,则返回它直接子文件的一个列表,就像在Unix中一样。目录返回列表的信息如下:

目录名 <dir> 修改日期修改时间权限用户ID 组ID 

示例:

hadoop fs -ls /user/hadoop/file1 /user/hadoop/file2 hdfs://host:port/user/hadoop/dir1 /nonexistentfile 

返回值:

成功返回0,失败返回-1。 

lsr

使用方法:hadoop fs -lsr <args> 

ls命令的递归版本。类似于Unix中的ls -R。

mkdir

使用方法:hadoop fs -mkdir <paths> 

接受路径指定的uri作为参数,创建这些目录。其行为类似于Unix的mkdir -p,它会创建路径中的各级父目录。

示例:

hadoop fs -mkdir /user/hadoop/dir1 /user/hadoop/dir2

hadoop fs -mkdir hdfs://host1:port1/user/hadoop/dir hdfs://host2:port2/user/hadoop/dir

返回值:

成功返回0,失败返回-1。

movefromLocal

使用方法:dfs -moveFromLocal <src> <dst>

输出一个”not implemented“信息。

mv

使用方法:hadoop fs -mv URI [URI …] <dest>

将文件从源路径移动到目标路径。这个命令允许有多个源路径,此时目标路径必须是一个目录。不允许在不同的文件系统间移动文件。 

示例:

hadoop fs -mv /user/hadoop/file1 /user/hadoop/file2

hadoop fs -mv hdfs://host:port/file1 hdfs://host:port/file2 hdfs://host:port/file3 hdfs://host:port/dir1

返回值:

成功返回0,失败返回-1。

put

使用方法:hadoop fs -put <localsrc> ... <dst>

从本地文件系统中复制单个或多个源路径到目标文件系统。也支持从标准输入中读取输入写入目标文件系统。

hadoop fs -put localfile /user/hadoop/hadoopfile

hadoop fs -put localfile1 localfile2 /user/hadoop/hadoopdir

hadoop fs -put localfile hdfs://host:port/hadoop/hadoopfile

hadoop fs -put - hdfs://host:port/hadoop/hadoopfile 

从标准输入中读取输入。

返回值:

成功返回0,失败返回-1。

rm

使用方法:hadoop fs -rm URI [URI …]

删除指定的文件。只删除非空目录和文件。请参考rmr命令了解递归删除。

示例:

hadoop fs -rm hdfs://host:port/file /user/hadoop/emptydir

返回值:

成功返回0,失败返回-1。

rmr

使用方法:hadoop fs -rmr URI [URI …]

delete的递归版本。

示例:

hadoop fs -rmr /user/hadoop/dir

hadoop fs -rmr hdfs://host:port/user/hadoop/dir

返回值:

成功返回0,失败返回-1。

setrep

使用方法:hadoop fs -setrep [-R] <path>

改变一个文件的副本系数。-R选项用于递归改变目录下所有文件的副本系数。

示例:

hadoop fs -setrep -w 3 -R /user/hadoop/dir1

返回值:

成功返回0,失败返回-1。

stat

使用方法:hadoop fs -stat URI [URI …]

返回指定路径的统计信息。

示例:

hadoop fs -stat path

返回值:

成功返回0,失败返回-1。

tail

使用方法:hadoop fs -tail [-f] URI

将文件尾部1K字节的内容输出到stdout。支持-f选项,行为和Unix中一致。

示例:

hadoop fs -tail pathname

返回值:

成功返回0,失败返回-1。

test

使用方法:hadoop fs -test -[ezd] URI

选项:

-e 检查文件是否存在。如果存在则返回0。

-z 检查文件是否是0字节。如果是则返回0。 

-d 如果路径是个目录,则返回1,否则返回0。

示例:

hadoop fs -test -e filename

text

使用方法:hadoop fs -text <src> 

将源文件输出为文本格式。允许的格式是zip和TextRecordInputStream。

touchz

使用方法:hadoop fs -touchz URI [URI …] 

创建一个0字节的空文件。

 

总结:hadoop的命令和linux上的命令基本一样,只是需要在hdfs文件系统上执行。


spark 集群简单配置


一、配置环境变量:

export SPARK_HOME=/usr/hdp/2.2.8.0-3150/spark-1.6.1-bin-hadoop2.6

PATH=$PATH:${SPARK_HOME}/bin

export PATH


二、配置环境:

vi ./conf/spark-env.sh

export JAVA_HOME=/usr/java/jdk1.8.0_73

export SPARK_MASTER_IP=192.168.1.101

export SPARK_WORKER_CORES=2    #当前节点的cpu使用个数

export SPARK_WORKER_MEMORY=1g   #当前节点的内存

export HADOOP_CONF_DIR=/usr/hdp/2.2.8.0-3150/hadoop/etc/hadoop


三、配置节点地址:


vi ./conf/slaves


添加:


192.168.1.101

192.168.1.102

192.168.1.103


四、启动查看:

sbin/start-all.sh


集群页面:192.168.1.103:8080

各个节点的页面地址:192.168.1.101:8081,192.168.1.102:8081,192.168.1.103:8081

Hadoop配置安装

一、配置虚拟机三台


1.网络配置


虚拟化软件: Vmware Workstations  10.7z

Linux系统:  Centos 6.5-x86_64



采用4台安装Linux环境的机器来构建一个小规模的分布式集群。

wKioL1caB6GTPJdWAACjJ08qKpg989.png

集群机器详细信息

wKiom1caBzqQuGtWAAAg7TrAz7c278.png


  1. 虚拟化的网络配置方式:桥接网络


2.IP地址设置为固定IP地址


3.主机名配置,需要修改一下地方


(1)配置vi  /etc/hostname


wKioL1caCCSgnjDGAAAOVoY1mZo451.png

 

(2)配置vi /etc/sysconfig/network


wKiom1caB3CBVNshAAAYSJP7Mvo857.png

 

(3)配置vi /etc/hosts

wKioL1caCEvAI1qFAAAdaSBCqzU423.png

4.关闭防火墙


1) 重启后生效 


开启: chkconfig iptables on 

关闭: chkconfig iptables off 



2) 即时生效,重启后失效 


开启: service iptables start 

关闭: service iptables stop 


配置完成后效果:


    三个节点相互ping通

    主机名可以正常解析

    可以正常ping通外网

wKioL1caCPaTvMyCAABIeFEhy2w305.png

2. JAVA系统环境配置


Java的安装   


Rpm  -qa| grep  java     查看系统已安装的java


卸载已安装的java


 rpm -e –nodeps   (包名称)



配置环境变量 vi /etc/profile


#set java environment

export  JAVA_HOME=/usr/java/jdk1.8.0_77

export  JRE_HOME=/usr/java/jdk1.8.0_77/jre

export  CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH

export  PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH


配置完成后效果为:

wKiom1caCGHyJd5fAAAf48Z-JKQ416.png


二、Hadoop配置安装



本文档的Hadoop版本为:hadoop-2.6.4.tar.gz


1.在Namenode节点上进行以下配置


下载 Hadoop 以后,可以操作Hadoop集群以以下三个支持模式之一:


本地/独立模式:下载Hadoop在系统中,默认情况下之后,它会被配置在一个独立的模式,用于运行Java程序。


模拟分布式模式:这是在单台机器的分布式模拟。Hadoop守护每个进程,如 hdfs, yarn, MapReduce 等,都将作为一个独立的java程序运行。这种模式对开发非常有用.


完全分布式模式:这种模式是完全分布式的最小两台或多台计算机的集群。我们使用这种模式在未来的章节中。




(1)文件 core-site.xml 改为下面的配置


<property>

    <name>fs.default.name</name>

    <value>hdfs://192.168.1.220:9000</value>

</property>


<property>

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

    <value>192.168.1.220</value>

</property>


<property>

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

    <value>*</value>

</property>


(2)文件 hdfs-site.xml改为下面的配置


<property>

    <name>dfs.name.dir</name>

    <value>/usr/hadoop/name</value>

</property>


<property>

    <name>dfs.data.dir</name>

    <value>/usr/hadoop/data</value>

</property>


<property>

    <name>dfs.replication</name>

    <value>2</value>

</property>


<property>

    <name>dfs.support.append</name>

    <value>true</value>

</property>


<property>

    <name>dfs.datanode.address</name>

    <value>0.0.0.0:50110</value>

</property>



(3)文件 mapred-site.xml 改为下面的配置


<property>

     <name>mapred.job.tracker</name>

     <value>http://192.168.1.220:9001</value>

</property>


<property>

    <name>mapried.local.dir</name>

    <value>/usr/hadoop/var</value>

</property>



(4)文件slaves改为下面的配置


Master-Hadoop


Slave1-Hadoop


Slave2-Hadoop



(5)文件hadoop-env.sh改为下面的配置


# The java implementation to use.


export JAVA_HOME=/usr/java/jdk1.8.0_77



2.在/usr/hadooop/下创新配置中的文件夹


Mkdir  tmp

Mkdir  logs

Mkdir  data





3.hadoop命令操作

(1)使用命令  hdfs namenode –format  如下设置名称节点


(2)启动命令  /usr/Hadoop/etc/Hadoop/start-all.sh


(3)查看节点状态  Hadoop  dfsadmin  -report

wKiom1caCcbRBdnBAAAfYijr5KI557.png


常用Hadoop命令:


hadoop dfs -mkdir /tmp/input                   在HDFS上新建文件夹


hadoop dfs -put input1.txt /tmp/input    把本地文件input1.txt传到HDFS的/tmp/input目录下


Hadoop dfs -get  input1.txt /tmp/input/input1.txt    把HDFS文件拉到本地


hadoop dfs -ls /tmp/output                    列出HDFS的某目录


hadoop dfs -cat /tmp/ouput/output1.txt            查看HDFS上的文件


hadoop dfs -rmr /home/less/hadoop/tmp/output        删除HDFS上的目录


hadoop dfsadmin -report        查看HDFS状态,比如有哪些datanode,每个datanode的情况


hadoop dfsadmin -safemode leave                离开安全模式


hadoop dfsadmin -safemode enter                进入安全模式



hadoop jar  /usr/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar  wordcount /usr/input /usr/output











本文转自 chengxuyonghu 51CTO博客,原文链接:http://blog.51cto.com/6226001001/1909688,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
余二五
+ 关注