前言:在工作中遇到的问题,由于网上几乎没有相关文章,所以记录下来。感谢 博客[1] 中的作者
@tcahill提供了宝贵经验。
环境: emr-6.3.0 solr-8.6.0
根据 [1] 中的描述得知 Solr 自带了 hadoop 相关 jar 包。由于 EMR 中的 hadoop jar 包是针对 AWS 优化过的,所以我们使用 EMR 自带的 hadoop jar 。
(以下操作均在 master 节点执行)
一、 将 Solr 自带的 hadoop 相关 jar 包删除;rm -rf ~./solr-8.6.0/server/solr-webapp/webapp/WEB-INF/lib/hadoop*
二、 将 EMR 中 /usr/lib/hadoop/ 下的 hadoop-annotations-3.2.1-amzn-3.jar hadoop-auth-3.2.1-amzn-3.jar hadoop-aws-3.2.1-amzn-3.jar hadoop-common-3.2.1-amzn-3.jar 拷贝到 Solr lib 下;
cp /usr/lib/hadoop/hadoop-annotations-3.2.1-amzn-3.jar ~./solr-8.6.0/server/solr-webapp/webapp/WEB-INF/lib/ cp /usr/lib/hadoop/hadoop-auth-3.2.1-amzn-3.jar ~./solr-8.6.0/server/solr-webapp/webapp/WEB-INF/lib/ cp /usr/lib/hadoop/hadoop-aws-3.2.1-amzn-3.jar ~./solr-8.6.0/server/solr-webapp/webapp/WEB-INF/lib/ cp /usr/lib/hadoop/hadoop-common-3.2.1-amzn-3.jar ~./solr-8.6.0/server/solr-webapp/webapp/WEB-INF/lib/
三、 将 EMR 中 /usr/lib/hadoop-hdfs/ 下的 hadoop-hdfs-3.2.1-amzn-3.jar hadoop-hdfs-client-3.2.1-amzn-3.jar拷贝到 Solr lib 下;;
cp /usr/lib/hadoop-hdfs/hadoop-hdfs-3.2.1-amzn-3.jar ~./solr-8.6.0/server/solr-webapp/webapp/WEB-INF/lib/ (可有可无) cp /usr/lib/hadoop-hdfs/hadoop-hdfs-client-3.2.1-amzn-3.jar ~./solr-8.6.0/server/solr-webapp/webapp/WEB-INF/lib/ (必须)
四、 根据 [2] 中的指引"S3A depends upon two JARs, alongside hadoop-common and its dependencies.",hadoop 使用 S3 还需要 aws-java-sdk-bundle ,所以同样我们将这个包也拷贝到 Solr lib 下;
cp /usr/share/aws/aws-java-sdk/aws-java-sdk-bundle-1.11.977.jar ~./solr-8.6.0/server/solr-webapp/webapp/WEB-INF/lib/
五、 EMR 中对 HDFS 的实现做了新的优化,即 EMRFS [3] 。所以我们需要将 EMRFS 相关 jar 也放在 Solr lib 下;
cp /usr/share/aws/emr/emrfs/lib/* ~./solr-8.6.0/server/solr-webapp/webapp/WEB-INF/lib/ rm ~./solr-8.6.0/server/solr-webapp/webapp/WEB-INF/lib/slf4j-api-1.7.21.jar
(请注意这里不可以将 emrfs/lib 内的 slf4j-api-1.7.21.jar 拷过去,会发生 jar 包冲突,导致 Solr Server 无法正常启动)
六、 至此,Solr 所需的 jar 包环境已经准备完毕。根据 [2] 中的指引“S3 Buckets are hosted in different “regions”, the default being “US-East”. The S3A client talks to this region by default, issuing HTTP requests to the server s3.amazonaws.com .” 这句话代表在默认情况下 S3A 的请求会发往 Global Region,所以我们需要为 S3A 指定 Region;
参考 [4] 中的指引,为 core-site.xml 增加两条配置(这里以指定北京区为例):
{"classification":"core-site", "properties":{"fs.s3a.endpoint.region":"cn-north-1", "fs.s3a.endpoint":"s3.cn-north-1.amazonaws.com.cn "}
在执行完第六步后请增加如下操作:
[hadoop@ip-10-0-13-246 solr-8.6.0]$ sudo mkdir /etc/solr [hadoop@ip-10-0-13-246 solr-8.6.0]$ sudo mkdir /etc/solr/conf [hadoop@ip-10-0-13-246 solr-8.6.0]$ sudo cp /etc/hadoop/conf/* /etc/solr/conf/ [hadoop@ip-10-0-13-246 solr-8.6.0]$ sudo cp /usr/share/aws/emr/emrfs/conf/* /etc/solr/conf/
这里增加了 emrfs 在 EMR 上默认的配置文件。这些配置文件对 EMRFS 做了优化。 您可以使用 -Dsolr.hdfs.confdir=/etc/solr/conf 来指定让 solr 使用这里的配置。
七、 至此,Running Solr on S3 的全部修改已完成。
以下是根据 Solr 文档中的入门练习 [5] 验证是否可以 Work :1. 启动 on s3 的 solr cloud ;
bin/solr start -e cloud -Dsolr.directoryFactory=HdfsDirectoryFactory -Dsolr.lock.type=hdfs -Dsolr.hdfs.home=s3a://YourBucketName/YourSolrHomeDirName -Dsolr.hdfs.confdir=/etc/solr/conf
2. 根据 [5] 中的指引创建名为 techproducts 的 collection ;
3. 加载官方示例数据;
/home/hadoop/solr-8.6.0/bin/post -c techproducts example/exampledocs/*
4. 访问 http://host:8983/solr 查看数据,成功查询到示例数据。查询结果如图:
5. 查看 S3 Solr 工作目录:
![]()
[1] https://community.sw.siemens.com/s/question/0D54O000061xk9aSAA/running-solr-on-s3
[2] https://hadoop.apache.org/docs/stable/hadoop-aws/tools/hadoop-aws/index.html
[3] https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-fs.html
[4] https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-configure-apps-running-cluster.html#emr-configure-apps-running-cluster-console
[5] https://solr.apache.org/guide/8_6/solr-tutorial.html#exercise-1