Hive是一个基于hadoop的数据仓库分析系统,Hive的原数据是存在配好的数据库里,hive的数据存在在HDFS的warehouse目录下,一个表对应一个子目录。
本地的/tmp目录存放日志和执行计划
hive的表分为两种,内表和外表。
Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。
在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
Hadoop是将大量数据进行分布式处理的软件框架
Namenode管理原数据的,维护文件系统树,这些信息有两个镜像文件(namespace imge),日志文件(edit log)。
如果存储在namenode节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低。因此,元数据需要存放在内存中。但如果只存在内存中,一旦断点,元数据丢失,整个集群就无法工作了!!!因此必须在磁盘中有备份,在磁盘中的备份就是fsImage,存放在namenode节点对应的磁盘中。
每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到edits.log中。这样,一旦namenode节点断电,可以通过fsImage和edits.log的合并,合成元数据。需要定期进行fsImage和edits.log的合并,引入一个新的节点secondaryNamenode,专门用于fsImage和edits.log的合并。
为什么hdfs不适合存小文件:
小文件过多,会过多占用namenode的内存,并浪费block。
在HDFS中,namenode将文件系统中的元数据存储在内存中,因此,HDFS所能存储的文件数量会受到namenode内存的限制。
hadoop:hdfs上传文件的流程:
① 由客户端 向 NameNode节点节点 发出请求
②NameNode 向Client返回可以可以存数据的 DataNode
③客户端 首先 根据返回的信息 先将 文件分块
④然后通过那么Node返回的DataNode信息 直接发送给DataNode 并且是 流式写入 同时 会复制到其他两台机器
⑤dataNode 向 Client通信 表示已经传完 数据块 同时向NameNode报告
⑥依照上面(④到⑤)的原理将 所有的数据块都上传结束 向 NameNode 报告 表明 已经传完所有的数据块
hiveserver2中创建一个表格
CREATE TABLE tb_student2(id int,name varchar(20),sex varchar(2),age int) partitioned by(parsex string) clustered by(age) sorted by(age desc) into 5 buckets row format delimited fields terminated by ',';
load data inpath("user/hadoop/score.csv") into table student_python5,移动到hadoop,hive,warehouse下
如果是load data localhost下是复制
load data inpath("user/hadoop/score.csv") into table student_python5,报错的话,在表名后面加partition(parsex=’nan’)分区;还报错的话更改:
set hive.mapred.mode=nonstrict;
set hive.strict.checks.bucketing=false;
复制一个空表:
Create table student_lili Like lili;
Show tables ‘.*s’;匹配任意字符的次数
动态加载数据到分区表:INSERT INTO TABLE t13 partition(year=2018,month) SELECT id,name,month FROM t12 WHERE year=2018;
在spark下连接hive,
cd opt/spark-2.2.1-bin-hadoop2.7/conf
在复制一个通道 cd opt/apache-hive-2.3.3-bin/conf,复制这个的路径到cd opt/spark-2.2.1-bin-hadoop2.7/conf下
cp /home/hadoop/opt/apache-hive-2.3.3-bin/conf/hive-site.xml hive-site.xml
cd..再进入到sbin>>启动start-thriftserver.sh>>>之前要都启动start-all.sh
如果有异常:进入到日记里cd..[spark-2.2.1-bin-hadoop2.7目录下]>>cd logs>>ll>>>打开cat 第一个文件
然后cp/home/hadoop/opt/apache-hive-2.3.3-bin/lib/mysql-connector-java-5.1.38.jar mysql-connector-java-5.1.38.jar
进入spark下,vi hive-site.xml中,查找:hive.metastore.schema.verification,将true改为false。
重启start-thriftserver.sh
Hive中order by,sort by,distribute by,cluster by的区别
order by会对输入做全局排序,因此只有一个Reducer(多个Reducer无法保证全局有序),然而只有一个Reducer,会导致当输入规模较大时,消耗较长的计算时间。
sort by不是全局排序,其在数据进入reducer前完成排序,因此,如果用sort by进行排序,并且设置mapred.reduce.tasks>1,则sort by只会保证每个reducer的输出有序,并不保证全局有序。sort by不同于order by,它不受Hive.mapred.mode属性的影响,sort by的数据只能保证在同一个reduce中的数据可以按指定字段排序。使用sort by你可以指定执行的reduce个数(通过set mapred.reduce.tasks=n来指定),对输出的数据再执行归并排序,即可得到全部结果。
distribute by是控制在map端如何拆分数据给reduce端的。hive会根据distribute by后面列,对应reduce的个数进行分发,默认是采用hash算法。sort by为每个reduce产生一个排序文件。在有些情况下,你需要控制某个特定行应该到哪个reducer,这通常是为了进行后续的聚集操作。distribute by刚好可以做这件事。因此,distribute by经常和sort by配合使用。
cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是倒叙排序,不能指定排序规则为ASC或者DESC。
on条件与where条件的区别
on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。