1.sqoop列举出来mysql中的表结构数据
sqoop list-tables \
> --connect jdbc:mysql://hadoop1:3306/mysql \
> --username root \
> --password root
2.列举数据库的信息
sqoop list-databases\
>--connect jdbc:mysql://hadoop1:3306/ \
>--username root \
>--password root
3.根据mysql中的表的数据创建hive中的表
sqoop create-hive-table \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--hive-table hk // 根据help_keyword的表数据创建hive的hk的表结构数据
4.sqoop的数据导入操作:从mysql中导入数据到hdfs中,对应的-m选项指定对应的是并行度的操作的。sqoop的导入第一步是将数据存储到hdfs上的,第二步是移动到指定的目录位置的。
sqoop import \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
-m 1
5.sqoop导入指定分隔符合和对应的hdfs目录信息
sqoop import \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--target-dir /user/hadoop11/my_help_keyword1 \ # 指定hdfs的目录
--fields-terminated-by '\t' \ # 指定行内的分隔符
-m 2 # 指定并行度。
6.根据指定的条件导入
sqoop import \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--where "name='STRING' " \ # 指定导入数据的条件。
--table help_keyword \
--target-dir /sqoop/hadoop11/myoutport1 \
-m 1 # 指定并行度信息
7.根据指定列和指定的条件导入
sqoop import \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--columns "name" \
--where "name='STRING' " \
--table help_keyword \
--target-dir /sqoop/hadoop11/myoutport22 \
-m 1
selct name from help_keyword where name = "string" # 指定导入数据的列信息
8.使用自定义的sql语句导入
sqoop import \
--connect jdbc:mysql://hadoop1:3306/ \
--username root \
--password root \
--target-dir /user/hadoop/myimport33_1 \
--query 'select help_keyword_id,name from mysql.help_keyword where $CONDITIONS and name = "STRING"' \ # 使用自定义的sql语句导入数据,需要$CONDITIONS的选项信息。
--split-by help_keyword_id \
--fields-terminated-by '\t' \
-m 4 # 指定并行度。
9.sqoop将数据导入到hive中
sqoop import \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--hive-import \ # 会创建一个和mysql表名称一样的hive表数据。help_keyword
-m1
10.数据导入到hive中并指定相关的hive的数据信息。
sqoop import \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--fields-terminated-by "\t" \
--lines-terminated-by "\n" \
--hive-import \
--hive-overwrite \
--create-hive-table \
--delete-target-dir \
--hive-database mydb_test \
--hive-table new_help_keyword
-m 1
11.hive数据导入
sqoop import \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--fields-terminated-by "\t" \
--lines-terminated-by "\n" \
--hive-import \ # 指定将数据导入到hive中
--hive-overwrite \ # 指定覆盖导入操作
--create-hive-table \ # 指定创建hive的表结构
--hive-table mydb_test.new_help_keyword \ # 指定表结构信息
--delete-target-dir # 导入完成之后,删除指定的目录。
12.指定导入数据到hdfs中,导入的方式选择的是清空原有的数据的。--incremental
sqoop import \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--target-dir /user/hadoop/myimport_add \
--incremental append \ # 指定对应的sqoop选择数据的范围。append对应的是执行主键自增的时候执行追加操作。--last-value 指定数值范围,大于这个数值的话才会执行数据导入操作的。
--check-column help_keyword_id \ # 指定需要检索的行数据信息。根据help_keyword_id执行操作
--last-value 500 \
-m1 # 指定mr的并行度,确定并行度。代表的是2个map任务。
13.执行增量导入和追加操作
sqoop import \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \
--target-dir /user/hadoop/myimport_add \
--incremental append \ # 指定追加方式为append
--check-column help_keyword_id \ # 指定检查的列信息为:help_keyword_id
--last-value 500 \ # 指定从哪个限制数据开始执行导入操作
-m1 # 指定并行度
14.sqoop导入数据到hbase中
sqoop import \
--connect jdbc:mysql://hadoop1:3306/mysql \
--username root \
--password root \
--table help_keyword \ # 指定mysql的表为 help_keyword
--hbase-table new_help_keyword \ # 指定hbase的table为new_help_keyword
--column-family person \ # 指定列族为family
--hbase-row-key help_keyword_id # 指定导入的主键为:help_keyword_id
下面展示的是一个完整的生产使用的操作:指定导入数据需要关注的顺序。
下面对应的是生产生面使用的sqoop操作。sqoop脚本通过azakan或者是oozie执行调度。此处重点展示的是生产上使用的sqoop以及可能出现的问题:
如下:
1.sqoop导入必须制定分隔符:
--fields-terminated-by '\001'
2.制定存储文件的类型,节省存储空间。stored as textfile是默认的。可以使用其他的方式存储数据,节省空间。可以指定大小压缩空间
3.可以指定每一次导入的记录数量,避免占用太多的时间的。hive底层采用的是mr程序,很浪费时间信息。需要指定导入的记录数量保证时间不能太长导致存在其他的问题。
4.时间类型的数据,在创建hive表的时候,转化为string类型执行导入操作,避免格式导致的问题出现。
5.指定了--lines-terminated-by "\n" 对应的作为换行符的信息,需要注意的是某些字段的数值中可能包含了"\n"的换行符信息。需要指定如下的字段信息。
-hive-drop-import-delims .所以,推荐生成文件的时候使用'\001'作为分隔符进行处理,避免造成更多的问题。
6.注意,当导入的字段和hive中的关键字相同的时候,也是会报错的。
order => order1
sort => sort1
reduce => reduce1
cast => cast1
directory => directory1
7。sqoop增量数据导出对应的update-only需要处理的问题:
update-key 需要注意的是update-key需要指定的是不能进行更新的字段的。
8.impala查询hbase中的数据
将hbase中的数据映射到hive中,使用如下的语句。创建hive的外部表来进行操作。
CREATE EXTERNAL TABLE hbasestringids (id string,bool_col boolean, tinyint_col tinyint, smallint_col smallint, int_col int, bigint_col bigint, float_col float, double_col double, date_string_col string, string_col string, timestamp_col timestamp)STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'WITH SERDEPROPERTIES ( "hbase.columns.mapping" = ":key,bools:bool_col,ints:tinyint_col,ints:smallint_col,ints:int_col,ints:\ bigint_col,floats:float_col,floats:double_col,strings:date_string_col,\ strings:string_col,strings:timestamp_col")TBLPROPERTIES("hbase.table.name" = "hbasealltypessmall");
更新hive中的信息同步到impala中。
使用impala的jdbc编程获取数据.
hbase中的表数据信息转移到hive中的。
CREATEEXTERNALTABLEhbase.user_info (
idcardSTRING,
checkcountINT,
usernameSTRING,
useraddrSTRING,
userbirthSTRING,
usermarriedTINYINT,
usersexTINYINT,
mincheckdateSTRING,
mobileSTRING
)
STOREDBY"org.apache.hadoop.hive.hbase.HBaseStorageHandler"
WITHSERDEPROPERTIES (
"hbase.columns.mapping"="
:key,
user_info:checkCount,
user_info:userName,
user_info:userAddr,
user_info:userBirth,
user_info:userMarried,
user_info:userSex,
user_info:minCheckDate,
user_info:mobile
")
TBLPROPERTIES ("hbase.table.name"="user_info")
9.hive的数据导入到 mysql中,需要注意如下的如下的问题:
1)hive的数据存储格式必须是textfile的存储格式的。否则读取会存在问题的。
2)需要指定空值的处理方式:
/home/huser/sqoop-1.4.7/bin/sqoopexport--connect"jdbc:mysql://localhost9:3306/analysisuseUnicode=true&characterEncoding=utf-8"\
--username mysql \
--password Pass2020 \
--table tmp_dws_visit_source \
--columns days,visitSourceType,visitSource \
--input-fields-terminated-by'^A'\ # 指定输入字段的分隔符和行分隔符信息。
--input-lines-terminated-by'\n'\
--input-null-string'\\N'\ # 指定null数值的处理操作。为了避免空值时,没有数据,需要该命令
--input-null-non-string'\\N'\
--export-dir"hdfs://hadooprt:9000/user/hive/warehouse/rt1.db/dws_visit_source/everyday=2020-08-06/"\
-m 1; # 指定mr程序中的map的个数信息
3)需要确保mysql中的表以及对应的表结构的存在的。
#!/bin/bash
everyday="2020-08-06"
sql=$(cat << !EOF
use database;
alter database analysis character set utf8 collate utf8_general_ci;
drop table dws_visit_source;
create tableifnot exists dws_visit_source(
days string,
visitSourceType string,
visitSource string
)
partitioned by (everyday string)
row format delimited
fields terminated by'^A'
lines terminated by'\n'
stored as textfile;
insert into table dws_visit_source partition(everyday='$everyday1')
select everyday,visitSourceType,visitSource
from cr_t_test08whereeveryday='$everyday'group by visitSourceType,visitSource;
exit;
!EOF)
$HIVE_HOME/bin/hive -e"$sql"
exitCode=$?
if[$exitCode-ne 0 ];then
echo"[ERROR] hive execute failed!">> tmplog.txt
exit$exitCode
fi
常见的错误和对应的错误处理信息如下:
https://nieson.blog.csdn.net/article/details/80432400?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-4.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-4.not_use_machine_learn_pai
https://blog.csdn.net/robbyo/article/details/50523998
https://blog.csdn.net/xueyao0201/article/details/83059939?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.not_use_machine_learn_pai