Hadoop2.x辅助框架(一)数据转换工具sqoop

一、sqoop的作用:实现数据在HDFS 和RDBMS之间进行导入导出

    1、要想将存储在Oracle、MySQL等关系型数据库上的数据上传到HDFS时 ,可以使用sqoop将表中数据抽取到HDFS。

    2、一般情况下,使用Flume搜集的实时数据是被存储到HDFS上的。可以将其导出到RDBMS.

二、sqoop的底层:sqoop本质上运行的还是mapreduce程序,它利用并行批处理的方式来加快数据的传输速度。并且具有容错性。

    1、sqoop通过mapreduce进行导入时会从表中一行行的读取记录并将其存入HDFS中。其读取过程如下:

Hadoop2.x辅助框架(一)数据转换工具sqoop

        (1)第一步,Sqoop会通过JDBC来获取所需要的数据库元数据,例如,导入表的列名,数据类型等。

        (2)第二步,这些数据库的数据类型(varchar, number等)会被映射成Java的数据类型(String, int等),根据这些信息,Sqoop会生成一个与表名同名的类用来完成反序列化工作,保存表中的每一行记录。

        (3)第三步,Sqoop启动MapReducer作业

        (4)第四步,启动的作业在input的过程中,会通过JDBC读取数据表中的内容,这时,会使用Sqoop生成的类进行反序列化操作

        (5)第五步,最后将这些记录写到HDFS中,在写入到HDFS的过程中,同样会使用Sqoop生成的类进行序列化

    由于整个数据的导入过程是由多个Map任务并行导入的,那就必须对表进行水平切分,切分列的数据分布会很大程度上会影响性能,如果在均匀分布的情况下,性能最好。在最坏的情况下,数据严重倾斜,所有数据都集中在某一个切分区中,那么此时的性能与串行导入性能没有差别,所以在导入之前,有必要对切分列的数据进行抽样检测,了解数据的分布。(参考文献:https://blog.****.net/sunnyyoona/article/details/53151019)。

    2、容错性见https://blog.****.net/yfkiss/article/details/17614721

三、sqoop的使用

    1、直接使用,如下图,在sqoop的bin文件夹下启动sqoop通过指定参数就可以直接进行导入和导出(导出需要在RDBMS中先建立表格)。

           a sqoop使用三要素
                --connect jdbc:mysql://master:3306 \    连接的url
                --username root \ 数据库的用户名

                --password 123456            数据库的密码

           b 使用范例 注意斜杠之前一定要有空格否则会报错 如果要将表格在直接导入到hive中的话需要先建表 


                 ---从mysql导入数据到hdfs

                bin/sqoop import \
                --connect jdbc:mysql://master:3306/test \
                --username root \
                --password 123456 \
                --table my_user \
                --num-mappers 1 \
                --target-dir /sqoop/input \
                --fields-terminated-by "\t" \
                --check-column id \
                --incremental append \

                --last-value 4     --从id为5的数据开始进行导入


                ---从mysql导入数据到hive表中(需要现在数据库test中建立表格h_user)
                bin/sqoop import \
                --connect jdbc:mysql://master:3306/test \
                --username root \
                --password 123456 \
                --table my_user \
                --num-mappers 1 \
                --fields-terminated-by "\t" \
                --delete-target-dir \
                --hive-database test \
                --hive-import \
                --hive-table h_user


        

    Hadoop2.x辅助框架(一)数据转换工具sqoop

    2、可以将sqoop命令选项写在文件,通过【--options-file】指定文件从而运行程序。    

        a vi job1.opt

        b 在文件job1.opt中写入

                export
                --connect
                jdbc:mysql://master:3306/test
                --username
                root
                --password
                123456
                --table
                user_export     
                --num-mappers
                1
                --input-fields-terminated-by
                "\t"
                --export-dir
                /user/hive/warehouse/test.db/h_user

        c 执行 bin/sqoop --options-file ./job1.opt

注:使用sqoop 导入导出数据必须启动所有的守护进程