spark使用GeoIP2离线批量将ip转换出国家

离线批量数据,频繁请求接口匹配国家,不太合适,这里使用离线库方式。
GeoIP2下载: https://dev.maxmind.com/geoip/geoip2/downloadable/
本次使用库,下载地址 :https://download.csdn.net/download/qq_36470898/16103168

由于需要定时任务执行,我把库上传到hdfs,并通过mapPartitions 方式匹配出国家

依赖:

   <dependency>
            <groupId>com.maxmind.geoip2</groupId>
            <artifactId>geoip2</artifactId>
            <version>2.14.0</version>
   </dependency>

代码

package com.sm.test

import java.io.InputStream
import java.net.InetAddress
import com.maxmind.db.CHMCache
import com.maxmind.geoip2.DatabaseReader
import com.sm.common.constants.Constants
import com.sm.utils.SparkUtil
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.{FileSystem, Path}
import org.apache.log4j.{Level, Logger}
import org.slf4j.LoggerFactory

object TestGeolite2 {
  private var logger: org.slf4j.Logger = _
  private val fs = FileSystem.get(new Configuration())
  def main(args: Array[String]): Unit = {
    logger = LoggerFactory.getLogger(this.getClass.getSimpleName)
    Logger.getLogger("org.apache.hadoop").setLevel(Level.WARN)
    Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
    Logger.getLogger("org.spark_project.jetty").setLevel(Level.WARN)
    val start = System.currentTimeMillis()
    val spark = SparkUtil.getSparkSession(this.getClass.getSimpleName, Constants.SPARK_LOCAL_MODE)  // 初始化spark
    import spark.implicits._
    import spark.sql
    val ds = sql("select * from hw_data.ods_cp_hw_role_pay where date = '2021-03-11' limit 40")  //读取hive表

    val dff = ds.mapPartitions(
      t => {
        val url = "hdfs://BigdataCluster/flink/user-libs/GeoLite2-City_2021-02-04.mmdb"  // hdfs 地址
        val geoDbInputStream: InputStream = fs.open(new Path(url))
        val geoIPResolver = new DatabaseReader.Builder(geoDbInputStream).withCache(new CHMCache()).build()
        t.map {
          item => {
            val ipStr = item.getAs("ip").toString   // 获取ip字段值
            var country = ""
            try {
              val inetAddress = InetAddress.getByName(ipStr)
              val geoResponse = geoIPResolver.city(inetAddress)
              country = geoResponse.getCountry.getIsoCode
            } catch {
              case e: Exception => e.printStackTrace()
            }
            (ipStr, country)
          }
        }
      }
    ).toDF("ip", "country")
    dff.show(40)
    spark.stop()
    val end = System.currentTimeMillis()
    logger.warn(s"=================== 耗时: ${(end - start) / 1000} 秒 ===================")
  }
}

效果
在这里插入图片描述

到这里就批量将ip转换成国家,希望对你有帮助

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在ThinkPHP项目中使用GeoIP2来实现限制请求IP只能巴西访问,你可以按照以下步骤进行配置: 1. 安装GeoIP2依赖包:在命令行中,进入你的ThinkPHP项目目录,然后运行以下命令来安装GeoIP2依赖包: ```shell composer require geoip2/geoip2:~2.0 ``` 2. 下载GeoIP2数据库:访问MaxMind网站(https://dev.maxmind.com/geoip/geoip2/geolite2/),下载GeoIP2数据库文件(通常是以.mmdb扩展名结尾的文件)。 3. 将GeoIP2数据库文件放置在项目的合适位置,例如`public`文件夹下的`geoip`文件夹。 4. 在ThinkPHP项目中创建一个新的中间件(Middleware),用于检查请求IP是否为巴西的IP。在命令行中,进入你的ThinkPHP项目目录,然后运行以下命令来创建中间件: ```shell php think make:middleware BrazilIPCheck ``` 5. 编辑刚创建的中间件文件:在`app/middleware`目录下找到并打开`BrazilIPCheck.php`文件。 6. 在`handle`方法中,添加以下代码来检查请求IP是否为巴西的IP: ```php use GeoIp2\Database\Reader; public function handle($request, \Closure $next) { $ip = $request->ip(); // 加载GeoIP2数据库 $databasePath = public_path('geoip/GeoLite2-Country.mmdb'); $reader = new Reader($databasePath); try { // 获取请求IP国家信息 $record = $reader->country($ip); $countryCode = $record->country->isoCode; // 如果不是巴西的IP,则返回403 Forbidden 错误 if ($countryCode !== 'BR') { return response('403 Forbidden', 403); } } catch (\Exception $e) { // 处理数据库加载或查询错误 return response('500 Internal Server Error', 500); } return $next($request); } ``` 7. 保存并关闭`BrazilIPCheck.php`文件。 8. 在`app/middleware`目录下的`middleware.php`文件中,注册刚创建的中间件: ```php return [ // ... \app\middleware\BrazilIPCheck::class, // ... ]; ``` 9. 现在,所有请求将通过中间件进行处理,如果请求IP不是巴西的IP,将返回403 Forbidden 错误。 请注意,以上步骤仅适用于限制请求IP只能巴西访问。如果需要更复杂的访问控制和安全性,建议结合其他认证和授权机制来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值