Hive自定义函数(UDF)
------------------------------
1、UDF(User Defined Function)用户自定义函数
2、自定UDF函数的步骤
-》创建maven工程,在pom.xml文件添加hive依赖
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.2.1</version>
</dependency>
-》编写代码
- 1.首先一定要继承UDF类
- 2.方法名一定要写 evalulate,其他方法名Hive是调用不到的
-》导出jar包,并上传到linux上
-》进入到hive的命令行,把my_udf.jar和hive做关联
add jar /opt/datas/my_udf.jar;
-》创建hive的自定义函数
create temporary function my_udf_test as 'com.bigdata.hive.udf.MyHiveUDF';
-》验证函数是否创建成功
show functions;
-》验证UDF函数功能
select name,my_udf_test(name,1) upper_name from hadoop31.stu_info;
Hive远程服务HiveServer2讲解
-------------------------------
1、三种连接Hive的方式
-》CLI(Command Line Interface):bin/hive
-》HiveServer2服务
-》HWI(Hive Web Interface)
2、使用场景
3、使用hiveserver2服务的步骤
-》首先,要启动hiveserver2服务。命令是:bin/hiveserver2
-》接下来,启动beeline命令:bin/beeline
-》在beeline命令行中连接hiveserver2服务
beeline> !connect jdbc:hive2://bd-server1:10000 #按回车键之后输入用户名和密码即可登录
-》第二种登录hiveserver2的方式
beeline> !connect jdbc:hive2://bd-server1:10000 coder 123456
-》第三种登录hiveserver2的方式
bin/beeline -u jdbc:hive2://bd-server1:10000 -n coder -p 123456
-》注意事项:hiveserver2不开启密码验证,所以密码可以省略
Java客户端使用代码远程连接Hive
------------------------------------
1、官方文档:https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-JDBC
2、在java代码里连接hiveserver2失败的原因
-》检查hiveserver2服务是否启动
-》检查url拼写是否正确
Hive Fetch运行模式
--------------------------
1、Fetch配置参数:
<property>
<name>hive.fetch.task.conversion</name>
<value>more</value>
<description>
Expects one of [none, minimal, more].
Some select queries can be converted to single FETCH task minimizing latency.
Currently the query should be single sourced not having any subquery and should not have
any aggregations or distincts (which incurs RS), lateral views and joins.
0. none : disable hive.fetch.task.conversion
1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only
2. more : SELECT, FILTER, LIMIT only (support TABLESAMPLE and virtual columns)
</description>
</property>
none:无论执行什么SQL语句都会被编译成mapreduce程序,然后提交给YARN运行。(禁用Fetch模式)
minimal:当使用select *、基于分区列的过滤查询、limit 语句时,SQL语句不会被编译成mapreduce程序
more:当使用select、filter、limit 语句时,不会被编译成mapreduce程序
2、虚拟列(virtual columns)
-》官方文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VirtualColumns
-》INPUT__FILE__NAME
- 功能:查询表数据时,会显示数据来源于哪一个文件
- 示例:select id,name,INPUT__FILE__NAME from stu_info;
-》BLOCK__OFFSET__INSIDE__FILE
- 功能:查询表数据时,会显示每行数据在文件中相对于文件起始位置的字节偏移量
- 示例:select id,name,BLOCK__OFFSET__INSIDE__FILE from stu_info;
CDH版本介绍及其环境搭建部署
----------------------------------
1、CDH版本介绍
-》下载地址:http://archive.cloudera.com/cdh5/cdh/5/
2、Hadoop版本介绍
-》Apache原生版本
-》Cloudera发行版(CDH),免费
-》Hortonworks发行版(HDP),免费
-》MapR
-》华为发行版(收费)
-》Intel发行版(收费)
3、【扩展】Apache原生版本和第三方发行版本优劣势
https://blog.csdn.net/xiangxizhishi/article/details/75711242
4、CDH版本快速部署
-》hadoop环境搭建
- 首先,上传软件包到linux
- 创建/opt/cdh5目录,并修改权限
sudo mkdir cdh5
sudo chown coder:coder cdh5/
- 解压 hadoop-2.6.0-cdh5.14.2.tar.gz 压缩包到/opt/cdh5目录下
tar -zxvf hadoop-2.6.0-cdh5.14.2.tar.gz -C /opt/cdh5/
- 配置 hadoop-env.sh、mapred-env.sh、yarn-env.sh ,修改JAVA_HOME地址
- 配置 core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml
- 配置 slaves
- 替换native本地库
$ tar -zxvf hadoop-2.6.0-cdh5.14.2-native-snappy.tar.gz -C /opt/cdh5/hadoop-2.6.0-cdh5.14.2/lib
-》hive环境搭建
- 解压hive-1.1.0-cdh5.14.2.tar.gz到/opt/cdh5/目录下
$ tar -zxvf hive-1.1.0-cdh5.14.2.tar.gz -C /opt/cdh5/
- 创建/tmp和/user/hive/warehouse目录,给目录用户组赋予写权限
$ bin/hdfs dfs -mkdir /tmp
$ bin/hdfs dfs -mkdir -p /user/hive/warehouse
$ bin/hdfs dfs -chmod g+w /tmp
$ bin/hdfs dfs -chmod g+w /user/hive/warehouse
- 配置hive-env.sh
HADOOP_HOME=/opt/cdh5/hadoop-2.6.0-cdh5.14.2
export HIVE_CONF_DIR=/opt/cdh5/hive-1.1.0-cdh5.14.2/conf
- 配置hive-site.xml(拷贝apache版本的)
# 一定要重新修改下元数据的名称
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://bd-server1/cdh_metastore?createDatabaseIfNotExist=true</value>
</property>
- 配置hive的日志目录(hive-log4j.properties)
hive.log.dir=/opt/cdh5/hive-1.1.0-cdh5.14.2/logs
- 导入mysql驱动jar包
$ cp mysql-connector-java-5.1.34-bin.jar /opt/cdh5/hive-1.1.0-cdh5.14.2/lib/
大数据协作框架sqoop介绍
-------------------------------------
1、sqoop是一款数据转换工具,可以将 关系型数据库中的数据 和 HDFS上的数据 之间进行相互的转换
mysql -> hdfs
mysql -> hive
mysql -> hbase
hdfs -> mysql
2、sqoop不是分布式应用,选择一台节点进行解压,稍作配置即可使用
3、sqoop有2个版本
-》sqoop1:在企业中,大部分公司都是使用sqoop1,用起来方便
-》sqoop2:类似hiveserver2和beeline,企业中用的较少
4、sqoop底层调用的是mapreduce程序
-》回顾 mapreduce 计算模型:input -> map() -> shuffle -> reduce() -> output
-》sqoop仅仅是做数据转换(迁移),用不到计算,所以不需要reduce阶段,shuffle阶段也不存在了
-》sqoop仅用到了 input -> map() -> output 这三个阶段
-》input读取源端数据,经过map() 处理之后,把数据输出到目标端
sqoop环境搭建与部署
----------------------------
1、解压sqoop-1.4.6-cdh5.14.2.tar.gz压缩包到/opt/cdh5目录下
$ tar -zxvf sqoop-1.4.6-cdh5.14.2.tar.gz -C /opt/cdh5/
2、配置 conf/sqoop-env.sh 文件,修改内容如下:
export HADOOP_COMMON_HOME=/opt/cdh5/hadoop-2.6.0-cdh5.14.2
export HADOOP_MAPRED_HOME=/opt/cdh5/hadoop-2.6.0-cdh5.14.2
export HIVE_HOME=/opt/cdh5/hive-1.1.0-cdh5.14.2
3、拷贝相关jar文件到sqoop的lib目录下
-》拷贝mysql驱动jar包
-》拷贝 HIVE_HOME/lib/hive-common-1.1.0-cdh5.14.2.jar
-》拷贝 HIVE_HOME/lib/hive-exec-1.1.0-cdh5.14.2.jar
-》拷贝 java-json.jar
4、测试环境
-》测试通过sqoop连接mysql数据库
bin/sqoop list-databases --connect jdbc:mysql://bd-server1:3306 --username root --password 123456
-》sqoop命令通常格式
bin/sqoop list-databases
--connect jdbc:mysql://bd-server1:3306
--username root
--password 123456
sqoop import命令的基本操作
-------------------------------
#在 MYSQL 里创建 sqoop_test 库
create database sqoop_test;
#在 sqoop_test 库下建 to_hdfs 表
create table to_hdfs(
id int primary key not null,
name varchar(20) not null
);
#向to_hdfs插入测试数据
insert into to_hdfs value(1, 'zhangsan');
insert into to_hdfs value(2, 'lisi');
insert into to_hdfs value(3, 'wangwu');
insert into to_hdfs value(4, 'zhaoliu');
insert into to_hdfs value(5, 'dongqi');
#将to_hdfs表的数据导入到HDFS
bin/sqoop import
--connect jdbc:mysql://bd-server1:3306/sqoop_test
--username root
--password 123456
--table to_hdfs
#指定数据导入到HDFS的目录
bin/sqoop import
--connect jdbc:mysql://bd-server1:3306/sqoop_test
--username root
--password 123456
--table to_hdfs
--target-dir '/to_hdfs'
#指定map task的数量为1
bin/sqoop import
--connect jdbc:mysql://bd-server1:3306/sqoop_test
--username root
--password 123456
--table to_hdfs
--target-dir '/to_hdfs2'
--num-mappers 1
#指定导入数据的分隔符为制表符 (--fields-terminated-by)
bin/sqoop import
--connect jdbc:mysql://bd-server1:3306/sqoop_test
--username root
--password 123456
--table to_hdfs
--target-dir '/to_hdfs3'
--num-mappers 1
--fields-terminated-by ' '
#参数讲解
--fields-terminated-by:数据从mysql转换到hdfs时使用(使用import)
--input-fields-terminated-by:数据从hdfs转换到mysql时使用(使用export)
#将hdfs上存在的output目录删除掉(使用 --delete-target-dir 参数)
bin/sqoop import
--connect jdbc:mysql://bd-server1:3306/sqoop_test
--username root
--password 123456
--table to_hdfs
--target-dir '/to_hdfs'
--num-mappers 1
--fields-terminated-by ' '
--delete-target-dir
#快速模式(--direct)
bin/sqoop import
--connect jdbc:mysql://bd-server1:3306/sqoop_test
--username root
--password 123456
--table to_hdfs
--target-dir '/to_hdfs'
--num-mappers 1
--fields-terminated-by ' '
--delete-target-dir
--direct
sqoop import增量导入
-----------------------------
1、参数讲解
--check-column <column> # 指定检查列,依据检查列判断一行数据是否已经导入过
--incremental <import-type> # 导入模式:追加 和 最后修改值
--last-value <value> # 指定最后一行的检查列的值,大于这个值的行才会被导入
2、增量导入示例
bin/sqoop import
--connect jdbc:mysql://bd-server1:3306/sqoop_test
--username root
--password 123456
--table to_hdfs
--target-dir '/to_hdfs'
--num-mappers 1
--fields-terminated-by ' '
--direct
--check-column id
--last-value 5
--incremental 'append'
#lastmodified的使用场景,是针对表里的数据被修改过,也需要同步的情况
datetime
id name timestamp
1 zhangsan 2019-10-19 16:28:34
2 lisi 2019-10-18 16:00:00
--check-column timestamp
--last-value '2019-10-19 00:00:00'
--incremental 'lastmodified'
HDFS三大缺陷
-----------------------------
1、hdfs上的文件不支持修改
2、hdfs不支持多用户的并发写入
3、hdfs不适合存储大量的小文件(128MB)
把mysql表里的数据直接导入到hive表
-------------------------------------------
1、在hive里创建一张表
create table student(
id int,
name string
)
row format delimited fields terminated by ' ';
2、sqoop import语句
bin/sqoop import
--connect jdbc:mysql://bd-server1:3306/sqoop_test
--username root
--password 123456
--table to_hdfs
--num-mappers 1
--fields-terminated-by ' '
--direct
--hive-import
--hive-database default
--hive-table student
--delete-target-dir
sqoop export基本操作
----------------------------------------------
1、功能:把hdfs数据导出到关系型数据库(mysql)
2、首先,在mysql里创建from_hive表
create table from_hive(
id int primary key not null,
name varchar(20) not null
);
3、sqoop export语句
bin/sqoop export
--connect jdbc:mysql://bd-server1:3306/sqoop_test
--username root
--password 123456
--table from_hive
--export-dir '/user/hive/warehouse/student'
--num-mappers 1
--input-fields-terminated-by ' '