Ubuntusqoop连接MySQL8_使⽤sqoop从mysql导⼊数据到
hive
前⾔
这篇⽂章主要是⽤sqoop从mysql导⼊数据到hive时遇到的坑的总结。
环境:
系统:Centos 6.5
Hadoop:Apache,2.7.3
Mysql:5.1.73
JDK:1.8
Sqoop:1.4.7
centos和ubuntu
Hadoop以伪分布式模式运⾏。c 中sqrt i
⼀、使⽤的导⼊命令
参照⾥⾯的⽅法,在mysql建了表,填充了数据,然后按照⾃⼰的情况输⼊了命令:
用strstr实现模糊搜索sqoop import --connect jdbc:mysql://localhost:3306/test --username root -P --split-by id --columns id,name --table
customer --target-dir /user/cloudera/ingest/raw/customers --fields-terminated-by "," --hive-import --create-hive-table --
hive-table sqoop_workspace.customers
然后开始了打地⿏之旅。
启动服务bat批处理命令大全
⼆、遇到的问题及解决
1. ⽤⽂本字段进⾏分区的问题
报错信息:"Generating splits for a textual index column allowed only in case of "-
Dorg.apache.sqoop.splitter.allow_text_splitter=true" property passed as a parameter"。
主要问题是“--split-by id”这个参数指定的id是⼀个⽂本格式,所以需要在命令中加⼊选项"-
Dorg.apache.sqoop.splitter.allow_text_splitter=true",补齐命令:
sqoop import "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" --connect jdbc:mysql://localhost:3306/test --username root -P --split-by id --columns id,name --table customer --target-dir
hdfs://harry:9000/user/cloudera/ingest/raw/customers --fields-terminated-by "," --hive-import --create-hive-table --hive-table sqoop_workspace.customers
2. Hadoop历史服务器Hadoop JobHistory没开启的问题
报错信息:“ERROR tool.ImportTool: Import failed: java.io.IOException: java.ConnectException: Call From
harry/192.168.0.210 to 0.0.0.0:10020 failed on connection exception: …”。
主要原因是sqoop在运⾏完MapReduce任务之后需要⽤hadoop jobhistory记录这些作业信息并存放在指定的HDFS⽬录下,默认情况下
是没有启动的,需要配置完后⼿⼯启动服务。
解决⽅法:l添加如下配置:generic什么意思
mapreduce.jobhistory.address0.0.0.0:10020mapreduce.jobhistory.webapp.address0.0.0.0:19888mapreduce.jobhistory.done-dir/history/donemapreduce.jobhistory.intermediate-done-dir/history/done_intermediate
重启hdfs和yarn:
stop-dfs.sh
stop-yarn.sh
start-dfs.sh
start-yarn.sh
启动历史服务器:
$HADOOP_HOME/sbin/mr-jobhistory-daemon.sh start historyserver
后⾯如果需要停⽌,可以⽤命令:
$HADOOP_HOME/sbin/mr-jobhistory-daemon.sh stop historyserver
然后重新执⾏命令。
3. 连接元数据存储数据库报错
报错信息:“Caused by: javax.jdo.JDOFatalDataStoreException: Unable to open a test connection to the given database. JDBC url…”。
主要是因为我⽤的hive元数据数据库是默认的Derby,我在另外⼀个会话开了⼀个hive cli来访问hive,⽽Derby的⼀个缺点就是当有多个⽤户同时访问hive的时候,会报错。
解决:退出hive cli,重新运⾏
4. 没有在hive创建数据库
报错信息:“ERROR ql.Driver: FAILED: SemanticException [Error 10072]: Database does not exist: sqoop_workspace…”,这个就很明显了,直接在hive⾥创建⼀个就是了。
5. 其他警告和报错
其他报错实际上没有阻碍导⼊过程,譬如下⾯这个WARN:
“WARN hdfs.DFSClient: Caught exception java.lang.InterruptedException…”,实际上是hadoop⾃⼰的bug,具体是HDFS
9794的bug:
c语言 数组转字符串当关闭DFSStripedOutputStream的时候,如果在向data/parity块刷回数据失败的时候,streamer线程不会被关闭。同时在DFSOutputStream#closeImpl中也存在这个问题。DFSOutputStream#closeImpl总是会强制性地关闭线程,会引起InterruptedException。
这些报错⼀般忽略就可以了。
三、⼀些补充
1. 为什么使⽤--split-by
在workflow上有个讨论说得很明⽩:
-
-split-by : It is used to specify the column of the table used to generate splits for imports. This means that it specifies
which column will be used to create the split while importing the data into your cluster. It can be used to enhance the import performance by achieving greater parallelism. Sqoop creates splits based on values in a particular column of the table which is specified by --split-by by the user through the import command. If it is not available, the primary key of the input table is used to create the splits.
--split-by is used to distribute the values from table across the mappers say u have 100 unique
records(primary key) and if there are 4 mappers, --split-by (primary key column) will help to distribute you data-set evenly among the mappers.
实际上使⽤—split-by参数,是为了运⾏map任务的时候,能够更好的分发数据。
四、参考
(完)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。