接下来讲Sqoop,Flume,Oozie,Hue。这几个小东西在我初学大数据的时候就了给我坚持的理由,为什么呢?因为简单啊!?当然我这话是针对于使用以及对框架的认识。大佬勿喷。话不多少直接进入主题–Sqoop。
Hadoop协作框架
为什么我们需要使用各种协作框架来进行开发?存在即合理!对于下面的一个需求,是我们使用这些框架的最佳例子。
大数据最常见的一个应用就是企业需要对日志类型的海量数据进行分析
- 我们需要 hdfs存储文件
- mr处理文件清洗数据 , hive - hql分析数据
抛出三个问题:
- 第一个问题
hdfs的文件来源哪里?
现实数据来源两个方面
* RDBMS(Oracle,MySQL,DB2…) -> sqoop(SQL to HADOOP)
* 文件(apache,nginx日志数据) -> Flume(实时抽取数据)
第二个问题
对数据的分析任务Job,至少都是上千(互联网公司)如何调度?
什么执行,多长执行一次,执行频率
某一些业务的分析,需要许多job任务共同完成,相互依赖关系 ,工作流如何调度呢 ?–>Oozie
第三个问题
hadoop 2.x生态系统中重要的框架,如何进行监控?
统一WEB UI界面,管理框架,监控框架—>Hue
Sqoop
Sqoop:SQL-to-Hadoop
sqoop 是 apache 旗下一款“Hadoop 和关系数据库服务器之间传送数据”的工具。本质就是迁移数据, 迁移的方式:就是把sqoop的迁移命令转换成MR程序。这也是Sqoop的底层原理。
-
连接传统关系型数据库和Hadoop的桥梁
-
把关系型数据库的数据导入到Hadoop与其相关的系统(如HBase和Hive)中
-
把数据从Hadoop系统里抽取并导出到关系型数据库里
-
利用MapReduce加快数据传输速度
-
批处理方式进行数据传输
Sqoop核心的功能有两个: -
导入
-
导出
导入数据:MySQL,Oracle 导入数据到 Hadoop 的 HDFS、HIVE、HBASE 等数据存储系统
导出数据:从 Hadoop 的文件系统中导出数据到关系数据库 mysql 等 Sqoop 的本质还是一个命令行工具,和 HDFS,Hive 相比,并没有什么高深的理论。
Sqoop配置使用
配置
修改配置文件
Sqoop的底层是交给MR在执行,所以它的配置非常简单,只需要指订HCH,HMH(简写)就ok!
使用
注意:需要把 mysql-connector-java-5.1.27-bin.jar 放到sqoop的lib目录下面。
解释:sqoop在运行时会产生java代码,代码的内容实质上就是就是往数据库中插入数据。
查看帮助
./sqoop help xx
usage: sqoop list-tables [GENERIC-ARGS] [TOOL-ARGS]
Common arguments:
--connect <jdbc-uri> Specify JDBC connect
string
--connection-manager <class-name> Specify connection manager
class name
--connection-param-file <properties-file> Specify connection
parameters file
--driver <class-name> Manually specify JDBC
driver class to use
--hadoop-home <hdir> Override
$HADOOP_MAPRED_HOME_ARG
--hadoop-mapred-home <dir> Override
$HADOOP_MAPRED_HOME_ARG
--help Print usage instructions
-P Read password from console
--password <password> Set authentication
password
--password-alias <password-alias> Credential provider
password alias
--password-file <password-file> Set authentication
password file path
--relaxed-isolation Use read-uncommitted
isolation for imports
--skip-dist-cache Skip copying jars to
distributed cache
--username <username> Set authentication
username
--verbose Print more information
while working
?查看有哪些数据库
./sqoop list-databases --connect jdbc:mysql://192.168.1.205:3306 --username root --password root
Sqoop命令的三个核心参数
bin/sqoop list-databases
–connect jdbc:mysql://master:3306/数据库名
–username root
–password root
导入导出核心内容:
数据导入流程
- 得到表的元数据
- 提交map任务
例子?
bin/sqoop import \
--connect jdbc:mysql://master:3306/test \
--username root \
--password root \
--table my_user
注意:不指定写出目录的话,在hdfs的当前用户目录下面。
bin/sqoop import \
--connect jdbc:mysql://master:3306/test \
--username root \
--password root \
--table my_user \
--target-dir /user/sqoop/imp_my_user \
--num-mappers 1
设置map个数为1 。target-dir指定导入数据到 /user/sqoop/imp_my_user 目录下。
此场景为MySQL-----> HDFS
控制文件格式
前面提过数据存储格式
-
textfile
-
orcfile
-
parquet
例子? // 导入到hdfs使用parquet文件存储格式i bin/sqoop import \ --connect jdbc:mysql://master:3306/test \ --username root \ --password 123456 \ --table my_user \ --target-dir /user/sqoop/imp_my_user_parquet \ --fields-terminated-by ',' \ --num-mappers 1 \ --as-parquetfile // 指定列导入 bin/sqoop import \ --connect jdbc:mysql://master:3306/test \ --username root \ --password root \ --table my_user \ --target-dir /user/sqoop/imp_my_user_column \ --num-mappers 1 \ --columns id,account * 在实际的项目中,通常需要处理的数据,需要在导入数据时进行初步清洗和过滤。 例子? bin/sqoop import \ --connect jdbc:mysql://master:3306/test \ --username root \ --password 123456 \ --query 'select id, account from my_user where $CONDITIONS' \ --target-dir /user/sqoop/imp_my_user_query \ --num-mappers 1 注意:使用query时,必须指定where语句(where $CONDITIONS')如果你有其他条件,你可以and连接。 >>>>>>>>>>>>>>>>>import hdfs : compress >>>>>>>>>>>>>>>>>>、 前提:压缩库你得配置编译源码Snappy bin/sqoop import \ --connect jdbc:mysql://master:3306/test \ --username root \ --password 123456 \ --table my_user \ --target-dir /user/sqoop/imp_my_sannpy \ --delete-target-dir \ --num-mappers 1 \ --compress \ --compression-codec org.apache.hadoop.io.compress.SnappyCodec \ --fields-terminated-by '\t' >>>>>>>>>>>>>>>>>import hdfs increment>>>>>>>>>>>>>>>>>> 增量数据的导入 有一个唯一标识符,通常这个表都有一个字段,类似于插入时间createtime Incremental import arguments: --check-column <column> Source column to check for incremental change --incremental <import-type> Define an incremental import of type 'append' or 'lastmodified' --last-value <value> Last imported value in the incremental check column 例子? bin/sqoop import \ --connect jdbc:mysql://master:3306/test \ --username root \ --password 123456 \ --table my_user \ --target-dir /user/sqoop/imp_my_incr \ --num-mappers 1 \ --incremental append \ --check-column id \ --last-value 4 这里指定了 last-value意思是导入的数据从4开始生效。 1 xx 2 oo 3 pp 4 qq 5 xx 实际导入的是 5 xx >>>>>>>>>>>>>>>>>import hdfs direct 直接从mysql导出数据(就是快点)>>>>>>>>>>>>>>>>>> bin/sqoop import \ --connect jdbc:mysql://master:3306/test \ --username root \ --password 123456 \ --table my_user \ --target-dir /user/sqoop/imp_my_incr \ --num-mappers 1 \ --delete-target-dir \ --direct
导出数据流程
>>>>>>>>>>>>>>>>>导出Mysql表到文件系统 >>>>>>>>>>>>>>>>>>
例子?
bin/sqoop export \
--connect jdbc:mysql://master:3306/test \
--username root \
--password 123456 \
--table my_user \
--export-dir /user/sqoop/exp/user/ \
--num-mappers 1
>>>>>>>>>>>>>>>>>导入到Hive >>>>>>>>>>>>>>>>>>
例子?
bin/sqoop import \
--connect jdbc:mysql://master:3306/test \
--username root \
--password 123456 \
--table my_user \
--fields-terminated-by '\t' \
--delete-target-dir \
--num-mappers 1 \
--hive-import \
--hive-database default \
--hive-table user_hive
>>>>>>>>>>>>>>>>>导出到Hive >>>>>>>>>>>>>>>>>>
bin/sqoop export \
--connect jdbc:mysql://master:3306/test \
--username root \
--password 123456 \
--table my_user2 \
--export-dir /user/hive/warehouse/user_hive \
--num-mappers 1 \
--input-fields-terminated-by '\t'
就把数据目的地换成了Hive表在HDFS上的位置。
执行文件
sqoop也支持类似与Hive的sql脚本执行功能。
总结
sqoop没有过多高深的东西,说了那么多核心内容也就如下图,下图能掌握就OK了。