这两天在验证通过MMA的工具将Hive上的数据同步到maxcompute中(遇到的问题还是挺多的,)
https://github.com/aliyun/alibabacloud-maxcompute-tool-migrate
https://www.aliyun.com/product/odps
一、概念解释
稍微解释下:
一、MMA是阿里做的一个同步数据的工具,目的是为了搬Hive的数据上maxcompute
步骤如下:
1、读取hive表元数据生成对应的建表语句创建MC表(非分区表会删除表然后重建)
2、分区表表不会被删除,但是会删除分区然后重新add分区
3、通过添加的UDTF,使用MC的tunnel传输数据到MC
4、count原表和countMC表
5、对比验证结果一样,任务就结束
CreateTable (在MC中创建表) | AddPartition (在MC中添加分区,仅限分区表) | DataTransfer (数据传输) +-----------------+-----------------+ | | Source Verification(count原表) Dest Verification(countMC表) | | +-----------------+-----------------+ | Compare Verification Result (对比验证结果)
二、Maxcompute是阿里做的类似hadoop的产品,功能主要是存储和计算
1、比orc的压缩比更大的存储AliORC
2、拥有多种计算引擎,包括MR,Spark,Graph ,支持sql开发
二、前提条件
1、Hive集群各节点需要具备访问MaxCompute的能力
原因是这个数据同步是在UDTF里创建MC的tunnel链接,再完成数据同步,如果链接不到MC,那肯定会失败
2、MC的最好设置相关的数据类型的支持
https://help.aliyun.com/document_detail/159540.html
setproject odps.sql.type.system.odps2=true;
setproject odps.sql.hive.compatible=true;
如果不设置如上的类型,默认数据类型应该是1.0的
那就会出现,我明明在MC上创建表字段写的是int,建完表之后,那个字段是bigint,这就会导致后续数据同步失败
三、环境准备
安装git命令(如果你要手动拉代码也可以不装)
安装maven命令,因为下下来的代码需要编译成两个jar包,一个是udtf,一个是mma的server和client包
yum install git
yum install maven
git clone https://github.com/aliyun/alibabacloud-maxcompute-tool-migrate.git
## 下载下来是master分支,自己切换下分支,比如我是hive2的版本,我就如下切换
## 但是我之前用master分支也能直接同步就是了,我没有具体确定不同的release区别在哪里
## 而且master分支有UI,18888页面,我换了2的版本就没有UI
git checkout --quiet release/hive-2.x
## 进入到alibabacloud-maxcompute-tool-migrate
cd alibabacloud-maxcompute-tool-migrate
sh build.sh
## 编译有点慢,会生成mma.tar.gz,然后解压
tar -zxvf mma.tar.gz -C ./
到这里环境配置结束了
四、基础配置文件
## 运行configure脚本自动配置相关文件
mma/bin/configure
1、hive配置
mma的原理相当于创建了一个beeline,连接hiveserver2,执行同步数据的sql
注意:后面你要传一个配置文件和一个udtf的jar包到hdfs上,这里配置的jdbc的用户名必须要能有权限访问,否则会出现MC表创建成功,但是数据同步不过去的情况
2、MC的配置
其实就是UDTF中,要创建MC的连接去同步数据,而且后面odps的配置要上传到HDFS上
3、传配置和jar包,创建hive函数
上传文件至HDFS:
$ hdfs dfs -put -f /path/to/mma/conf/odps_config.ini hdfs:///tmp/
$ hdfs dfs -put -f /path/to/mma/lib/data-transfer-hive-udtf-1.0-SNAPSHOT-jar-with-dependencies.jar hdfs:///tmp/
创建函数
建议最好使用beeline来创建这个函数,这样你顺便还可以验证下你刚才配置的用户是否有权限访问hdfs的udtf的jar包
0: jdbc:hive2://127.0.0.1:10000/default> CREATE FUNCTION odps_data_dump_multi as 'com.aliyun.odps.datacarrier.transfer.OdpsDataTransferUDTF'
五、配置需要同步的表
修改conf/table_mapping.txt
## 执行如下命令,生成mma_migration_config.json文件
## 后面通过mma-client传入这个文件,来提交数据同步任务
bin/generate-config --to_migration_config --table_mapping conf/table_mapping.txt
六、启动服务,提交任务
## 启动服务端
nohup /path/to/mma/bin/mma-server >/dev/null 2>&1 &
## 提交任务
bin/mma-client --start mma_migration_config.json
## 查看进度
bin/mma-client --wait_all
但是查看进度的这个命令功能,挺糟糕的
如果是master分支,应该有webUI的,可以尝试访问server开启的那台机器的18888页面
七、日志和相关报错
在mma/log下
action是具体执行了什么操作,比如创建表,添加分区,执行odps_data_dump_multi这个函数来同步数据,都可以在这里找到
mma_client客户端日志
mma_server服务端日志,任务报错可以看看这个,但是日志比较多看得头疼
除了这些,还可以看看hiveserver2的日志,原理我说过了,因为mma是通过beeline连接hiveserver2提交任务的,所以日志也会打印到hiveserver2里!
八、我遇见的报错
1、Cannot modify mapreduce.task.timeout at runtime. It is not in list of params that are allowed to be modified at runtime
原因是:在跑任务的时候在beeline里面执行了set mapred.xxx(设置了超时时间set mapred.task.timeout)
参考:https://blog.csdn.net/qq_26502245/article/details/111469132
添加两个配置:
<property>
<name>hive.security.authorization.sqlstd.confwhitelist</name>
<value>mapred.*|hive.*|mapreduce.*|spark.*</value>
</property>
<property>
<name>hive.security.authorization.sqlstd.confwhitelist.append</name>
<value>mapred.*|hive.*|mapreduce.*|spark.*</value>
</property>
之后可以在beeline里面单独运行测试下
2、各式各样的权限问题
- 函数不存在:
Caused by: org.apache.hadoop.hive.ql.parse.SemanticException: Invalid function odps_data_dump_multi
原因是hdfs上那个jar包的权限,beeline的用户没权限读取
- 没权限读写HDFS目录
Permission denied: Principal [name=hadoop, type=USER]
你用的hadoop用户没有权限读写某个目录
以上这个类型的问题,其实自己多查查hiveserver2里面报的什么错就可以了,然后可以从action的日志里,把具体执行的sql拿出来,自己通过beeline测试下
大家有兴趣也可以下载MMA项目的源码来看看比如hive的数据类型是怎么转成MC的,其实在这个类里面定义:HiveTypeTransformer(但是其实什么类型都没有改变就是了,只是规范了下格式,改成大写的)
这是我第100篇文章!!想到刚开始写博客的初衷,哈哈哈真的感觉就在昨天~
冬至快乐,大家今天吃饺子吃汤圆了吗!