1. metastore是元数据服务,Metastore服务的作用是管理metadata元数据,metadata元数据存储在mysql数据库中,或内置的derby中。 metastore服务配置有3中模式: 内嵌模式,本地模式,远程模式。 a).内嵌模式: 元数据存储在内置的derby中,并且derby和metastore都嵌入到hiveserver进程中,不需要额外开启metastore服务。 一次值能支持一个活动用户。 b).本地模式:只是把derby改成了独立的mysql服务,但启动一个hive服务会一起内嵌启动一个metastore; c)、远程模式: 独立的mysql服务,独立的metastore服务; 2. hive需要hadoop上运行,所以hadoop中core-site.xml配置文件加上: <property> 3. 服务安装和配置 3.1 hive-site.xml中增加mysql的配置,指定metastore服务地址 3.2 同时执行bin/schematool -initSchema -dbType mysql -verbos 3.3 hive --service metastore 4. 客户端 4.1 bin/hive 第一代客户端 => metastore => mysql bin/beeline 第二代客户端 => hiveServer2 => metastore => mysql 4.2 使用beeline客户端 hive --service hiveServer2 启动hiveServer2服务 ! connect jdbc:hive2://node1:10000 4.3 idea工具 5. hive读写文件机制 5.1 SerDe: Serializer,Deserializer的简称,目的是用于序列号和反序列化 Read 反序列化: HDFS files => InputFileFormat -> <key,value> => Deserializer -> Row object Write 序列化: Row object ->Serializer -> <key,value> -> OutputFileFormat -> HDFS files 5.2 desc formatted tablename命令 5.3 在创建表的时候,有个 row format delimited | serde, 就是 delimited和serde二选其一。默认的分隔符是 ’\001'。 6. 加载静态分区 load data local inpath '/home/hadoop/data/emp.txt' overwrite into table emp partition(分区字段='分区值'); 7. 动态分区 set hive.exec.dynamic.partition=true; //是否开启动态分区功能 #指定动态分区模式,分为nonstrict非严格模式和strict严格模式; #strict模式要求至少有一个分区为静态分区 set hive.exec.dynamic.partition.mode=nonstrict; 8. 分桶表 8.1 CLUSTERED BY col_name SORTED BY col_name ASC INTO num_buckets BUCKETS; 8.2 set hive.enforce.bucketing=true; 8.3 分桶表数据,需要通过insert into table1 select * from table2来完成数据插入; 8.4 分桶规则是 hash_function(分桶字段)%num_buckets 8.5 分桶好处: join的字段对标进行分桶操作减少笛卡尔积数量 9. 数据倾斜-join 方案一: 提前过滤,将大数据变成小数据,实现mapjoin 方案二: 使用Bucket Join,如果使用方案一,过滤后数据依旧是大表,那么可以把两张表的数据构建成桶表,实现Bucket Map Join,避免数据倾斜; 方案三: 使用Skew Join,产生数据倾斜的使用Mapjoin,没产生数据倾斜的使用ReduceJoin 10. 自定义udf 10.1 上传udf的jar包:在hive2客户端,使用 add jar hive-udf-1.0-SNAPSHOT.jar; 10.2 create temporary function 函数名 as '类的包路径'; //临时函数 |
|