转载 https://blog.csdn.net/junhuahouse/article/details/78177527 --hadoop
https://blog.csdn.net/pucao_cug/article/details/71773665 --hive
https://blog.csdn.net/pucao_cug/article/details/72083172 -- sqoop
在公司服务器上测试过,没什么太大的坑,一步一步就可以,只是sqoop 把mysql表导入 hive有点小问题,问题解决方案见
https://stackoverflow.com/questions/21599785/sqoop-not-able-to-import-table/21626010#21626010
1.安装hadoop
1.1 安装jdk ,配置环境变量vim /etc/profile ,添加下面代码
export JAVA_HOME=xxxxx(jdk路径)
export CLASS_PATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
执行 source /etc/profile 使其生效
1.2 下载hadoop ,https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.8.5/hadoop-2.8.5-src.tar.gz
测试使用的2.8.5版本,可到apache 首页搜索hadoop ,解压文件 tar -zxvf xxxxxxxx.tar.gz
vim /etc/profile ,追加配置代码
#set hadoop path
export HADOOP_HOME=xxxxxxxx(hadoop解压路径)
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
执行source /etc/profile
可以通过 Hadoop version 查看版本
1.3 配置hadoop
修改配置文件 ,在 $HADOOP_HOME/etc/hadoop 目录下有需要修改的配置文件
1.3.1: hadoop-env.sh
把里面的 export JAVA_HOME=xxxxx(路径修改为jdk的路径)
1.3.2 core-site.xml configuration 标签内添加,注意端口占用
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop</value>
</property>
<property>
<name>hadoop.name.dir</name>
<value>/hadoop/name</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost.localdomain:9000</value>
</property>
</configuration>
其中 fs.default.name 的value 值中间localhost.localdomain可以换成主机名
1.3.3 hdfs-site.xml configuration 标签内添加
<configuration>
<property>
<name>dfs.data.dir</name>
<value>/hadoop/data</value>
</property>
</configuration>
1.3.4 mapred-site.xml 使用命令 cp mapred-site.xlm.template mapred-site.xlm 复制得到,修改内容,注意端口占用
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost.localdomain:9001</value>
</property>
</configuration>
在$HADOOP_HOME/bin 目录下执行
hadoop namenode -format
然后进入到$HADOOP_HOME/sbin 目录下执行
./start-all.sh
验证: 输入 jps 即可看到启动的服务,包括Jps nameNode secondoryNameNode 等
也可在浏览器输入 http://xxxxxxx:8088 进行查看
关闭防火墙和禁止开机启动
systemctl stop firewalld.service #停止firewall
systemctl disabled firewalld.service #禁止开机启动
2.安装 hive 转载https://blog.csdn.net/pucao_cug/article/details/71773665
2.1下载 hive ,http://hive.apache.org/downloads.html
apache-hive-2.3.3-bin.tar.gz
2.2 在opt目录下新建一个名为hive的目录,将apache-hive-2.1.1-bin.tar.gz拷贝上去
执行进入目录的命令:
cd /opt/hive
执行解压缩的命令:
tar -zxvf apache-hive-2.3.3-bin.tar.gz
2.3 配置 vim /etc/profile ,追加下面代码
#set hive path
export HIVE_HOME=/opt/hive/apache-hive-2.3.3-bin
export HIVE_CONF_DIR=${HIVE_HOME}/conf
export CLASS_PATH=${HIVE_HOME}/lib:$CLASS_PATH
export PATH=${HIVE_HOME}/bin:$PATH
2.3.1 hive-site.xml 相关配置
进入到/opt/hive/apache-hive-2.3.3-bin/conf目录,命令是:
cd /opt/hive/apache-hive-2.3.3-bin/conf
将hive-default.xml.template文件复制一份,并且改名为hive-site.xml,命令是:
cp hive-default.xml.template hive-site.xml
2.3.1.2使用hadoop新建hdfs目录
因为在hive-site.xml中有这样的配置:
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
所以要让hadoop新建/user/hive/warehouse目录,执行命令:
$HADOOP_HOME/bin/hadoop fs -mkdir -p /user/hive/warehouse
给刚才新建的目录赋予读写权限,执行命令:
$HADOOP_HOME/bin/hadoop fs -chmod 777 /user/hive/warehouse
让hadoop新建/tmp/hive/目录,执行命令:
$HADOOP_HOME/bin/hadoop fs -mkdir -p /tmp/hive/
给刚才新建的目录赋予读写权限,执行命令:
$HADOOP_HOME/bin/hadoop fs -chmod 777 /tmp/hive
2.3.1.3检查hdfs目录是否创建成功
检查/user/hive/warehouse /tmp/hive 目录是否创建成功,执行命令:
$HADOOP_HOME/bin/hadoop fs -ls /tmp/
$HADOOP_HOME/bin/hadoop fs -ls /user/hive/
2.3.1.4修改hive-site.xml中的临时目录
将hive-site.xml文件中${system:java.io.tmpdir}替换为hive的临时目录,例如我替换为/opt/hive/tmp,该目录如果不存在则要自己手工创建,并且赋予读写权限。
将${system:user.name}都替换为root
2.3.1.5修改hive-site.xml数据库相关的配置
搜索javax.jdo.option.ConnectionURL,将该name对应的value修改为MySQL的地址,例如我修改后是:
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.31.95:3306/hive?createDatabaseIfNotExist=true</value>
搜索javax.jdo.option.ConnectionDriverName,将该name对应的value修改为MySQL驱动类路径,例如我的修改后是:
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
搜索javax.jdo.option.ConnectionUserName,将对应的value修改为MySQL数据库登录名:
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
搜索javax.jdo.option.ConnectionPassword,将对应的value修改为MySQL数据库的登录密码:
<name>javax.jdo.option.ConnectionPassword</name>
<value>cj</value>
搜索hive.metastore.schema.verification,将对应的value修改为false:
<name>hive.metastore.schema.verification</name>
<value>false</value>
2.3.1.6将MySQL驱动包上载到lib目录
2.3.2新建hive-env.sh文件并进行修改
进入到/opt/hive/apache-hive-2.3.3-bin/conf目录,命令是:
cd /opt/hive/apache-hive-2.3.3-bin/conf
将hive-env.sh.template文件复制一份,并且改名为hive-env.sh,命令是:
cp hive-env.sh.template hive-env.sh
打开hive-env.sh配置并且添加以下内容:
export HADOOP_HOME=/opt/hadoop/hadoop-2.8.0
export HIVE_CONF_DIR=/opt/hive/apache-hive-2.3.3-bin/conf
export HIVE_AUX_JARS_PATH=/opt/hive/apache-hive-2.3.3-bin/lib
3启动和测试
进入到hive的bin目录 执行命令:
cd /opt/hive/apache-hive-2.3.3-bin/bin
对数据库进行初始化,执行命令:
schematool -initSchema -dbType mysql
2.4启动hive
进入到hive的bin目录执行命令:
cd /opt/hive/apache-hive-2.3.3-bin/bin
执行hive脚本进行启动,执行命令:
./hive
接下来就可以进行测试了,建库,建表...
3. hive
1下载Sqoop
因为官方并不建议在生产环境中使用1.99.7版本,所以我们还是等2.0版本出来在用新的吧,现在依然使用1.4.6版本
打开官网:
如图:
点击上图的nearby mirror
相当于是直接打开:http://www.apache.org/dyn/closer.lua/sqoop/
如图:
我选择的是http://mirror.bit.edu.cn/apache/sqoop/
如图:
点击1.4.6,相当于是直接打开地址:
http://mirror.bit.edu.cn/apache/sqoop/1.4.6/
如图:
2上载和解压缩
在opt目录下新建一个名为sqoop的目录,将下载得到的文件sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar上载到该目录内
如图:
进入到该目录下,执行解压缩,也就是执行命令:
cd /opt/sqoop
tar -xvf sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz
命令执行完成后得到了/opt/sqoop/sqoop-1.4.6.bin__hadoop-2.0.4-alpha目录
3一系列配置
3.1 配置环境变量
编辑/etc/profile文件,添加SQOOP_HOME变量,并且将$SQOOP_HOME/bin添加到PATH变量中,编辑方法很多,可以将profile文件下载到本地编辑,也可以直接用vim命令编辑。
添加的内容如下:
export JAVA_HOME=/opt/java/jdk1.8.0_121
export HADOOP_HOME=/opt/hadoop/hadoop-2.8.0
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_HOME}/lib/native
export HADOOP_OPTS="-Djava.library.path=${HADOOP_HOME}/lib"
export HIVE_HOME=/opt/hive/apache-hive-2.1.1-bin
export HIVE_CONF_DIR=${HIVE_HOME}/conf
export SQOOP_HOME=/opt/sqoop/sqoop-1.4.6.bin__hadoop-2.0.4-alpha
export CLASS_PATH=.:${JAVA_HOME}/lib:${HIVE_HOME}/lib:$CLASS_PATH
export PATH=.:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin: ${HIVE_HOME}/bin:${SQOOP_HOME}/bin:$PATH
/etc/profile文件编辑完成后,执行命令:
source /etc/profile
3.2 Sqoop配置文件修改
3.2.1 sqoop-env.sh文件
3.2.1.1 新建
进入到/opt/sqoop/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/conf目录下,也就是执行命令:
cd /opt/sqoop/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/conf
将sqoop-env-template.sh复制一份,并取名为sqoop-env.sh,也就是执行命令:
cp sqoop-env-template.sh sqoop-env.sh
如图:
3.2.1.2 编辑内容
编辑这个新建的sqoop-env.sh文件,编辑方法有很多,可以下载到本地编辑,也可是使用vim命令编辑。
在该文件末尾加入下面的配置:
export HADOOP_COMMON_HOME=/opt/hadoop/hadoop-2.8.0
export HADOOP_MAPRED_HOME=/opt/hadoop/hadoop-2.8.0
export HIVE_HOME=/opt/hive/apache-hive-2.1.1-bin
说明:上面的路径修改为自己的hadoop路径和hive路径。
3.3 将MySQL驱动包上载到Sqoop的lib下
将MySQL的驱动包上载到Sqoop安装目录的lib子目录下
如图:
说明:该驱动不是越旧越好,也不是越新越好,5.1.31我这里测试是可以的。
4 使用sqoop
sqoop是一个工具,安装完成后,如果操作的命令不涉及hive和hadoop的,可以实现不启动hive和hadoop,直接输入sqoop命令即可,例如sqoop help命令。要使用hive相关的命令,必须事先启动hive和hadoop。
hadoop的安装和启动可以参考该博文:
http://blog.csdn.net/pucao_cug/article/details/71698903
hive的安装和启动可以参考该博文:
http://blog.csdn.net/pucao_cug/article/details/71773665
4.1 使用help命令
首先看看sqoop都有哪些命令,在终上输入命令:
sqoop help
如图:
上图中的内容是:
[root@hserver1 ~]# sqoop help
Warning:/opt/sqoop/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/../hbase does not exist! HBaseimports will fail.
Please set $HBASE_HOME to the root of yourHBase installation.
Warning:/opt/sqoop/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/../hcatalog does not exist! HCatalogjobs will fail.
Please set $HCAT_HOME to the root of yourHCatalog installation.
Warning:/opt/sqoop/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/../accumulo does not exist!Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root ofyour Accumulo installation.
Warning:/opt/sqoop/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/../zookeeper does not exist!Accumulo imports will fail.
Please set $ZOOKEEPER_HOME to the root ofyour Zookeeper installation.
17/05/14 16:21:30 INFO sqoop.Sqoop: RunningSqoop version: 1.4.6
usage: sqoop COMMAND [ARGS]
Available commands:
codegen Generate codeto interact with database records
create-hive-table Import a tabledefinition into Hive
eval Evaluate a SQLstatement and display the results
export Export an HDFS directory to adatabase table
help List availablecommands
import Import a tablefrom a database to HDFS
import-all-tables Import tablesfrom a database to HDFS
import-mainframe Import datasetsfrom a mainframe server to HDFS
job Work with savedjobs
list-databases List availabledatabases on a server
list-tables List availabletables in a database
merge Merge resultsof incremental imports
metastore Run astandalone Sqoop metastore
version Display versioninformation
See 'sqoop help COMMAND' for information ona specific command.
[root@hserver1 ~]#
说明:因为我们没有基于hadoop安装HBase,所以HBase相关的命令不能用,但是操作hadoop分布式文件系统的命令是可以用的。
....
错误1
再导入mysql 表到hive 的时候会报classNotFound 错误,参考 https://blog.csdn.net/quiet_girl/article/details/75160045
https://stackoverflow.com/questions/21599785/sqoop-not-able-to-import-table/21626010#21626010
错误原因:
因为在使用sqoop import命令时,生成的java文件会默认产生在当前目录下,而产生的.jar文件和.class文件会默认存放在/tmp/sqoop-/compile下,两者不在同一文件目录下,导致错误。所以,我们需要将java文件,.jar文件和.class文件放在同一目录下。
解决方法:
为了使数据不存放在根目录下,将产生的文件放在/opt/Hadoop/sqoop-1.4.6/tmp下,我们需要切换至/opt/Hadoop/sqoop-1.4.6/tmp目录下,使用如下命令:
cd /opt/Hadoop/sqoop-1.4.6/tmp
sqoop import --bindir ./ --connect jdbc:mysql://localhost:3306/hadoopguide --username root --password root --table widgets
- 1
- 2
执行后结果如下:
查看HDFS,发现mysql的widgets表格内容已经导入:
错误2
ERROR Could not register mbeans java.security.AccessControlException: access denied ("javax.management.MBeanTrustPermission" "register")
https://blog.csdn.net/xuhao1233344/article/details/79992983
java 的安全策略问题:找到jre包, /Java/jre/lib/security 包下面的 java.policy 文件,编辑他,加上如下 代码
permission javax.management.MBeanTrustPermission "register";
错误3
ERROR exec.DDLTask: java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.ObjectMapper.readerFor(Ljava/lang/Class;)Lcom/fasterxml/jackson/databind/ObjectReader;
把$SQOOP_HOME/lib/jackson*.jar 文件bak, 把对应的$HIVE_HOME/lib/jackson*.jar 对应拷贝到SQOOP/lib 下.