- 背景
线上有很多的数据库在运行,后台需要一个分析用户行为的数据仓库。目前比较流行的是mysql和hadoop平台。
现在的问题是,如何将线上的mysql数据实时的同步到hadoop中,以供分析。这篇文章就是利用tungsten-replicator来实现。
- 环境
由于tungsten-replicator依赖ruby和gem。需要安装
yum install ruby yum install rubygems gem install json 其中json模块可能因为gfw的原因,需要手动下载到本地,然后使用gem本地安装
yum install ruby-develgem install --local json-xxx.gem
安装好mysql,地址是 192.168.12.223:3306 ,数据库配置好权限
安装好hadoop 2.4 ,hdfs的地址是 192.168.12.221:9000
- 配置
先在mysql的机器上,进入到tungsten-replicator目录下执行,并且启动tungsten,可以使用trepctl thl 等命令查看服务的状态
./tools/tpm install mysql1 --master=192.168.12.223 --install-directory=/user/app/tungsten/mysql1 --datasource-mysql-conf=/user/data/mysql_data/my-3306.cnf --replication-user=stats --replication-password=stats_dh5 --enable-heterogenous-master=true --net-ssh-option=port=20460 --property=replicator.filter.pkey.addColumnsToDeletes=true --property=replicator.filter.pkey.addPkeyToInserts=true
mysql1/tungsten/cluster-home/bin/startall
到hadoop的机器上,,进入到tungsten-replicator目录下执行,并且启动tungsten,可以使用trepctl thl 等命令查看服务的状态
./tools/tpm install hadoop1 --batch-enabled=true --batch-load-language=js --batch-load-template=hadoop --datasource-type=file --install-directory=/user/app/tungsten/hadoop1 --java-file-encoding=UTF8 --java-user-timezone=GMT --master=192.168.12.223 --members=192.168.12.221 --property=replicator.datasource.applier.csvType=hive --property=replicator.stage.q-to-dbms.blockCommitInterval=1s --property=replicator.stage.q-to-dbms.blockCommitRowCount=1000 --skip-validation-check=DatasourceDBPort --skip-validation-check=DirectDatasourceDBPort --skip-validation-check=HostsFileCheck --skip-validation-check=InstallerMasterSlaveCheck --skip-validation-check=ReplicationServicePipelines --rmi-port=25550
可以在hadoop的文件系统上,查看对应的目录下是否生成了mysql对应的库。如下所示:
└── user ...... ...... └── tungsten └── staging └── hadoop1 └── db1 ├── x1 │ ├── x1-14.csv │ └── x1-3.csv └── x2 ├── x2-115.csv ├── x2-15.csv ├── x2-16.csv ├── x2-17.csv └── x2-18.csv
最后还需要将staging的数据merge到hive中,建立hive的表结构,并且让数据能够被hive查询,这里使用continuent-tools-hadoop工具里面的load-reduce-check脚本,在使用之前,先需要配置好hive的环境变量,并且启动hiveservice在10000端口上。拷贝如下的jar包到bristlecone的lib-ext目录
cp -v /user/app/hive/apache-hive-0.13.1-bin/lib/hive-jdbc-0.13.1.jar /user/app/tungsten/hadoop1/tungsten/bristlecone/lib-ext/ cp -v /user/app/hive/apache-hive-0.13.1-bin/lib/hive-exec-0.13.1.jar /user/app/tungsten/hadoop1/tungsten/bristlecone/lib-ext/ cp -v /user/app/hive/apache-hive-0.13.1-bin/lib/hive-service-0.13.1.jar /user/app/tungsten/hadoop1/tungsten/bristlecone/lib-ext/ cp -v /user/app/hive/apache-hive-0.13.1-bin/lib/httpclient-4.2.5.jar /user/app/tungsten/hadoop1/tungsten/bristlecone/lib-ext/ cp -v /user/app/hive/apache-hive-0.13.1-bin/lib/commons-httpclient-3.0.1.jar /user/app/tungsten/hadoop1/tungsten/bristlecone/lib-ext/ cp -v /user/app/hive/apache-hive-0.13.1-bin/lib/httpcore-4.2.5.jar /user/app/tungsten/hadoop1/tungsten/bristlecone/lib-ext/ cp -v /user/app/hadoop/hadoop-2.4.0-onenode/share/hadoop/common/hadoop-common-2.4.0.jar /user/app/tungsten/hadoop1/tungsten/bristlecone/lib-ext/ cp -v /user/app/hadoop/hadoop-2.4.0-onenode/share/hadoop/common/lib/slf4j-* /user/app/tungsten/hadoop1/tungsten/bristlecone/lib-ext/
然后执行如下的命令:
第一次,或者以后增加了表,或者表结构发生了变化 ./bin/load-reduce-check -v -U jdbc:mysql:thin://192.168.12.223:3306/ -u stats -p stats_dh5 --schema db1 --service=hadoop1 -r /user/app/tungsten/hadoop1 --no-compare 如果表结构没有发生变化,只需要重新装载数据的话,可以执行如下的命令 ./bin/load-reduce-check -v -U jdbc:mysql:thin://192.168.12.223:3306/ -u stats -p stats_dh5 --schema db1 --service=hadoop1 -r /user/app/tungsten/hadoop1 --no-base-ddl --no-staging-ddl --no-meta 只想比较数据,不过貌似compare很卡 ./bin/load-reduce-check -v -U jdbc:mysql:thin://192.168.12.223:3306/ -u stats -p stats_dh5 --schema db1 --service=hadoop1 -r /user/app/tungsten/hadoop1 --no-base-ddl --no-staging-ddl --no-meta --no-materialize
- 参考
tungsten-replicator-3.0.pdf 中的 3.4. Deploying MySQL to Hadoop Replication
https://github.com/continuent/continuent-tools-hadoop