第三章:Sqoop安装与操作

sqoop操作步骤:

一、Mysql导入HDFS

1、在Inceptor metastore节点服务器上安装sqoop服务 yum install sqoop

2、由于Inceptor-SQL中metastore中已经安装了mysql,就不需要安装mysql了

3、将mysql-connector-java-5.1.38tar.gz驱动包先解压

tar -zxvf mysql-connector-java-5.1.38tar.gz

4、cd进刚刚解压后的目录,将里面的mysql-connector-java-5.1.38-bin.jar包copy到\/usr\/lib\/sqoop\/lib\/目录下

5、在Inceptor Server节点上输入mysql -u [用户名] -p连接数据库,此时提示输入密码,通过后输入mysql命令,再执行Grant操作:

GRANT ALL PRIVILEGES ON *.* TO 'tdh'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

如果上述不成功,可以尝试输入: GRANT ALL TO USER [username];

(若仅授权db1数据库里所有表,则可以这样指定):

GRANT ALL PRIVILEGES ON db1.* TO 'tdh'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;)

6、浏览mysql数据库

sqoop list-databases \
--username tdh \
--password 123456 \
--connect jdbc:mysql://<mysql IP>:3306/

7、浏览mysql数据库中的表,db1为mysql中的一个数据库,可以使用describe [table名]命令查看mysql中表的信息

sqoop list-tables \
--username tdh \
--password 123456 \
--connect jdbc:mysql://<mysql IP>:3306/db1

8、从mysql————>HDFS上(import,将mysql中的db1数据库里面的表导入到\/user\/datadir,这里的datadir目录一定不要事先创建,不然会报错,语句执行的时候会自动创建目录的!最后一行的-m表示map成4个文件)

sqoop import \
--username tdh \
--password 123456 \
--connect jdbc:mysql://<mysql IP>:3306/db1 \
--table country \
--target-dir /user/user1/data/sqoop -m 4

9、从HDFS————>mysql表上(export,cc表一定要和HDFS上的数据字段一致)

sqoop export \
--username tdh \
--password 123456 \
--connect jdbc:mysql://<mysql IP>:3306/db1 \
--table cc \
--export-dir /user/testdir \

10、查看sqoop导入进来的文件

hadoop fs -cat /user/user1/data/inceptor/part-m-00000 | more

二、SQL-Server导入HDFS

1、在Inceptor metastore节点服务器上安装sqoop服务 yum install sqoop

2、将sqljdbc4.jar包添加到\/usr\/lib\/sqoop\/lib下

3、浏览SQL-Server数据库

sqoop list-databases --connect"jdbc:sqlserver://192.168.1.139:1433;username= sa;password=123456"

4、浏览SQL-Server数据库中的表,pubs为SQL-Server中的一个数据库

sqoop list-tables --connect "jdbc:sqlserver://192.168.1.139:1433;username=sa;password=123456;database=pubs"

5、从SQL-Server————>HDFS上(import,将SQL-Server中的pubs数据库里面的表导入到\/user\/lm\/sqoop\/data\/sales,这里的datadir目录一定不要事先创建,不然会报错,语句执行的时候会自动创建目录的!最后一行的-m表示map成1个文件)

sqoop import --connect "jdbc:sqlserver://192.168.1.139:1433;username=sa;password=123456;database=pubs" --table sales --target-dir /user/lm/sqoop/data/sales -m 1

三、DB2导入HDFS

待添加

四、Oracle导入HDFS

待添加

五、从RDBMS中批量导入HDFS

1、新建需要导入表的表名tablename(和执行脚本中一致)

2、新建脚本名为script.sh的脚本,以下表示批量将关系型数据库中的表导入到HDFS的\/user\/lm\/目录下

#!/bin/bash
#Program:
# This program imports data to hdfs by sqoop.
#History:
#2016/03/25   First release
PATH=/bin:/sbin/:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

for i in `cat ./tablename`
do
echo "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
sqoop import --table ${i} --connect "jdbc:sqlserver://192.168.1.139:1433;database=ad3" --username=sa --password=123456 --hive-drop-import-delims --null-string '\\N' --null-non-string '\\N' --fields-terminated-by "\\01" --target-dir /user/testsh/${i} -m 1
hadoop fs -rm /user/lm/${i}/_SUCCESS
echo $i
done

3、.\/script执行脚本,即可实现批量导入

注意事项

1、在Sqoop抽取数据的过程中,强烈建议用以下范本操作,能避免几乎所有多数的错误,下面四个选项一定要设置

--hive-drop-import-delims \  --->把所有列里面的\n,^A等Hive占用符转成""
--fields-terminated-by "\\01" \  --->设置分隔符^A
--null-string '\\N' \  --->把所有的String类型的空值转换成hive的NULL值"\N"
--null-non-string '\\N'  --->把非String类型的空值转换成hive的NULL值"\N"

Sqoop在这种配置下,第一步会把所有字段中的特殊字符干掉,尤其是^A和\n,同时下一步设定列分隔符为^A,充分保证了列分隔符的准确性,这是个绝不会犯错的选择。

2、在进行Sqoop导入语句时可能会报如下的错误,一般来说都是jar包版本引入不正确所导致,所以确认是否是将正确的jar包添加进了\/usr\/lib\/sqoop\/lib路径下

3、Sqoop不要直接将RDBMS里面的数据直接导入到Hive中,正确的做法是先导入到HDFS,然后再建立外表,合理划分Sqoop任务,按分区来抽取数据,对于大数据Oracle表的Sqoop导入,一个分区一个线程。这样会带来两个好处,效率超高,流量可控。

--query "select $QUERY from $DB2_DATABASE.$TABLENAME partition($Partition) where \$CONDITIONS" \

4、在执行导入导出数据时,可能由于yarn资源不足或者其他进程的占用,而一直停留在job作业等待处理中, 此时可以通过浏览器进入YARN中Resource Manager节点中的8088端口查看被占用的Application ID号,里面描述为Application master为常驻进程,不用 杀掉,再在shell中输入命令

yarn application -kill <Application ID>

来杀死卡掉的进程,再运行上面的import、export语句。原因很简单,Inceptor-sql的常驻进程ApplicationMaster跑的是spark任务,非常消耗内存使用量,约为7-8G

results matching ""

    No results matching ""