sqoop数据导入的常见问题及小结

本文首先是讲述sqoop的如何进行数据的导入和导出及其注意点,然后列举了sqoop和mysql在数据导入导出过程中的一些常见错误。

sqoop安装:安装在一台CentOS节点上就可以了。


1.上传sqoop

2.安装和配置
在添加sqoop到环境变量
将数据库连接驱动拷贝到$SQOOP_HOME/lib里
3.使用
第一类:数据库中的数据导入到HDFS上
sqoop import --connect jdbc:mysql://192.168.1.10:3306/itcast --username root --password 123  --table trade_detail --columns 'id, account, income, expenses'

指定输出路径、指定数据分隔符
sqoop import --connect jdbc:mysql://192.168.1.10:3306/itcast --username root --password 123  --table trade_detail --target-dir '/sqoop/td' --fields-terminated-by '\t'
注:--target-dir 指定导入的hdfs目录。

sqoop import --connect jdbc:mysql://192.168.1.10:3306/itcast --username root --password 123  --table trade_detail --target-dir '/sqoop/td1' --fields-terminated-by '\t' -m 2
注:指定Map数量 -m 

增加where条件, 注意:条件必须用引号引起来
sqoop import --connect jdbc:mysql://192.168.1.10:3306/itcast --username root --password 123  --table trade_detail --where 'id>3' --target-dir '/sqoop/td2' 


增加query语句(使用 \ 将语句换行)
sqoop import --connect jdbc:mysql://192.168.1.10:3306/itcast --username root --password 123 \
--query 'SELECT * FROM trade_detail where id > 2 AND $CONDITIONS' --split-by trade_detail.id --target-dir '/sqoop/td3'

注意:如果使用--query这个命令的时候,需要注意的是where后面的参数,AND $CONDITIONS这个参数必须加上
而且存在单引号与双引号的区别,如果--query后面使用的是双引号,那么需要在$CONDITIONS前加上\即\$CONDITIONS

如果设置map数量为1个时即-m 1,不用加上--split-by ${tablename.column},否则需要加上。

如果没有id>2的条件,去掉“and”就可以。例:./sqoop import --connect jdbc:mysql://192.168.2.1:3306/test --username root --password 123456 --query 'select * from user where  $CONDITIONS' -m 2 --target-dir /sqoop/td5 --split-by 'user.userId'


第二类:将HDFS上的数据导出到数据库中(不要忘记指定分隔符)
sqoop export --connect jdbc:mysql://192.168.8.120:3306/itcast --username root --password 123 --export-dir '/td3' --table td_bak -m 1 --fields-terminated-by ','

4.配置mysql远程连接( 授权法

在MySQL Server端: 
执行mysql 命令进入mysql 命令模式(
mysql -u root -p ):

mysql> use mysql;  

#这句话的意思 ,允许IP192.168.2.113(如果是%表示任何IP)的电脑 用root帐户  和密码(123456)来访问这个MySQL Server   

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

mysql>FLUSH PRIVILEGES

格式:

grant 权限 on 数据库名.表名 to 用户@登录主机 identified by "用户密码" with grant option;

            @ 后面是访问mysql的客户端ip地址(或是 主机名) % 代表任意的客户端,如果填写 localhost 为

本地访问(那此用户就不能远程访问该mysql数据库了)。


问题:1.如果mysql数据库是安装在windows上,可能会出现这样的报错:

org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 

The last packet sent successfully to the server was 0 milliseconds ago.

这一般是因为你的windows防火墙开着的原因。关闭它就行。

2。如果你的mysql安装在Centos上,可能会报这样的错(如果你配置了mysql远程连接,就不会报这种错):

ERROR manager.SqlManager: Error executing statement: java.sql.SQLException: null,  message from server: "Host '192.168.2.113' is not allowed to connect to this MySQL server"
java.sql.SQLException: null,  message from server: "Host '192.168.2.113' is not allowed to connect to this MySQL server
解决办法(改表法):
mysql -u root -p 
mysql>use mysql; 
mysql>select 'host' from user where user='root'; 
mysql>update user set host = '%' where user ='root'; 
(注:如果在执行update user set host = '%' where user ='root';出现错误提示
ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY' 则只需执行 flush privileges 即可
mysql>flush privileges; 
mysql>select 'host'   from user where user='root'; 
第一句是以权限用户root登录 
第二句:选择mysql库 
第三句:查看mysql库中的user表的host值(即可进行连接访问的主机/IP名称) 
第四句:修改host值(以通配符%的内容增加主机/IP地址),当然也可以直接增加IP地址 
第五句:刷新MySQL的系统权限相关表 
第六句:再重新查看user表时,有修改。。 
重起mysql服务即可完成。
3.如果出现这种报错:
 
  
ERROR tool.ImportTool: Error during import: No primary key could be found for table creater_user.popt_cas_redirect_his. Please specify one with --split-by or perform a sequential import with '-m 1'.
这是因为表中没有申明主键。可参考博客:http://blog.csdn.net/keda8997110/article/details/8518010
 
  

 
   
  

 
 

你可能感兴趣的:(hadoop,大数据技术)