sqoop数据导入的常见问题及小结
2017-04-23 19:05
183 查看
本文首先是讲述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远程连接,就不会报这种错):
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
相关文章推荐
- 利用Sqoop将数据从数据库导入到HDFS(转)
- oracle 中建方案和数据导入导出小结
- 黑马程序员_SQL Server数据的导入小结(1)
- 使用sqoop将oracle数据导入hdfs集群
- Sqoop安装配置与从mysql中导入数据到hbase
- mysql导入导出数据中文乱码解决方法小结
- 用sqoop导入数据到hive中
- 使用sqoop将MySQL数据库中的数据导入Hbase
- 利用sqoop从sqlserver导入数据到HDFS或Hive
- 导入导出数据语句小结
- Oracle数据的导入导出小结
- SQLServer 数据导入导出的几种方法小结
- sqoop并行导入数据
- 导入导出数据语句小结
- oracle 中建方案和数据导入导出小结
- 【关于数据大容量的导入导出小结】
- 导入导出数据语句小结
- 利用sqoop将hive数据导入导出数据到mysql (转)
- 使用sqoop将MySQL数据库中的数据导入Hbase (转)
- 导入导出数据语句小结