使用Sqoop将数据从Hive导入MySQL相关的3个错误问题解决

1、Loading class `com.mysql.jdbc.Driver’. This is deprecated.

在sqoop中没有像hive一样,在./conf目录下可以更改hive-site.xml中的字段,及将加载的驱动名称由com.mysql.jdbc.Driver,改为com.mysql.cj.jdbc.Driver。sqoop的./conf目录下没有类似的xml字段,所以我们需要根据我们计算机本身的mysql版本来选择mysql.jdbc链接包。

即:
若你是5.x.x的mysql环境,需要下载5.x.xx的mysql.jdc.connect.jar包,复制到./lib目录下(如mysql.jdc.connect-5.1.47.jar)
若你是8.x.x的mysql环境,需要下载8.x.xx的mysql.jdc.connect.jar包,复制到./lib目录下(如mysql.jdc.connect-8.0.39.jar)(注:该版本下输出info问题不相同,但解决方法类似)

查看mysql版本登陆mysql时即可查看。

2、输出:
ERROR mapreduce.ExportJobBase: Export job failed!
ERROR tool.ExportTool: Error during export:
Export job failed!

这个有三个原因造成,下面一一解答:

  1. mysql编码不一致导致
    使用sqoop导入导出时需要对应的两个表的编码一致,如hive表和mysql表需要都为utf8的编码格式
    解决方法:
    登陆mysql后,查看编码格式:

    show variables like "char%";
    

    输出以下信息则需要更改:
    在这里插入图片描述
    若输出以下信息则不用更改:
    在这里插入图片描述
    对比以上两张图可知,我们需要更改character_set_server和character_set_database编码。
    ubuntu系统:
    打开配置文件:

    sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
    

    在[mysqld]下添加以下字段:

    character_set_server=utf8
    

    重启MySQL服务即可:

    service mysql restart
    

    centos系统
    打开配置文件:

    sudo vim /etc/my.cnf
    

    添加以下字段:

    character_set_server=utf8
    

    重启MySQL服务即可:

    systemctl restart mariadb.service
    

    注:以上 . 为sqoop安装目录。

  2. 没有配置yarn组件:
    yran组件不配置,在之前虽然不会影响hdfs的MapReduce编程,但在现在数据互传时就一定需要配置。
    **注:以下 . 为hadoop安装目录
    配置方法:
    1、首先进入./etc/hadoop目录
    2、修改配置文件 mapred-site.xml:

    <configuration>
        <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
        </property>
        <property>
            <name>mapreduce.jobhistory.address</name>
            <value>jancy:10020</value>
        </property>
    	<property>
            <name>mapreduce.jobhistory.webapp.address</name>
            <value>jancy:19888</value>
        </property>
    </configuration>
    

    3、修改配置文件 yarn-site.xml:

    <configuration>
        <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
        </property>
    	  <property>
        	<name>yarn.resourcemanager.hostname</name>
        	<value>localhost</value>
        </property>
    	  <property>
        	<name>yarn.resourcemanager.admin.address</name>
        	<value>localhost:8033</value>
        </property>
    	  <property>
        	<name>yarn.resourcemanager.address</name>
        	<value>localhost:8032</value>
        </property>
    	  <property>
        	<name>yarn.resourcemanager.resource-tracker.address</name>
        	<value>localhost:8036</value>
        </property>
    	  <property>
        	<name>yarn.resourcemanager.scheduler.address</name>
        	<value>localhost:8030</value>
        </property>
    	<property>
    		<name>yarn.application.classpath</name>
    		<value>/usr/local/hadoop/etc/hadoop:/usr/local/hadoop/share/hadoop/common/lib/*:/usr/local/hadoop/share/hadoop/common/*:/usr/local/hadoop/share/hadoop/hdfs:/usr/local/hadoop/share/hadoop/hdfs/lib/*:/usr/local/hadoop/share/hadoop/hdfs/*:/usr/local/hadoop/share/hadoop/mapreduce/lib/*:/usr/local/hadoop/share/hadoop/mapreduce/*:/usr/local/hadoop/share/hadoop/yarn:/usr/local/hadoop/share/hadoop/yarn/lib/*:/usr/local/hadoop/share/hadoop/yarn/*</value>
    	</property>
    </configuration>
    

    注:
    添加yarn.application.classpath字段是由于不加可能会报错:错误: 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
    其中<value></value>字段中的内容为终端执行hadoop classpath命令输出的内容,请自行替换(若你完全是根据我的博客或厦大数据库实验室林子雨老师的博客安装的这些组件,那就不用替换)
    4、重启yarn:

    ./sbin/stop-yarn.sh
    ./sbin/start-yarn.sh
    ./sbin/mr-jobhistory-daemon.sh start historyserver  # 开启历史服务器,才能在Web中查看任务运行情况
    
  3. yarn组件内存配置过小,及在/jobhistory/task/task_具体job输出以下错误信息:

    ontainer killed on request. Exit code is 143

    在此之前,我们先了解一下怎么查看job输出:
    我们启动yarn组件后,可以在http://localhost:8088/cluster上查看job执行的相关输出;
    在这里插入图片描述
    在底部最后一栏中选择你需要查看的一个job,点击进入,
    在这里插入图片描述下滑至底部,在底部最后一栏中选择logs点击进入,
    在这里插入图片描述选择最后一项syslog点击即可查看job运行时的log输出。

    我们还需要知道具体的debug尤其是error信息时,还可以打开hostname:198888/jobhistory查看(其中hostname为你的主机名或IP)
    选择一项job,点击ID打开,在这里插入图片描述选择第一栏中的Diagnostics,点击task进入,
    在这里插入图片描述这右侧即可找到错误的code信息。
    我们还可以点击左侧栏的tools一项,选择local logs查看hadoop各个节点完整的logs信息,虽然用处不大。

    回到正题,经过上述方法后,我们可以得知一项错误,即标题所述,意思yarn内存不足。
    解决方法:

    1、启动hadoop集群:start-all.sh
    2、启动hive:hive
    3、输入以下信息:

    set mapred.output.compress=true;
    set hive.exec.compress.output=true;
    set mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec ;
    set io.compression.codecs=com.hadoop.compression.lzo.LzopCodec ;
    set hive.exec.dynamic.partition=true;
    set hive.exec.dynamic.partition.mode=nonstrict;
    set mapreduce.map.memory.mb=8192;--最大为你的电脑内存容量
    set mapreduce.map.java.opts=-Xmx13106M;
    set mapred.map.child.java.opts=-Xmx13106M;
    set mapreduce.reduce.memory.mb=8192;--最大为你的电脑内存容量
    set mapreduce.reduce.java.opts=-Xmx13106M;
    set mapreduce.job.reduce.slowstart.completedmaps=0.8;
    set hive.exec.max.created.files=60000;
    set hive.merge.mapredfiles=true;--在Map-Reduce的任务结束时合并小文件
    set yarn.nodemanager.vmem-pmem-ratio=4.2;
    

    4、更新配置文件 mapred-site.xml和配置文件 yarn-site.xml的内容:
    <configuration> </configuration>字段内添加:
    mapred-site.xml:

    <property>
        <name>mapreduce.map.memory.mb</name>
        <value>1500</value>
        <description>每个Map任务的物理内存限制</description>
    </property>
     
    <property>
        <name>mapreduce.reduce.memory.mb</name>
        <value>3000</value>
        <description>每个Reduce任务的物理内存限制</description>
    </property>
     
    <property>
        <name>mapreduce.map.java.opts</name>
        <value>-Xmx1200m</value>
    </property>
     
    <property>
        <name>mapreduce.reduce.java.opts</name>
        <value>-Xmx2600m</value>
    </property>
    

    yarn-site.xml:

    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>8192</value>
        <discription>每个节点可用内存,单位MB</discription>
    </property>
     
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>1500</value>
        <discription>单个任务可申请最少内存,默认1024MB</discription>
    </property>
     
    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>8192</value>
        <discription>单个任务可申请最大内存,默认8192MB</discription>
    </property>
    

    4、重启hadoop集群:

    stop-all.sh
    start-all.sh
    

    这样我们就完成了对yarn内存大小的配置。

3、mysql远程登陆授权问题:
即MySQL java连接被拒绝,输出

java.sql.SQLException: Access denied for user ‘root’@’****’ (using password: YES)

首先检查是不是密码输入错误,错误的改成正确密码再次运行命令即可。
密码是正确的请看下一步:

  1. 登陆mysql:

    mysql -u root -p
    
  2. 输入:

    grant all privileges on *.* to root@'%' identified by '******'with grant option;
    

    其中’*****‘表示数据库连接密码,*.*代表所有数据库的所有表,’%'表示所有主机,也可指定特定主机:

    grant all privileges on *.* to root@'localhost' identified by '******'with grant option;
    
  3. 刷新后退出:

    flush privileges;
    exit;
    
  4. 重启mysql服务:

    systemctl restart mariadb.service
    

    这样就完成了mysql的授权。

本文完。

猜你喜欢

转载自blog.csdn.net/qq_43175022/article/details/106329130