导入表数据到 HDFS
下面的命令用于从MySQL数据库服务器中的表导入HDFS
--m
表示跑这个任务需要多少个map
这边mysql指定hostname或者ip,不要用localhost,否则会出现连接错误,因为他是调用mapreduce处理的,多个机器
表数据如下:命令如下:
sqoop import \
--connect jdbc:mysql://master:3306/duanjc \
--username root \
--password 123456 \
--table vehicle_name --m 1
执行结果如下:
2022-02-12 18:07:15,093 INFO mapreduce.Job: map 0% reduce 0%
2022-02-12 18:07:33,307 INFO mapreduce.Job: map 100% reduce 0%
2022-02-12 18:07:34,317 INFO mapreduce.Job: Job job_1644424054652_0001 completed successfully
2022-02-12 18:07:34,453 INFO mapreduce.Job: Counters: 33
-----------------------------------------------------------------------
2022-02-12 18:07:34,463 INFO mapreduce.ImportJobBase: Transferred 952 bytes in 68.0861 seconds (13.9823 bytes/sec)
2022-02-12 18:07:34,466 INFO mapreduce.ImportJobBase: Retrieved 21 records.
为了验证在HDFS导入的数据,请使用以下命令查看导入的数据
默认在/user/root
下面表名这个文件夹
[root@master flume]# hadoop fs -ls /user/root
Found 1 items
drwxr-xr-x - root supergroup 0 2022-02-12 18:07 /user/root/vehicle_name
[root@master flume]# hadoop fs -ls /user/root/vehicle_name
Found 2 items
-rw-r--r-- 3 root supergroup 0 2022-02-12 18:07 /user/root/vehicle_name/_SUCCESS
-rw-r--r-- 3 root supergroup 952 2022-02-12 18:07 /user/root/vehicle_name/part-m-00000
[root@master flume]# hadoop fs -cat /user/root/vehicle_name/part-m-00000
数据如下:表的数据和字段之间用逗号(,)表示。
如果要指定这样--m 2
的话,就需要指定个字段了
--split-by id
比如指定id,按照那个字段切分
sqoop import "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \
--connect jdbc:mysql://master:3306/duanjc \
--username root \
--password root \
--split-by id \
--table vehicle_name --m 2
结果如下:表的数据和字段之间用逗号(,)表示。
[root@master flume]# hadoop fs -ls /user/root/vehicle_name
Found 4 items
-rw-r--r-- 3 root supergroup 0 2022-02-12 18:42 /user/root/vehicle_name/_SUCCESS
-rw-r--r-- 3 root supergroup 13 2022-02-12 18:42 /user/root/vehicle_name/part-m-00000
-rw-r--r-- 3 root supergroup 887 2022-02-12 18:42 /user/root/vehicle_name/part-m-00001
-rw-r--r-- 3 root supergroup 52 2022-02-12 18:42 /user/root/vehicle_name/part-m-00002
[root@master flume]# hadoop fs -cat /user/root/vehicle_name/part-m-00000
1,2,3
22,4,3
[root@master flume]# hadoop fs -cat /user/root/vehicle_name/part-m-00001
3,4,3
50d6394-e9qd-112eb-9c7a-030c2213e292,ca9er1102,c102
50d6394-e9qd-11fb-9c7a-030c2213e292,ca9er1102,c102
50d6394-e9qd-1beb-9c7a-030c2213e292,ca9er1102,c102
50d6394-e9qd-1deb-9c7a-030c2213e292,ca9er1102,c102
50d6394-e9qd-1f2eb-9c7a-030c2213e292,ca9er1102,c102
50dd394-e9qd-112eb-9c7a-030c2213e292,ca9er1102,c102
50f62f0e-e9fd-11eb-9c7a-000c2918e062,camera100,c100
50f63607-e9fd-11eb-9c7a-000c2918e062,camera101,c101
50f6394-e92d-112eb-9c7a-030c2218e062,camera102,c102
50f6394-e9fd-112eb-9c7a-030c2218e062,camera102,c102
50f6394-e9qd-112eb-9c7a-030c2213e292,ca9er1102,c102
50f6394-e9qd-112eb-9c7a-030c2218e062,camer1102,c102
50f6394-e9qd-112eb-9c7a-030c2218e262,camer1102,c102
50f6394-e9qd-112eb-9c7a-030c2218e292,camer1102,c102
50f6394d-e9fd-11eb-9c7a-000c2218e062,camera102,c102
50f6394d-e9fd-11eb-9c7a-000c2918e062,camera102,c102
50f6394d-e9fd-11eb-9c7a-030c2218e062,camera102,c102
[root@master flume]# hadoop fs -cat /user/root/vehicle_name/part-m-00002
50f63b40-e9fd-11eb-9c7a-000c2918e062,camera103,c103
导入到HDFS指定目录
在导入表数据到HDFS使用Sqoop导入工具,我们可以指定目标目录。
以下是指定目标目录选项的Sqoop导入命令的语法。
--target-dir <new or exist directory in HDFS>
下面的命令是用来导入vehicle_name表数据到'/queryresult'目录。
sqoop import \
--connect jdbc:mysql://10.7.86.173:3306/duanjc \
--username duanjc \
--password 123456 \
--target-dir /queryresult \
--table vehicle_name --m 1
下面的命令是用来验证 /queryresult 目录中 emp_add表导入的数据形式。它会用逗号(,)分隔表的数据和字段。
[root@master conf]# hadoop fs -cat /queryresult/part-m-*
1,2,3
22,4,3
3,4,3
50d6394-e9qd-112eb-9c7a-030c2213e292,ca9er1102,c102
50d6394-e9qd-11fb-9c7a-030c2213e292,ca9er1102,c102
50d6394-e9qd-1beb-9c7a-030c2213e292,ca9er1102,c102
50d6394-e9qd-1deb-9c7a-030c2213e292,ca9er1102,c102
50d6394-e9qd-1f2eb-9c7a-030c2213e292,ca9er1102,c102
50dd394-e9qd-112eb-9c7a-030c2213e292,ca9er1102,c102
50f62f0e-e9fd-11eb-9c7a-000c2918e062,camera100,c100
50f63607-e9fd-11eb-9c7a-000c2918e062,camera101,c101
50f6394-e92d-112eb-9c7a-030c2218e062,camera102,c102
50f6394-e9fd-112eb-9c7a-030c2218e062,camera102,c102
50f6394-e9qd-112eb-9c7a-030c2213e292,ca9er1102,c102
50f6394-e9qd-112eb-9c7a-030c2218e062,camer1102,c102
50f6394-e9qd-112eb-9c7a-030c2218e262,camer1102,c102
50f6394-e9qd-112eb-9c7a-030c2218e292,camer1102,c102
50f6394d-e9fd-11eb-9c7a-000c2218e062,camera102,c102
50f6394d-e9fd-11eb-9c7a-000c2918e062,camera102,c102
50f6394d-e9fd-11eb-9c7a-030c2218e062,camera102,c102
50f63b40-e9fd-11eb-9c7a-000c2918e062,camera103,c103
然后看运行命令的地方,下面生成了几个.java文件
他是把这些命令打包成jar包运行的
默认目录是/user/${user.name}/${tablename}
,可以通过--target-dir
设置hdfs上的目标目录
全部表导入
可以使用import-all-tables
命令。
sqoop import-all-tables \
–connect jdbc:mysql://master/hivemeta2db \
--username root \
--password passwd
指定所需列
sqoop import \
--connect jdbc:mysql://master/hivemeta2db \
--username root \
--password passwd \
--table sds \
--columns "SD_ID,CD_ID,LOCATION"
指定导出文件
指定导出文件为SequenceFiles,并且将生成的类文件命名为com.ctrip.sds:
sqoop import \
--connect jdbc:mysql://master/hivemeta2db \
--username root \
--password passwd \
--table sds \
--class-name com.ctrip.sds \
--as-sequencefile