一、场景描述
上一篇博客研究了不用sqoop将mysql中的数据导入到hive中,发现有一定的局限性,数据量较少还好,要是数据表过多,就显的很繁琐,所有我想简化这个步骤,利用sqoop来导入。
毕竟 sqoop(SQL-to-Hadoop)是前辈们专门研究出来的,用于关系数据库与非关系数据库之间做数据传输的。
因为我的hadoop环境是自己安装的,目前还没有sqoop环境,所以我需要先安装sqoop环境,下面做一个详细的介绍,从sqoop的安装,到将mysql数据导入到hive的详细全过程。
二、sqoop1.4.7安装
1、sqoop就是一个工具, 只需要在一个节点上进行安装即可。
如果你的Sqoop工具要与Hive、Hbase等系统或者MySQL进行交互,你安装的Sqoop软件的节点一定要包含以上你要使用的集群或者软件系统的安装包
因为我只安装了mysql,hive,暂时还没有安装Hbase,所以在下面配置好环境变量 用sqoop version查看sqoop版本时会有错误信息(不影响sqoop的正常使用,下文会介绍解决方式)。
2、下载安装包
Sqoop安装包下载地址:http://mirrors.hust.edu.cn/apache/sqoop/1.4.7/版本说明
sqoop-1.4.6 与 sqoop-1.4.7 是 sqoop1
sqoop-1.99.4—-是 sqoop23、安装过程
上传解压安装包
#将sqoop安装包上传到linux的某个目录下
[root@hadoop01 ]#cd /opt/sqoop/ [root@hadoop01 sqoop]# rz #解压 [root@hadoop01 sqoop]# tar -zxvf sqoop-1.4.7.bin__hadoop2.6.0.tar.gz #重命名 [root@hadoop01 sqoop]# mv sqoop-1.4.7.bin__hadoop-2.6.0 sqoop-1.4.7
修改sqoop的sqoop-env.sh配置文件
#注意:没有此文件,需拷贝sqoop-env-template.sh重命名为sqoop-env.sh [root@hadoop01 sqoop]# cd /opt/app/Sqoop/sqoop-1.4.7/conf/ [root@hadoop01 sqoop]# cp sqoop-env-template.sh sqoop-env.sh [root@hadoop01 sqoop]# vim sqoop-env.sh #添加以下内容,注意hive与hadoop需要修改成你自己的 export HIVE_HOME=/opt/apps/Hive/hive-2.3.3 export HADOOP_COMMON_HOME=/opt/apps/Hadoop/hadoop-2.7.6 export HADOOP_MAPRED_HOME=/opt/apps/Hadoop/hadoop-2.7.6
上传mysql的驱动包到sqoop的lib目录
注意:这里的mysql驱动包,可以去安装的hive的lib目录下去寻找,在hive/lib目录下,利用命令:ll mysql* ,找到驱动包,再利用命令:cp 该驱动包 /opt/sqoop/sqoop-1.4.7/lib/
配置环境变量[root@hadoop01 lib]# vim /etc/profile #添加以下内容 #Sqoop环境变量,注意需要改成自己的 export SQOOP_HOME=/opt/sqoop/sqoop-1.4.7 export PATH=$PATH:$SQOOP_HOME/bin #使配置生效 [root@hadoop01 lib]# source /etc/profile
验证环境变量配置是否成功
[root@hadoop01 lib]# sqoop version #成功出现下面信息 18/08/15 20:31:50 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7 Sqoop 1.4.7 git commit id 2328971411f57f0cb683dfb79d19d4d19d185dd8 Compiled by maugli on Thu Dec 21 15:59:58 STD 2017
我的这里显示如下:
其中Warning代表未安装的东西,这个网址可以解决https://blog.csdn.net/weixin_43716338/article/details/106752816解决思路是找到那个配置文件,以此将这四个hbase、hcatalog、accumulo、zookeeper等注释掉就可以,这里我选择不注释,因为不影响sqoop 的使用,当然有强迫症的小伙伴可以去注释一下。
这里我选择不解决,后面依次安装这些软件[root@hadoop01 ~]# sqoop version Warning: /opt/sqoop/sqoop-1.4.7/../hbase does not exist! HBase imports will fail. Please set $HBASE_HOME to the root of your HBase installation. Warning: /opt/sqoop/sqoop-1.4.7/../hcatalog does not exist! HCatalog jobs will fail. Please set $HCAT_HOME to the root of your HCatalog installation. Warning: /opt/sqoop/sqoop-1.4.7/../accumulo does not exist! Accumulo imports will fail. Please set $ACCUMULO_HOME to the root of your Accumulo installation. Warning: /opt/sqoop/sqoop-1.4.7/../zookeeper does not exist! Accumulo imports will fail. Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation. 21/02/06 09:57:18 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7 Sqoop 1.4.7 git commit id 2328971411f57f0cb683dfb79d19d4d19d185dd8 Compiled by maugli on Thu Dec 21 15:59:58 STD 2017
验证sqoop连接mysql数据库是否成功
[root@master lib]# sqoop list-databases --connect jdbc:mysql://192.168.200.200:3306/?useSSL=false --username root --password root
显示如下信息表示连接成功:其中information_schema、bda_date202101、db_hive、db_study_function、mysql、performance_schema、sys都是我在root用户下面创建的数据库
[root@hadoop01 sqoop]# sqoop list-databases --connect jdbc:mysql://192.168.200.200:3306/?useSSL=false --username root --password root Please set $ZOOKEEPER_HOME to the root of your Zookeeper installation. 21/02/06 13:52:43 INFO sqoop.Sqoop: Running Sqoop version: 1.4.7 21/02/06 13:52:43 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead. 21/02/06 13:52:44 INFO manager.MySQLManager: Preparing to use a MySQL streaming resultset. information_schema bda_date202101 db_hive db_study_function mysql performance_schema sys [root@hadoop01 sqoop]#
三、将mysql数据导入hive
第一步:将mysql中的bda_date202101数据库下面的policies_regulations表的所有字段导入到hdfs中的/tmp/nanjing/policies_regulations目录下
注意:连接mysql为:--connect jdbc:mysql://192.168.200.200:3306/?useSSL=false \
导入所有字段查询语句后面必须加上where $CONDITIONS,否则会报错:--query 'select * from bda_date202101.policies_regulations where $CONDITIONS ' \
hdfs存储目录为:--target-dir /tmp/nanjing/policies_regulations \
从mysql中导入到hive需要加上--direct \,加了 direct 属性在导出mysql数据库表中的数据会快一点 执行的是mysq自带的导出功能
下面是完整的导出代码:bin/sqoop import \ --connect jdbc:mysql://192.168.200.200:3306/?useSSL=false \ --username root \ --password root \ --query 'select * from bda_date202101.policies_regulations where $CONDITIONS ' \ --target-dir /tmp/nanjing/policies_regulations \ --delete-target-dir \ --num-mappers 1 \ --compress \ --compression-codec org.apache.hadoop.io.compress.SnappyCodec \ --direct \ --fields-terminated-by '\t'
第二步:启动hive,在hive中创建表,注意创建的字段必须与mysql的policies_regulations相对应。
注意:fields terminated by '\t' 这里的'\t' 要与导出代码--fields-terminated-by '\t'的'\t'相对应
LOCATION的路径与导出到hdfs的路径一样时,创建好表之后不需要load就可以在表中查询到数据,如果不同需要load一下。下面是hive中的建表语句:
create external table policies_regulations( `id` string comment '自增id', `document_issuing` string comment '发文机关', `policies_name` string comment '法规名称', `create_date` string comment '成文日期', `execute_date` string comment '发文日期(施行时间)', `policies_item` string comment '法规内容', `update_date` string comment '更新时间' ) comment '政策法规表' row format delimited fields terminated by '\t' lines terminated by '\n' stored as textfile LOCATION '/tmp/nanjing/policies_regulations';
第三步:将hdfs中的数据导入到hive中,如果建表语句中的LOCATION路径与导出路径相同,则不需要这步,直接查询即可
注意:因为我的路径一样,所以在执行下面语句之前我查询了一下数据:hive> select count(*) from policies_regulations; 显示有943条
执行完下面语句后,再次查询:hive> select count(*) from policies_regulations; 显示有943条,这里执行后不会在数据后面追加,
由此可以推断出:其hive查询原理就是读取hdfs的/tmp/nanjing/policies_regulations目录下的policies_regulations文件。执行load只是将文件加载到表里面。下面是将hdfs中的数据load进hive的代码:
load data inpath '/tmp/nanjing/policies_regulations' into table db_data.policies_regulations;
在hive中查询结果:
hive> select * from policies_regulations limit 1; OK 1 国务院办公厅 国务院办公厅关于进一步做好困难群众基本生活保障有关工作的通知 2021年01月18日 2021年01月21日 加强对已脱贫人口和边缘人口的监测排查,确保社会救助兜底保障不遗漏。对经济困难的高龄、失能、独居(留守)老年人和孤儿、事实无人抚养儿童、农村留守儿童、流浪乞讨人员、残疾人、精神障碍患者等特殊困难群众,开展巡访探访,提供针对性帮扶和关爱服务。保障特困人员供养服务机构基本运转,做好有集中供养意愿且生活不能自理特困人员的集中供养工作。 NULL Time taken: 0.158 seconds, Fetched: 1 row(s) hive>